1

我正在编写一个 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,但这似乎为时已晚,没有用处。

我可以试着带孩子走路,但这似乎不是很客气。

这是单独enterexit步骤的工作吗?

Program: {
  enter() {
    sawTopLevelExports = false
  },
  exit(path) {
    if (sawTopLevelExports) {
      ...
    } else {
      ...
    }
  }
}

?

在 Babel 中执行此操作的惯用方式是什么?

4

0 回答 0