Github Actions执行Jest报ReferenceError: TextEncoder未定义如何解决
排查方向&解决方案
- 调整TextEncoder polyfill的加载时机
你当前在test.js中赋值global.TextEncoder的时机晚于mongodb相关依赖的加载顺序,依赖whatwg-url在加载时就会调用TextEncoder,此时还没执行到你的赋值逻辑,因此报错。
你需要通过jest的setupFiles配置提前注入polyfill:
- 新增
jest.setup.js文件到jest.config.js同级目录,内容如下:
const { TextEncoder, TextDecoder } = require('util'); global.TextEncoder = TextEncoder; global.TextDecoder = TextDecoder;
- 修改jest.config.js,新增setupFiles配置,同时显式指定测试环境为node避免环境差异:
module.exports = { preset: '@shelf/jest-mongodb', testEnvironment: 'node', setupFiles: ['<rootDir>/jest.setup.js'] };
- 删除test.js中原有的
const { TextEncoder } = require('util');和global.TextEncoder = TextEncoder;两行代码。
检查Node版本兼容性
util.TextEncoder是Node.js v11.0.0才新增的API,你工作流的Node版本矩阵包含了10.x,该版本下util模块不存在TextEncoder,会直接报错。- 如果不需要兼容Node.js 10.x,直接从工作流的
node-version矩阵中删除10.x即可,同时建议删除非LTS的15.x,替换为维护期内的LTS版本(如16.x、18.x) - 如果需要兼容Node.js 10.x,安装
text-encodingpolyfill包:执行npm install text-encoding --save-dev,再把jest.setup.js里的引入来源替换为text-encoding即可。
- 如果不需要兼容Node.js 10.x,直接从工作流的
确认依赖版本一致性
检查是否已将package-lock.json或yarn.lock提交到代码仓库,npm ci会严格根据lock文件安装依赖,如果lock文件未提交,CI环境安装的依赖版本可能和本地不同,也会触发兼容性问题。校验环境变量加载逻辑
确认CI环境生成的.env文件路径正确、QA_MONGODB_URI密钥配置正常,避免因为环境变量加载失败导致的依赖初始化异常。
内容的提问来源于stack exchange,提问作者Zack
相关产品推荐
相关产品推荐

