API
@babel/parser:Babel 的解析器。最初是 从Acorn项目fork出来的。Acorn非常快,易于使用,并且针对非标准特性(以及那些未来的标准特性) 设计了一个基于插件的架构。
1 | const { |
@babel/traverse:Babel Traverse(遍历)模块维护了整棵树的状态,并且负责替换、移除和添加节点。
我们可以和 @babel/parser 一起使用来遍历和更新节点:
1 | const { |
@babel/types:Babel Types模块是一个用于 AST 节点的 Lodash 式工具库, 它包含了构造、验证以及变换 AST 节点的方法。 该工具库包含考虑周到的工具方法,对编写处理AST逻辑非常有用。
1 | const { |
@babel/generator: Babel 的代码生成器,它读取AST并将其转换为代码和源码映射(sourcemaps)。
1 | const { |
编写第一个Babel插件
先从一个接收了当前babel
对象作为参数的 function
开始。
1 | export default function(babel) { |
由于你将会经常这样使用,所以直接取出 babel.types
会更方便
1 | export default function({ types: t }) { |
接着返回一个对象,其 visitor
属性是这个插件的主要访问者。
1 | export default function({ types: t }) { |
Visitor 中的每个函数接收2个参数:path
和 state
1 | export default function({ types: t }) { |
让我们快速编写一个可用的插件来展示一下它是如何工作的。下面是我们的源代码:
1 | foo === bar; |
其 AST 形式如下:
1 | { |
我们从添加 BinaryExpression
访问者方法开始:
1 | export default function({ types: t }) { |
然后我们更确切一些,只关注哪些使用了 ===
的 BinaryExpression
。
1 | visitor: { |
现在我们用新的标识符来替换 left
属性:
1 | BinaryExpression(path) { |
于是如果我们运行这个插件我们会得到:
1 | sebmck === bar; |
现在只需要替换 right
属性了
1 | BinaryExpression(path) { |
这就是我们的最终结果了:
1 | sebmck === dork; |
使用过程
index.js
1 | foo === bar; |
babel-plugin-translate.js
这里改成了使用CommonJS
1 | module.exports = function ({ |
babel.config.js
1 | module.exports = { plugins: ['./babel-plugin-translate.js'] }; |
执行
1 | npx babel index.js --out-file script-index.js |
输出文件script-index.js
1 | sebmck === dork; |