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

Node v22中jest-worker加载ESM模块的问题求助

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 09:00:21