首页/文章/前端工具

以Babel为例,讲述插件的机制

2024-05-08
1282 字约 5 分钟
...

Babel 是一个 JavaScript 编译器​

Babel 是一个工具链,主要用于将采用 ECMAScript 2015+ 语法编写的代码转换为向后兼容的 JavaScript 语法,以便能够运行在当前和旧版本的浏览器或其他环境中。下面列出的是 Babel 能为你做的事情:

  • 语法转换
  • 通过 Polyfill 方式在目标环境中添加缺失的功能(通过引入第三方 polyfill 模块,例如 core-js)
  • 源码转换(codemods)

Babel 和 AST 的关系

  • 核心关系:Babel 通过生成和操作 AST 来实现代码的转换和编译。AST 作为 Babel 处理代码的中间表示,是 Babel 工作流程中不可或缺的一部分。
  • 插件系统:Babel 的强大之处在于其插件系统,这些插件通过分析和修改 AST 来实现具体的语法转换和优化。开发者可以根据需要选择或创建插件,以支持新的语言特性或实现特定的编译任务。

AST 抽象语法树定义 

webpack和Vite等很多的工具和库的核心都是通过Abstract Syntax Tree抽象语法树这个概念来实现对代码的检查、分析等操作的,这些工具的原理都是通过JavaScript Parser把代码转化为一颗抽象语法树(AST),这颗树定义了代码的结构,通过操纵这颗树,我们可以精准的定位到声明语句、赋值语句、运算语句等等,实现对代码的分析、优化、变更等操作

在计算机科学中,抽象语法树(abstract syntax tree或者缩写为AST),或者语法树(syntax tree),是源代码的抽象语法结构的树状表现形式,这里特指编程语言的源代码。

Javascript的语法是为了给开发者更好的编程而设计的,但是不适合程序的理解。所以需要转化为AST来使之更适合程序分析,浏览器编译器一般会把源码转化为AST来进行进一步的分析等其他操作。

抽象语法树用途 

  • 代码语法的检查、代码风格的检查、代码的格式化、代码的高亮、代码错误提示、代码自动补全等等
    • 如JSLint、JSHint对代码错误或风格的检查,发现一些潜在的错误
    • IDE的错误提示、格式化、高亮、自动补全等等
  • 代码混淆压缩
    • UglifyJS2等
  • 优化变更代码,改变代码结构使达到想要的结构
    • 代码打包工具webpack、rollup等等
    • CommonJS、AMD、CMD、UMD等代码规范之间的转化
    • CoffeeScript、TypeScript、JSX等转化为原生Javascript

3.babel插件

  • 访问者模式Visitor 对于某个对象或者一组对象,不同的访问者,产生的结果不同,执行操作也不同
  • @babel/core Babel 的编译器,核心 API 都在这里面,比如常见的 transform、parse
  • [@babel/parser] Babel 的解析器
  • babel-types 用于 AST 节点的 Lodash 式工具库, 它包含了构造、验证以及变换 AST 节点的方法,对编写处理 AST 逻辑非常有用
  • babel-traverse用于对 AST 的遍历,维护了整棵树的状态,并且负责替换、移除和添加节点
  • babel-types-api
  • Babel 插件手册
  • babeljs.io babel可视化编译器

转换箭头函数 

转换前

const sum = (a,b)=>a+b

转换后

var sum = function sum(a, b) {
  return a + b;
};

let babel = require('@babel/core');
let t = require('babel-types');
const code = `const sum = (a,b)=>a+b`;
let transformArrowFunctions = {
    visitor: {
        ArrowFunctionExpression: (path) => {
            let node = path.node;
            let id = path.parent.id;
            let params = node.params;
            let body=t.blockStatement([
                t.returnStatement(node.body)
            ]);
            let functionExpression = t.functionExpression(id,params,body,false,false);
            path.replaceWith(functionExpression);
        }
    }
}
const result = babel.transform(code, {
    plugins: [transformArrowFunctions]
});
console.log(result.code);

Babel 在真实项目中遇到的问题有哪些 ?

