如何让 babel-node 将 Workers 引用的文件转换为 commonjs?(就像巴别塔一样)



在 Express.js 应用程序中,我在启动之前使用 Babel 预编译为 commonjs。编译步骤如下所示:

babel ./src --out-dir dist
node ./dist/bin

作为项目的一部分,我有一个名为my-worker.js的文件,我在其中使用import syntax

# my-worker.js
import { parentPort, workerData } from 'worker_threads'
import axios from 'axios'
...

这被other-file.js使用:

#other-file.js
...
const worker = new Worker(__dirname + '/my-worker.js', { workerData: ... })
...

这工作正常。Babel 将所有文件转换为 commonjs,加载 worker 脚本就可以了

当我使用@babel/node时,这不起作用:

babel-node ./src/bin

我收到警告:

(节点:4865( 警告:要加载 ES 模块,请在 package.json 中设置 "type": "module" 或使用 .mjs 扩展名。

随着错误:

不能在模块外部使用导入语句

我不想使用"type": "module",因为那时我必须显式命名文件扩展名,而且我不确定是否支持import X, { y } from ...语法(我喜欢(。

如果我将我的工作线程文件更改为my-worker.mjs,并相应地更改new Worker语句,那么这适用于@babel/node,但不适用于我的生产版本,因为文件名已更改回.js

如何让@babel/node加载和缓存(我想这是它需要做的?(由 Worker 加载的文件?为什么这适用于@babel而不是@babel/node


我的.babelrc文件如下所示:

{
"presets": [
[
"@babel/preset-env",
{
"useBuiltIns": "usage",
"corejs": 3,
"targets": {
"node": "13"
},
"modules": "commonjs"
}
]
]
}

@babel/registerAPI 可以帮助动态转译脚本源,如 https://github.com/babel/babel/issues/10972#issuecomment-572608142 中所述

可以将此方法与 eval 模式一起使用,以创建单文件脚本。如果使用babel-node运行命令行实用工具脚本,这可能很有用。

import { isMainThread, Worker, workerData } from "worker_threads";
function createTranspiledWorker(filename, options) {
const transpile = `
require('@babel/register');
require(${JSON.stringify(filename)});
`;
return new Worker(transpile, { ...options, eval: true });
}
async function main() {
const w = createTranspiledWorker(__filename, { workerData: { hello: "world" } });
const exit = new Promise(resolve => w.on("exit", resolve));
await exit;
}
function worker() {
console.log("worker", workerData);
}
if (isMainThread) {
main();
} else {
worker();
}

相关内容

  • 没有找到相关文章

最新更新