Nodemon搭配TypeScript+Worker Threads运行报错如何解决?
问题根因
dev模式下你使用ts-node直接运行TypeScript源码,此时__filename指向的是.ts后缀的源文件,而Node.js原生的Worker线程默认仅支持.js/.mjs/.cjs后缀的脚本,无法直接识别TS文件,因此抛出扩展名校验错误。生产环境因为你提前把TS编译成了JS文件,__filename指向的是.js后缀的编译产物,所以可以正常运行。
解决方案
你只需要在初始化Worker时,针对开发环境添加execArgv参数,让Worker进程也通过ts-node加载TS文件即可,生产环境无需额外配置,不影响原有逻辑。
修改后的thread.ts代码
import { Worker, isMainThread, parentPort, workerData } from "worker_threads"; let threadFunction:Function = ()=>{}; if (isMainThread) { threadFunction = function threadFunction() { return new Promise((resolve, reject) => { const worker = new Worker(__filename, { workerData: "abc", // 仅开发环境添加ts-node加载器 ...(process.env.NODE_ENV === 'development' ? { execArgv: ['-r', 'ts-node/register'] } : {}) }); worker.on('message', resolve); worker.on('error', reject); worker.on('exit', (code) => { if (code !== 0) reject(new Error(`Worker stopped with exit code ${code}`)); }); }); }; } else { console.log("Received Data from Parent : ",workerData); // 补充:给主线程回发消息避免Promise一直挂起 parentPort?.postMessage('worker executed success') } export default threadFunction;
额外注意事项
- 如果你的项目有自定义的tsconfig路径,可以在
execArgv里添加参数指定配置文件,比如execArgv: ['-r', 'ts-node/register', '--project', './tsconfig.json'] - 若后续升级到Node.js 16+且使用ES模块模式,需要把
execArgv调整为使用ts-node的ESM加载器:execArgv: ['--loader', 'ts-node/esm']
内容的提问来源于stack exchange,提问作者Rohit Rane
相关产品推荐
相关产品推荐

