Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

2021/02/22 - Babel是什么,原理是什么,实现语法转换的过程 #52

Open
lxinr opened this issue Feb 22, 2021 · 0 comments
Open
Labels

Comments

@lxinr
Copy link
Owner

lxinr commented Feb 22, 2021

Babel 是一个 JavaScript 编译器。它可以把各类版本的js代码编译成使用者所需要的版本

原理

1613986309529.jpeg

1. 解析

解析步骤接收代码并输出 AST。 这个步骤分为两个阶段:词法分析(Lexical Analysis) 和 语法分析(Syntactic Analysis)

1、词法分析

词法分析即分词,意思就是将一行行的代码分解成一个个token

const msg = '词词词'
// 词法分析将该语句分成四个部分
// const -> 关键字 msg -> 变量名 = -> 赋值 '词词词' -> 字符串
2、语法分析

语法分析阶段,将生成的这些 token 数据,根据一定的语法规则转化为AST

总结来看,解析过程为

code(字符串形式代码) -> tokens(令牌流) -> AST(抽象语法树)

Babel 使用 @babel/parser 解析代码,输入的 js 代码字符串根据 ESTree 规范生成 AST(抽象语法树)

2. 转换

转换步骤接收 AST 并对其进行遍历,在此过程中对节点进行添加、更新及移除等操作。 这是 Babel 或是其他编译器中最复杂的过程。

Babel提供了@babel/traverse(遍历)方法维护这AST树的整体状态,并且可完成对其的替换,删除或者增加节点,这个方法的参数为原始AST和自定义的转换规则,返回结果为转换后的AST

3. 生成

代码生成步骤把最终(经过一系列转换之后)的 AST 转换成字符串形式的代码,同时还会创建源码映射(source maps)。

代码生成其实很简单:深度优先遍历整个 AST,然后构建可以表示转换后代码的字符串。

Babel使用 @babel/generator 将修改后的 AST 转换成代码,生成过程可以对是否压缩以及是否删除注释等进行配置,并且支持 sourceMap

1613986694879.jpeg

参考:

[实践系列]Babel原理

@lxinr lxinr added the JS基础 label Feb 22, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant