如何在 Node.js 的工作线程中使用 ES6 导入?

How to use ES6 import in worker thread in Node.js?

提问人:Amitprj 提问时间:11/16/2023 最后编辑:Amitprj 更新时间:11/17/2023 访问量:49

问:

如何在工作线程中使用 ES6 导入?

我正在尝试在 Node.js 环境中的工作线程中使用 ES6 导入语法。但是,我遇到了 import 语句的问题。这是我的代码的简化版本: 应用.js

import express from 'express'
import bodyParser from 'body-parser'
import os from 'os'
import { Worker } from 'worker_threads'

const app = express()
const router = express.Router()
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())
app.use('/api', router)
router.get('/worker-thread', (req, res) => {
  const worker = new Worker('./worker_thread/index.js')
  worker.on('message', (j) => {
    return res.status(200).json({ value: j, message: 'running successfully' })
  })
})
app.listen(4000, () => {
  console.log('PORT RUNNING ON 4000')
})

worker_thread.js

import { parentPort } from 'worker_threads';

let j = 0;

for (let i = 0; i < 5000000000; i++) {
  j++;
}

parentPort.postMessage(j);

运行此代码会导致 SyntaxError: Cannot use import statement outside a module。我想在工作线程中利用 ES6 功能。在不转译代码的情况下实现此目的的正确方法是什么?

节点.js ecmascript-6 es6-模块 工作线程 节点工作线程

评论

0赞 Adesoji Alu 11/16/2023
使用 --experimental-worker 标志运行主脚本: like this: node --experimental-worker your_main_script.js 。但你也没有共享完整的主脚本,因为你可以创建和运行工作线程:
0赞 Amitprj 11/16/2023
我现在更新代码,请检查它,我还尝试了您 provided.it 不起作用的解决方案
0赞 slebetman 11/17/2023
您有 2 个选择。要么命名所有文件,要么添加package.json.mjs.js"type": "module"

答:

2赞 LmanTW 11/17/2023 #1

我尝试运行您的代码,它成功运行没有问题,url返回(我更改循环进行测试){"value":1000,"message":"running successfully"}

文件结构:

应用.js

worker_thread

|child_thread.js

package.json

package.json:

{
  "type": "module",
  "dependencies": {
    "body-parser": "^1.20.2",
    "express": "^4.18.2"
  }
}

我猜也许在您的 worker_thread/child_thread.js 节点中.js找不到您的package.json知道它正在使用 ES6,请告诉我在尝试重现此错误时是否做错了什么:D