0
点赞
收藏
分享

微信扫一扫

babel

大漠雪关山月 2022-01-26 阅读 71

1.什么是babel

babel是一个javascript编译器,主要用于将采用ECMAScript2015+语法编写的代码转换为向后兼容的javascript语法,以便能够运行在当前和旧版本的浏览器或其他环境中。

// Babel 输入: ES2015 箭头函数
[1, 2, 3].map(n => n + 1);

// Babel 输出: ES5 语法实现的同等功能
[1, 2, 3].map(function(n) {
  return n + 1;
});

2.抽象语法树(AST)

要了解Babel的工作原理,那首先需要了解抽象语法树,因为Babel插件就是作用于抽象语法树。

首先我们编写的代码在编译阶段解析成抽象语法树(AST),然后经过一系列的遍历和转换,然后再将转换后的抽象语法树生成为常规的js代码。
在这里插入图片描述
代码解析成AST的目的就是方便计算机更好地理解我们的代码(在线转换:https://astexplorer.net/)

let a=1

形成的json:

{
  "type": "Program",
  "start": 0,
  "end": 7,
  "body": [
    {
      "type": "VariableDeclaration",
      "start": 0,
      "end": 7,
      "declarations": [
        {
          "type": "VariableDeclarator",
          "start": 4,
          "end": 7,
          "id": {
            "type": "Identifier",
            "start": 4,
            "end": 5,
            "name": "a"
          },
          "init": {
            "type": "Literal",
            "start": 6,
            "end": 7,
            "value": 1,
            "raw": "1"
          }
        }
      ],
      "kind": "let"
    }
  ],
  "sourceType": "module"
}

3.babel的工作流程

Babel 的三个主要处理步骤分别是: 解析(parse),转换(transform),生成(generate)。

解析

将代码解析成抽象语法树(AST),每个js引擎都有自己的AST解析器。解析过程中有两个阶段: 词法分析和语法分析。

词法分析阶段把字符串形式的代码转换为令牌(tokens)流,令牌类似于AST中节点;

语法分析阶段则会把一个令牌流转换成 AST的形式,同时这个阶段会把令牌中的信息转换成AST的表述结构。

转换

Babel接受得到AST并通过babel-traverse对其进行深度优先遍历,在此过程中对节点进行添加、更新及移除操作。
这部分也是Babel插件介入工作的部分。

生成

将经过转换的AST通过babel-generator再转换成js代码,过程就是深度优先遍历整个AST,然后构建可以表示转换后代码的字符串。

(待更新)

举报

相关推荐

0 条评论