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

标签 javascript node.js babeljs babel-node

在 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 中所指出的。
您可以在 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();
}

关于javascript - 如何让 babel-node 将 Workers 引用的文件转换为 commonjs? (就像 babel 一样),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59662352/

相关文章:

node.js - Sequelize 包含多态关系的相关项

javascript - 将 window.require 与 Electron 和 TypeScript 与 create-react-app 结合使用时缺少输入

javascript - Webpack/Babel 编译脚本

javascript - ASCIIMath 和 TiddlyWiki

javascript - 如何通过所述列表中的 map 属性值从 DynamoDB map 列表中删除?

javascript - 通过 Google Fit Api 检索的卡路里数与 Google Fit 官方应用程序中显示的卡路里数不匹配

javascript - 映射到 Prop (名称数组)返回带有逗号字符串的名称 ("Pam,,,,,,,,,,,,,,,") - 数组中的每个项目一个

javascript - 使用 Facebook 图形 API 在 Node.js 中检索整个好友列表

javascript - 我如何创建自己的 url,如 ws ://echo. websocket.org?

javascript - (帮助)React Native JSON 文件太大。 Bundler 堆内存不足