← 返回目录

第 24 卷

第 24 / 26 卷日期:

4//通过@babel/plugin-transform-arrow-functions转译后(ES5语法)
5var add = function add(a, b) {
6return a + b;
7};

常见转译插件: @babel/plugin-transform-arrow-functions(箭头函数)、 @babel/plugin-transform-destructuring(解构赋值)、 @babel/plugin-

transform-classes(class 语法)等。

(2)polyfill(补丁)

核心作用:补充 ES6+ 新增的内置对象和方法(API),解决“API 缺失”问题。例如 Promise、 Array.prototype.includes、 Object.assign、 Map/Set 等,这些是“API 层面”的新

增特性,旧浏览器中不存在这些对象或方法,仅靠语法转译无法解决。

示例:

Code block

1// 原始 ES6 代码(使用 Promise API)

2new Promise((resolve) => resolve(1)).then(console.log);

3

4//仅转译语法(箭头函数)后,IE11仍会报错(Promise未定义)
5//需要polyfill补充Promise:
6if (typeof Promise === "undefined") {
7window.Promise = require("core-js/modules/es.promise.js");
8}

当前主流的 polyfill 方案: core-js@3(Babel 官方推荐,替代旧版 @babel/polyfill),可按需补充所需 API。

  1. 核心区别总结

对比维度transform-plugins(转译插polyfill(补丁)

件)

解决问题语法不兼容(旧浏览器无法识API 缺失(旧浏览器没有别 ES6+ 语法)ES6+ 新增的对象/方法)

体积影响仅修改语法结构,体积变化较按需补充时体积可控,全量补
小充时体积较大
配置方式配置在 plugins 数组,或通通过 corejs 配置,结合
过 preset-env 自动引入useBuiltIns: "usage" 按需引

入

示例场景let/const → var、箭头函数新增 Promise、

  • 普通函数Array.prototype.flat
  1. 协同工作示例

一段包含 ES6+ 语法和 API 的代码,需要转译插件和 polyfill 共同处理:

Code block

1//原始ES6+代码(包含箭头函数语法+ Promise API)
2const fetchData = () => new Promise((resolve) => resolve("data"));
3fetchData().then(console.log);

处理流程:

  1. 转译插件(如 @babel/plugin-transform-arrow-functions)将箭头函数转为普通函数(语法转

译)。

  1. polyfill(core-js@3)补充 Promise API(API 补充)。

最终兼容 ES5 的代码:

Code block

1// 转译 + polyfill 后 2import "core-js/modules/es.promise.js"; // 按需引入 Promise polyfill

3

4var fetchData = function fetchData() {
5return new Promise(function (resolve) {
6resolve("data");
7});
8};
9fetchData().then(console.log);

码”的桥梁。

  1. Babel 编译流程与 AST 的关系

Babel 的编译过程分为三个核心步骤,每个步骤都依赖 AST 实现:

(1)步骤1:解析(Parse)→ 生成 AST

核心任务:将原始的 ES6+ 代码字符串解析为 AST,拆解代码的语法结构(如函数、变量、表达式、语句等)。

实现工具: @babel/parser(原 babylon),支持 ES6+、JSX、TypeScript 等语法的解析。解析过程分为两个阶段:

• 词法分析(Lexical Analysis):将代码字符串拆分为最小的语法单元(token),如关键字

(let、const)、标识符(变量名)、运算符(+、=)、标点符号({}、())等。

• 语法分析(Syntactic Analysis):根据语法规则,将 token 组合为结构化的 AST 节点(如

VariableDeclaration、ArrowFunctionExpression、CallExpression 等),并建立节点间的层级关系(如函数包含变量声明,变量声明包含标识符)。

示例:原始代码 const add = (a, b) => a + b; 解析后生成的 AST 简化结构:

Code block

1{ 2"type": "Program", // 根节点:程序

3"body": [ 4{

5"type": "VariableDeclaration", // 变量声明节点 6"kind": "const", // 声明类型:const

7"declarations": [ 8{

9"type": "VariableDeclarator", //变量声明符
10"id": { "type": "Identifier", "name": "add" }, //变量名:add
11"init": {
12"type": "ArrowFunctionExpression", //箭头函数表达式
13"params": [ //参数
14{ "type": "Identifier", "name": "a" },
15{ "type": "Identifier", "name": "b" }
16],
17"body": { //函数体
18"type": "BinaryExpression", //二元表达式(a + b)
全站分卷索引 · 26 卷
  1. 1第 1 卷
  2. 2第 2 卷
  3. 3第 3 卷
  4. 4第 4 卷
  5. 5第 5 卷
  6. 6第 6 卷
  7. 7第 7 卷
  8. 8第 8 卷
  9. 9第 9 卷
  10. 10第 10 卷
  11. 11第 11 卷
  12. 12第 12 卷
  13. 13第 13 卷
  14. 14第 14 卷
  15. 15第 15 卷
  16. 16第 16 卷
  17. 17第 17 卷
  18. 18第 18 卷
  19. 19第 19 卷
  20. 20第 20 卷
  21. 21第 21 卷
  22. 22第 22 卷
  23. 23第 23 卷
  24. 24第 24 卷
  25. 25第 25 卷
  26. 26第 26 卷