是否可以在Babel插件访问者中运行异步代码?

时间:2017-02-02 18:44:45

标签: plugins babeljs babel

我正在开发一个通过异步模块运行一些代码的babel插件。在修改路径之前,我需要等待结果。

visitor: {
  TaggedTemplateExpression(path) {
    if (path.node.tag.name !== 'Style') return;

    ProcessStyle(path).then((data) => {
      path.replaceWith(t.StringLiteral(data.data));
    });
  },
}

这目前可能吗?

2 个答案:

答案 0 :(得分:3)

Babel的API,例如babel.transform(),同步返回结果转换。这意味着插件无法异步,因为Babel本身是完全同步的。

根据您的要求,您可以考虑使用child_process.execSync同步运行另一个Node进程来阻止Babel执行异步工作。

答案 1 :(得分:0)

https://github.com/ForbesLindesay/sync-rpc

这在单独的过程中运行异步代码,并通过网络连接进行通信

我发现使用child_process和execSync / spawnSync很难可靠地做到这一点。即使将maxBuffer设置为Infinity,我也总是遇到缓冲区大小有限的问题,这会导致数据传输不完整和神秘的语法错误(代码行在大约1000个字符后被切断)