Open
Description
Study
一、Babel是什么
- Babel is a JavaScript compiler.
- Use next generation JavaScript, today。Beyond!
是"源码到源码"的编译器。
说人话
- 最初的工作就是把ES6+语法和API转成目标环境可以执行的语法(ES3,ES5);
- 后来强大到把各种形式的JS(Reat, TypeScript等)都转成目标环境可以执行的语法(ES3,ES5,ES6+);
- Beyond,反正可以通过操作AST语法树完成的工作都可以借助Babel完成。
- JS相关的优化(压缩等)工作
二、babel模块组织(version-7)
从v7开始,babel的所有模块都单独的定义在@babel
下面,可以单独使用各个模块。
模块也采用新的命名规则,详细见Upgrade to Babel 7
@babel/核心模块
@babel/preset-{预设名字}
可以简写@babel/{预设名字}
@babel/plugin-{插件名字}
可以简写@babel/{插件名字}
@babel/polyfill
babel/core
babel核心模块,转换工作的依赖的模块。所有babel的工作都离不开这个模块。
大胆猜测大概的功能:
- babel配置加载并初始化;
- 把源码转成AST;
- 调度管理plugins和presets操作AST;
- 把最终的AST转成源码,并输出到目标文件。
@babel/core
模块只是负责转换代码,作为dev deps
。
babel/cli
通过命名行使用babel编译文件,内部依赖@babel/core
。
polyfill
三、plugins
具体的转码工作由plugins完成的。
{
"plugins": ["@babel/plugin-transform-arrow-functions"]
}
语法插件和转换插件
- 语法插件
只是让babel能够解析特定类型的语法(即让Babel知道怎么生成对应的AST),但不做转换操作。 - 转换插件 = 语法插件 + 执行转换操作
plugins执行顺序
- 先于
presets
执行; - 由前到后一次执行。
各个plugin一般是互相独立的,都是完成具体某个的转换工作。所以由前到后依次执行。但是有些plugins(如类型属性和装饰器)可能是先后依赖的,注意他们的顺序。
自定义plugin ???
四、presets
预定义的一组plugin集合,方便书写配置。
presets执行顺序
- 后于
plugins
执行; - 由后到前依次执行(跟plugins执行顺序相反)。
原因:
presets
是具有语义环境的(es2015,es2016分表示ES的不同版本),一般是由依赖关系的。
书写的顺序符合人类的思维(由老到新),但是在转换的时候考虑到向后兼容,是由后到前依次执行。
env预设
代替之前各种ES版本的presets(es-2015,es-2016)。现在统一使用env表示各种版本ES(简化了ES的配置)。
五、配置
https://babeljs.io/docs/en/configuration
https://babeljs.io/docs/en/config-files#configuration-file-types
默认配置和显示的配置
-
默认配置
没有配置文件,命令行不指定配置 -
编程的方式
-
命令行参数方式
-
.babelrc,静态的JSON文件
在项目根目录(即package.json所在的目录)有这个文件就读取这个文件的配置,就不存在默认的配置了,必须显示的配置。 -
.babelrc.js
-
package.json
-
babel.config.js
七、 babel 能搞定一切吗?
Issues ?
- babel如何处理扩展名不是
js
文件的 ? - inde.jsx文件为啥没有输出?
-
Since Babel assumes that your code will run in an ES5 environment it uses ES5 functions
如何修改到ES3环境?
好文章
Next... 研究
Babel DOC 使用章节。Babel是个需要认知研究的工具,