Jest测试TS代码导入副作用polyfill报Cannot use import statement错误
问题根因
该报错和import "z"这种副作用导入语法无关,本质原因是:
- 你导入的
promise-polyfill/src/polyfill是包内未编译的ESM源码,使用了importES模块语法 - Jest默认配置下不会转译
node_modules目录下的所有文件,因此无法识别ES模块语法 - 其他
import x from "y"导入的依赖能正常运行,是因为这些依赖发布时已经将产物编译为兼容的CommonJS格式,不需要额外转译
解决方法
方案1(推荐):更换为编译后的polyfill导入路径
绝大多数polyfill包都会提供预编译的通用版本,你只需要将导入语句从源码路径改为产物路径即可:
// 替换前 import "promise-polyfill/src/polyfill"; // 替换后 import "promise-polyfill/dist/polyfill.min.js";
该方案无需修改Jest配置,同时不会影响浏览器端的polyfill注入效果,兼容性最好。
方案2:修改Jest配置,允许转译指定node_modules依赖
如果你必须使用源码版本的polyfill,可以修改jest.config.js,调整transformIgnorePatterns配置,将promise-polyfill从默认忽略转译的名单中排除:
module.exports = { transform: { '^.+\\.ts?$': 'ts-jest' }, testEnvironment: 'node', testRegex: '/test/.*\\.(test|spec)?\\.(ts|tsx)$', moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], // 新增以下配置 transformIgnorePatterns: [ "/node_modules/(?!promise-polyfill)" ] };
该配置的含义是:node_modules目录下除了promise-polyfill之外的所有包都不做转译,Jest会自动对promise-polyfill的源码做语法转换,即可识别import语句。
内容的提问来源于stack exchange,提问作者user2078994
相关产品推荐
相关产品推荐

