当前位置: 首页 > article >正文

从一个webpack loader中学习

chalk:给终端输出加一些自定义的样式
loader-utils:webpack的loader配置中会通过options传入一些用户自定义参数,就可以通过该包提供的getoptions()获取

在这里插入图片描述

node-fetch:Node.js的模块,用于从远程服务器获取数据
关于babel,它是JS的编译器,主要用于将js转译为浏览器可以执行的代码,兼容各种浏览器等,最常见的就是将ES6转译为ES5(浏览器只能识别并执行es5的代码)

借鉴文章
Babel 编译代码的过程可分为三个阶段:解析(parsing)(@babel/parser)、转换(transforming)(@babel/parser)、生成(generating)(@babel/parser)

  1. @babel/traverse:用来自动遍历抽象语法树(AST)的工具
traverse(ast, {
	// 对语法树中特定的节点进行操作
    VariableDeclarator(path: NodePath) {
      // 指向当前 AST 节点
      const node = path.node;
      const { id, init } = node;
      if (id.name === '$$$' && datas && typeof datas === 'object') {
        const { properties } = init;
        const newProps = genObjectProperties(datas);
        init.properties = properties.concat(newProps);
      }
    }
  } as Visitor);
  1. @babel/parser:将源代码解析成AST
  2. @babel/generator:将AST 解码成js代码
函数返回值类型为t.ObjectProperty()和t.objectExpression,什么意思?

t.objectProperty() // 创建一个对象
t.objectExpression() // 创建一个对象表达式

import * as t from '@babel/types';

function genObjectProperties(svgIcons: ISvgIcons): t.ObjectProperty[] {
  return Object.keys(svgIcons || {}).map((item) => {
    return t.objectProperty(
    	t.stringLiteral(item), // 创建一个字符串字面量
    	genIconProperties(svgIcons[item])
    );
  });
}

function genIconProperties(iconInfo: IIconInfo): t.ObjectExpression {
  // 创建对象表达式
  return t.objectExpression(Object.keys(iconInfo || {}).map((item) => {
    return t.objectProperty(t.stringLiteral(item), t.stringLiteral(iconInfo[item].toString()));
  }));
}

可借鉴该文章辅助理解


http://www.kler.cn/a/106538.html

相关文章:

  • Nginx 上安装 SSL 证书并启用 HTTPS 访问
  • 蓝桥杯每日真题 - 第14天
  • # 第20章 Cortex-M4-触摸屏
  • CSS Module:告别类名冲突,拥抱模块化样式(5)
  • 【因果分析方法】MATLAB计算Liang-Kleeman信息流
  • 华为云前台展示公网访问需要购买EIP,EIP流量走向
  • CloudQuery + StarRocks:打造高效、安全的数据库管控新模式
  • ZooKeeper中节点的操作命令(查看、创建、删除节点)
  • 【Javascript】ajax(阿甲克斯)
  • Elasticsearch打分机制
  • mysql主从搭建(gtid)
  • 《动手学深度学习 Pytorch版》 10.7 Transformer
  • 一篇了解springboot3请求参数种类及接口测试
  • goland无法调试问题解决
  • 基于单片机的数字电压表设计
  • “从部署到优化,打造高效会议管理系统“
  • FreeSWITCH 使用指北(2)-多段音频顺序播放的设置
  • python操作MySQL、SQL注入问题、视图、触发器、事务、存储过程、函数、流程控制、索引(重点)
  • Android笔记(八):基于CameraX库结合Compose和传统视图组件PreviewView实现照相机画面预览和照相功能
  • 图神经网络论文笔记(一)——北邮:基于学习解纠缠因果子结构的图神经网络去偏
  • 基于SpringBoot+SSM苍穹外卖之实战项目
  • C++并发与多线程(6) | 传递临时对象作为线程参数的一些问题Ⅲ
  • 鼎鑫鸿鄴引入“能源互联网+”理念 打造共赢
  • Redis桌面管理工具:Redis Desktop Manager for Mac
  • 非遗主题网站的设计与实现基于PHP实现
  • C语言 每日一题 PTA 10.27 day5