Playwright结合worker_threads测试时遇模块导入错误求助
解决Worker Threads中"Cannot use import statement outside a module"错误
针对你遇到的问题,核心原因是Worker线程加载的TypeScript文件未被正确编译或识别,以下是具体排查和解决步骤:
1. 加载编译后的JS文件而非TS源文件
Node.js原生无法直接解析TypeScript,Worker线程不会自动继承主进程的ts-node编译环境。你当前传入Worker的是TS文件路径./src/adapters/playwright.ts,需要改为加载编译后的JS文件:
- 确保tsconfig.json中配置了
outDir(比如"outDir": "./dist"),执行tsc编译项目 - 将Worker的文件路径改为编译后的路径,比如
./dist/adapters/playwright.js
2. 让Worker直接识别TS文件(无需预编译)
如果不想每次修改都重新编译,可以在创建Worker时指定execArgv参数,强制Worker用ts-node处理TS文件:
import { Worker } from "worker_threads"; const create_worker = (file: string, tasksData: {}) => new Promise((resolve, reject) => { const worker = new Worker(file, { workerData: tasksData, // 添加这一行,让Worker使用ts-node解析TS文件 execArgv: ["--require", "ts-node/register"] }); worker.on("message", (data) => { resolve(data); }); worker.on("error", (msg) => { reject(`An error occurred: ${msg}`); }); }); export default create_worker;
注意:确保项目已安装ts-node和typescript依赖,且版本兼容。
3. 检查配置文件的一致性
- tsconfig.json:确认
compilerOptions.module为CommonJS,同时target需设置为ES6或更高版本(worker_threads需要ES6+特性支持);确保include数组包含Worker相关的TS文件 - package.json:如果设置了
"type": "module",会覆盖tsconfig的CommonJS配置,导致Node.js将文件视为ES模块,此时需移除该字段或改为"type": "commonjs"
4. 修复测试代码的数组越界问题
你的测试循环执行了5次,但chunkify_array(search_grid, 4)只生成4块数据,当i=4时chunks![i]会是undefined,建议修改循环条件:
for (let i = 0; i < chunks.length; i++) { const worker = await create_worker( "./dist/adapters/playwright.js", // 或对应TS路径(如果用方法2) { search_grid: chunks[i], } ); workerPromises.push(worker); }
内容的提问来源于stack exchange,提问作者rjjdv
相关产品推荐
相关产品推荐

