如何在TypeScript中使用Node.js worker_threads?解决导入语法报错
解决Node.js + TypeScript使用worker_threads的import语法错误问题
错误原因
用ts-node运行主文件时,主进程的TS代码会被ts-node编译,但Worker线程加载的worker.ts是直接交给Node.js处理的——Node本身无法识别TypeScript的import语法。同时你的tsconfig.json中include仅包含./src目录,scripts下的TS文件不会被编译,最终触发SyntaxError: Cannot use import statement outside a module错误。
解决方案
方案1:先编译所有TS文件再运行
- 修改
tsconfig.json的include字段,将scripts目录加入,确保所有TS文件都能被编译:
{ "compilerOptions": { "esModuleInterop": true, "preserveConstEnums": true, "strict": true, "resolveJsonModule": true, "sourceMap": true, "allowJs": true, "target": "es2015", "outDir": ".build", "moduleResolution": "node", "lib": ["es2015"], "rootDir": "./" }, "include": [ "./src", "./scripts" ] }
- 执行TypeScript编译命令:
tsc
- 运行编译后的主文件:
node .build/scripts/start.js
方案2:让Worker线程也通过ts-node处理TS文件
在创建Worker时,通过execArgv参数让Worker进程加载ts-node/register,自动编译Worker的TS代码:
修改scripts/start.ts中的Worker创建逻辑:
const worker = new Worker(path.resolve(__dirname, 'worker.ts'), { workerData: { config: { a: 'b' }, historicalData: [2, 4] }, execArgv: ['--require', 'ts-node/register'] });
同时需要确保tsconfig.json的include字段已加入./scripts,让ts-node能正确识别这些文件。
额外注意事项
- 如果项目使用ES模块(
package.json中配置type: "module"),需将tsconfig.json的module字段改为ESNext,并使用ts-node-esm运行脚本,Worker的execArgv需调整为['--loader', 'ts-node/esm']。 - 确保已安装必要依赖:
npm install -D ts-node typescript
内容的提问来源于stack exchange,提问作者Kristi Jorgji
相关产品推荐
相关产品推荐

