You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js+TypeScript中Worker线程如何正确导入模块?

Node.js + TypeScript Worker Threads 导入语法错误解决方案

问题场景

使用Node.js + TypeScript开发时,启动main.ts后,worker.ts中的import { parentPort } from 'worker_threads';语句抛出错误:

SyntaxError: Cannot use import statement outside a module

涉事代码

main.ts

import { Worker } from 'worker_threads';

const worker = new Worker('./src/Workers/worker.ts');

worker.on('message', (data) => {
    console.log(data);
})

worker.postMessage('start');

worker.ts

import { parentPort } from 'worker_threads';
import { broadcastService } from '../services/BroadcastService'

parentPort?.on('message', async (data: string) => {
    console.log(data);
    const currentBroadcasts = await broadcastService.startBroadcastsChecking();
    parentPort?.postMessage(currentBroadcasts);
})

已尝试无效方案

  • 将worker.ts后缀改为.js,仍报相同导入错误;
  • 创建Worker时添加{ type: 'module' } as any配置,问题依旧;
  • 在worker中使用importScripts('../services/BroadcastService'),抛出ReferenceError [Error]: importScripts is not defined;
  • 在package.json中添加"type": "module",出现TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts"。

核心原因

Node.js本身无法直接解析TypeScript文件,Worker线程也不会自动继承主线程的TS编译环境。直接加载.ts文件时,Node.js会把它当成普通JS文件处理,若未配置模块系统,ES模块的import语法就会触发报错。

有效解决方案

方案1:编译TS为JS后运行(生产环境首选)

  1. 确保tsconfig.json配置正确,示例:
{
  "compilerOptions": {
    "target": "ESNext",
    "module": "CommonJS", // 若用ES模块则设为ESNext
    "outDir": "./dist",
    "rootDir": "./src",
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true
  },
  "include": ["src/**/*"]
}
  1. 执行编译命令:tsc
  2. 修改main.ts中的Worker路径为编译后的JS文件:
const worker = new Worker('./dist/Workers/worker.js');
  1. 运行主线程:node dist/main.js

若使用ES模块(package.json设"type": "module"),需同步修改tsconfig.json的module为ESNext、moduleResolution为NodeNext,编译后正常运行即可。

方案2:用ts-node直接运行(开发环境快捷方案)

无需提前编译,让ts-node处理Worker的TS解析:

  1. 安装依赖:npm install -D ts-node typescript @types/node
  2. 修改主线程中Worker的创建逻辑:
import { Worker } from 'worker_threads';

const worker = new Worker('./src/Workers/worker.ts', {
  execArgv: ['-r', 'ts-node/register']
});
  1. 启动主线程:ts-node src/main.ts

方案3:ES模块+ts-node/esm加载器

若项目强制使用ES模块:

  1. 更新tsconfig.json:
{
  "compilerOptions": {
    "target": "ESNext",
    "module": "ESNext",
    "moduleResolution": "NodeNext",
    "outDir": "./dist",
    "rootDir": "./src",
    "strict": true,
    "esModuleInterop": true
  },
  "include": ["src/**/*"]
}
  1. 安装依赖:npm install -D ts-node typescript @types/node
  2. 调整Worker创建代码:
import { Worker } from 'worker_threads';

const worker = new Worker('./src/Workers/worker.ts', {
  type: 'module',
  execArgv: ['--loader', 'ts-node/esm']
});
  1. 运行命令:node --loader ts-node/esm src/main.ts

关键提醒

  • 统一模块系统:CommonJS和ES模块不要混用,tsconfig.json的module配置要和package.json的type匹配;
  • importScripts是浏览器Web Worker的API,Node.js的Worker Threads不支持,请勿使用;
  • 生产环境优先用编译方案,避免ts-node带来的性能损耗。

内容的提问来源于stack exchange,提问作者AlexeySmk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 10:16:21