bebel系列- 插件开发
我们知道 babel 的编译流程分为三步:parse、transform、generate,每一步都暴露了一些 api 出来。
- parse 阶段有
@babel/parser
,功能是把源码转成 AST - transform 阶段有
@babel/traverse
,可以遍历 AST,并调用 visitor 函数修改 AST,修改 AST 自然涉及到 AST 的判断、创建、修改等,这时候就需要@babel/types
了,当需要批量创建 AST 的时候可以使用@babel/template
来简化 AST 创建逻辑。 - generate 阶段会把 AST 打印为目标代码字符串,同时生成 sourcemap,需要
@babel/generator
包 - 中途遇到错误想打印代码位置的时候,使用
@babel/code-frame
包 - babel 的整体功能通过
@babel/core
提供,基于上面的包完成 babel 整体的编译流程,并实现插件功能。
我们主要学习的就是 @babel/parser
,@babel/traverse
,@babel/generator
,@babel/types
,@babel/template
这五个包的 api 的使用。
path
state
第二个参数 state 则是遍历过程中在不同节点之间传递数据的机制,插件会通过 state 传递 options 和 file 信息,我们也可以通过 state 存储一些遍历过程中的共享数据。
@babel/types
遍历 AST 的过程中需要创建一些 AST 和判断 AST 的类型,这时候就需要 @babel/types
包。
isXxx 会返回 boolean 表示结果,而 assertXxx 则会在类型不一致时抛异常。
@babel/template
通过 @babel/types 创建 AST