Javascript 如何让babel节点将Workers引用的文件转换为commonjs?(就像巴贝尔那样)

Javascript 如何让babel节点将Workers引用的文件转换为commonjs?(就像巴贝尔那样),javascript,node.js,babeljs,babel-node,Javascript,Node.js,Babeljs,Babel Node,在Express.js应用程序中,我使用Babel在启动之前预编译到commonjs。编译步骤如下所示: babel ./src --out-dir dist node ./dist/bin { "presets": [ [ "@babel/preset-env", { "useBuiltIns": "usage", "corejs": 3, "targets": { "node": "13

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

babel ./src --out-dir dist
node ./dist/bin
{
  "presets": [
    [
      "@babel/preset-env",
      {
        "useBuiltIns": "usage",
        "corejs": 3,
        "targets": {
          "node": "13"
        },
        "modules": "commonjs"
      }
    ]
  ]
}
作为项目的一部分,我有一个名为
my worker.js
的文件,其中我使用
导入语法

# 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,并且加载辅助脚本可以工作

但是

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

babel-node ./src/bin
我得到警告:

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

除了错误:

无法在模块外部使用导入语句

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

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

我如何才能让
@babel/node
加载和缓存(我猜这就是它需要做的?)由工作人员加载的文件?为什么这适用于
@babel
而不适用于
@babel/node


我的
.babelrc
文件如下所示:

babel ./src --out-dir dist
node ./dist/bin
{
  "presets": [
    [
      "@babel/preset-env",
      {
        "useBuiltIns": "usage",
        "corejs": 3,
        "targets": {
          "node": "13"
        },
        "modules": "commonjs"
      }
    ]
  ]
}

我目前使用的解决方案是在应用程序启动时通过
fs.readFileSync
获取要运行的文件名。然后在dev中,我可以使用
.mjs
,这对于节点13很好,在生产环境中,commonjs输出是
.js
,而
fs.readFileSync
查找
.js
文件。对于更面向巴别塔的方法: