babel是js的编译器
注意很重要的一点就是,Babel
只是转译新标准引入的语法,比如:
- 箭头函数
- let / const
- 解构
哪些在 Babel 范围外?对于新标准引入的全局变量、部分原生对象新增的原型链上的方法,Babel 表示超纲了。
- 全局变量
- Promise
- Symbol
- WeakMap
- Set
- includes
- generator 函数
对于上面的这些 API,Babel
是不会转译的,需要引入 polyfill
来解决,如:
// 安装babel-polyfill "babel-polyfill": "^6.26.0", // webpack.config.js entry: { app: ['babel-polyfill', './src/main.js'] }
Babel 的编译过程和大多数其他语言的编译器相似,可以分为三个阶段:
解析(Parsing):将代码字符串解析成抽象语法树;
转换(Transformation):对抽象语法树进行转换操作;
生成(Code Generation): 根据变换后的抽象语法树再生成代码字符串;
一般来说,Parse
阶段可以细分为两个阶段:词法分析(Lexical Analysis, LA)和语法分析(Syntactic Analysis, SA)。
词法分析之后,代码就已经变成了一个 Tokens
数组了,现在需要通过语法分析把 Tokens
转化为上面提到的抽象语法树。