Node v22中jest-worker加载ESM模块的问题求助
我有一个使用jest-worker的Node脚本,当前在Node v22环境下使用.mjs格式的ESM模块,遇到了jest-worker无法加载ESM模块的问题。
最初尝试用createRequire解析模块路径:
import { createRequire } from 'node:module'; const require = createRequire(import.meta.url); const auditRepo = require.resolve('./lib/audit-repo.mjs'); const init = async () => { const jestOptions = { forkOptions: { silent: false }, exposedMethods: [ 'processRepo', ], }; const worker = new JestWorker(auditRepo, jestOptions);
出现错误:
Error [ERR_REQUIRE_ESM]: require() of ES Module /home/one/github/atlas-ui-audit/src/lib/audit-repo.mjs not supported.
Instead change the require of /home/one/github/atlas-ui-audit/src/lib/audit-repo.mjs to a dynamic import() which is available in all CommonJS modules.
改为动态import后依然失败:
const auditRepo = await import('./lib/audit-repo.mjs'); const init = async () => { const jestOptions = { forkOptions: { silent: false }, exposedMethods: [ 'processRepo', ], }; const worker = new JestWorker(auditRepo, jestOptions);
错误信息:
TypeError: Cannot read properties of undefined (reading 'startsWith')
at new Worker (/home/one/github/atlas-ui-audit/node_modules/jest-worker/build/index.js:120:20)
at init (file:///home/one/github/atlas-ui-audit/src/exec-audit.mjs:28:18)
at file:///home/one/github/atlas-ui-audit/src/exec-audit.mjs:50:1
希望保留原生.mjs文件,不使用rollup和babel,请问如何让jest-worker兼容ESM模块?
可行解决方案
1. 传递正确的模块路径而非导出对象
动态import()返回的是模块导出对象,但jest-worker第一个参数需要文件路径字符串。用import.meta.resolve获取ESM模块的绝对路径替代require.resolve,同时开启ESM支持配置:
// 获取模块的绝对路径 const auditRepoPath = await import.meta.resolve('./lib/audit-repo.mjs'); const init = async () => { const jestOptions = { forkOptions: { silent: false }, exposedMethods: ['processRepo'], // 关键配置:启用ESM加载模式 useESM: true }; const worker = new JestWorker(auditRepoPath, jestOptions); // 调用worker方法示例 const result = await worker.processRepo(yourParams); // 记得关闭worker await worker.end(); };
如果import.meta.resolve返回的file://前缀导致问题,可通过new URL(auditRepoPath).pathname去除前缀。
2. 确保worker文件的导出规范
audit-repo.mjs需将暴露的方法作为顶层导出,且方法需可序列化(避免闭包或非标准对象):
// audit-repo.mjs export async function processRepo(params) { // 业务逻辑实现 return 处理结果; }
3. 确认项目ESM环境配置
若项目根目录的package.json未设置"type": "module",需确保worker文件使用.mjs后缀(已满足),或在package.json中添加:
{ "type": "module" }
4. 升级jest-worker到最新版本
旧版本jest-worker对ESM支持存在缺陷,升级到最新稳定版可解决多数兼容性问题:
npm install jest-worker@latest
内容的提问来源于stack exchange,提问作者dman