{
  test: /\.js$/, 
  exclude: /node_modules/, 
  use: {
    loader: 'babel-loader', 
    options: {
      cacheDirectory: true, 
      presets: [ 
        '@babel/preset-env', 
        {
          useBuiltIns: 'usage', 
          corejs: 3, 
          targets: { 
            chrome: '49', 
          },
        },
        '@babel/preset-react', 
        '@babel/preset-typescript', 
      ],
      plugins: [ 
        '@babel/plugin-proposal-nullish-coalescing-operator', 
        '@babel/plugin-transform-optional-chaining', 
      ],
    },
  },
}

如果您觉得这篇文章有帮助,请点个赞吧~

分享文章

相关文章

更多文章 →
前端工具2024-05-07
实现自定义脚手架
首先,每次创建项目后都需要很多重复性操作,比如安装UI库、css预处理器。在业务层面,每次也要添加一些必备的功能,比如登录、404页面等。其次,可以锻炼自己的技术。 脚手架创建项目的流程: 1. 让用户选择模板; 2. 根据用户输入填充模板; 3. 下载模板文件到创建的新文件夹中; 从框架来看,创建项目的时候需要选择是vue框架还是react框架,以及是否需要添加 typescript。 从插件来看,需要安装UI库、CSS预处理器、路由...
学习
前端工具2024-05-07
搭建前端脚手架
需求: 公司里前端初始项目有多个比如: 管理系统、electron、h5... 每次新项目都需要去找仓库里对应的基建代码?于是准备自搭一个脚手架,实现新项目时直接使用脚手架创建对应项目的模板。 采用monorepo的模式来管理脚手架、在这里只提供核心代码实现,废话不多说开干!开干! 1、初始化项目 2、修改package内容 3、使用第三方包解析交互命令 使用prompts来解析命令,实现目标如通过 创建项目,如图: 在 文件中 使用...
学习
前端工具2023-12-27
汇总前端脚手架开发中常用的第三方库
在前端工程化方面我们使用的各种工具,绝大部分都是使用 写的。 比如,打包工具 webpack 及 rollup;前端框架 Vue 自带的脚手架工具 vue cli;以及 CSS 样式工具scss、less等等。 在日常工作中难免会遇到一些需求,需要自己创建一个脚手架工具来提升整个团队的研发部署效率。 目前,npm上汇集了大量优秀的开发脚手架的第三库,熟练掌握这些库,可以大大提升我们的开发效率。本文将介绍一些在开发前端脚手架方面非常常用的...
学习
前端工具2023-09-21
面试官:”Vite为什么快?“
面试官:”Vite为什么快?“ 阅读8分钟 前面一篇文章介绍了如何做 Vite 的插件开发 ,这篇文章介绍清晰 Vite 的构建原理,为什么比 Webpack 构建速度快这么多。 1\. 一句话解释 Webpack 的构建原理 前端之所有需要 类似于 Webpack 这样的构建工具,是为了提高项目的开发效率,Webpack 通过分析js中的 require 语句,分析出当前 js 文件所有的依赖文件,通过递归的方式层层分析后,得到整个项...
学习
http-网络2026-10-15
OAuth 2.0是什么,以及如何正确接入
一、先从一个需求理解 OAuth 2.0 假设你开发了一个相册整理工具,用户希望它读取某个云盘里的照片。 把云盘密码交给工具,会带来几个问题:工具拿到的权限太大,密码可能泄漏,用户也难以只撤销这个工具的访问。 OAuth 2.0 提供一套 委托授权机制 :用户在云盘自己的页面确认授权,工具取得一个有权限范围和有效期的访问令牌,再用它调用云盘 API。用户的云盘密码不交给工具。 可以把它理解为:给工具一张“限定用途的通行证”。但令牌泄漏同...
学习
前端2026-10-15
前端动画全景指南
一、前端动画到底是什么 前端动画,就是让画面随时间、用户输入或页面状态连续变化。变化的对象可以是按钮的位置、弹窗的透明度、SVG 的线条、Canvas 里的粒子,也可以是三维场景中的镜头。 先把三个问题分开: | 问题 | 常见答案 | | | | | 画什么? | DOM/CSS、SVG、Canvas 2D、GPU 渲染的场景、预制动画素材 | | 怎样变化? | CSS 过渡/关键帧、Web Animations API、逐帧计算、...
学习

评论

请登录后发表评论

去登录
加载评论中...

目录