我正在编写一个 babel 插件,它在模块顶部添加了一个 polyfill。
我想对 EcmaScript 模块使用一种策略,否则假设它是一个 CommonJS 模块。
所以我有类似的东西
module.exports = function moduleKeysBabelPlugin({ types: t }) {
return {
name: 'my plugin',
visitor: {
Program(path) {
// TODO: If there's a top-level export do something else.
// require('my-polyfiller/commonjs').polyfill(module, require);
const polyfill = t.expressionStatement(
t.callExpression(
t.memberExpression(
t.callExpression(
t.identifier('require'),
[ t.stringLiteral('my-polyfiller/commonjs') ]),
t.identifier('polyfill')),
[ t.identifier('module'), t.identifier('require') ]));
path.unshiftContainer('body', polyfill);
},
},
};
};
这让我可以处理 CommonJS。
我该如何表达
// TODO: If there's a top-level export do something else.
部分?
我可以访问并查看是否看到任何 Export*Declaration,但这似乎为时已晚,没有用处。
我可以试着带孩子走路,但这似乎不是很客气。
这是单独enter
和exit
步骤的工作吗?
Program: {
enter() {
sawTopLevelExports = false
},
exit(path) {
if (sawTopLevelExports) {
...
} else {
...
}
}
}
?
在 Babel 中执行此操作的惯用方式是什么?