如何让babel-node将Workers引用的文件转为commonjs? (就像巴别塔一样)
How to get babel-node to convert files referenced by Workers to commonjs? (like babel does)
在 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
我收到警告:
(node:4865) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
连同错误:
Cannot use import statement outside a module
我不想使用 "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/register
API 可以帮助动态转换脚本源,如 https://github.com/babel/babel/issues/10972#issuecomment-572608142
中所指出的
您可以将此方法与评估模式结合使用来制作单文件脚本。如果您使用 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();
}
在 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
我收到警告:
(node:4865) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
连同错误:
Cannot use import statement outside a module
我不想使用 "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/register
API 可以帮助动态转换脚本源,如 https://github.com/babel/babel/issues/10972#issuecomment-572608142
您可以将此方法与评估模式结合使用来制作单文件脚本。如果您使用 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();
}