升级Jest至v29后出现ReferenceError: TextEncoder is not defined求助
解决Jest 29升级后react-dom/server导入浏览器版本导致的
TextEncoder is not defined错误 问题根源
升级Jest到29.x后,模块解析逻辑发生变化,测试环境错误导入了react-dom/server的浏览器版本(而非Node.js版本)。浏览器环境中TextEncoder是全局对象,但Node.js环境需显式引入,因此触发未定义错误。
非Hack解决方案
1. 调整Jest模块扩展名优先级
修改package.json中Jest配置的moduleFileExtensions,将"node"移至最前,让Jest优先查找Node.js专属版本的模块文件:
"jest": { // ...其他配置 "moduleFileExtensions": [ "node", "web.js", "js", "web.ts", "ts", "web.tsx", "tsx", "json", "web.jsx", "jsx" ], // ...其他配置 }
react-dom/server通过文件后缀区分环境版本,调整优先级后,Jest会优先匹配Node.js版本的文件。
2. 强制映射到Node.js版本的react-dom/server
在Jest的moduleNameMapper中添加规则,直接指定react-dom/server的Node.js版本路径:
"jest": { // ...其他配置 "moduleNameMapper": { "^react-native$": "react-native-web", "^.+\\.module\\.(css|sass|scss)$": "identity-obj-proxy", "^uuid$": "<rootDir>/node_modules/uuid/dist/umd/uuid.min.js", "^react-dom/server$": "<rootDir>/node_modules/react-dom/cjs/react-dom-server.node.js" }, // ...其他配置 }
此方法跳过自动解析,强制使用Node.js版本,适合需要精准控制模块导入的场景。
3. 确保jest-environment-jsdom版本与Jest主版本一致
Jest 29.x要求jest-environment-jsdom版本必须与Jest核心版本匹配,避免环境模拟不一致:
npm install jest-environment-jsdom@29.7.0 --save-dev
方案优势
以上方案均从修正模块导入逻辑出发,而非临时补全局对象,更符合项目长期维护需求,避免后续因环境变化再次触发类似问题。
内容的提问来源于stack exchange,提问作者Lukas Müller
相关产品推荐
相关产品推荐

