Vue3+TS+Jest使用Pinia报模块外无法使用import语句错误
问题根因
报错本质是Jest默认运行在CommonJS环境,不会转译node_modules下的ESM格式代码,加上配置存在明显错误,导致Pinia、vue-demi的ESM代码直接被Node执行触发语法错误,具体问题点:
jest.config.js中重复定义了两次transform字段,JS对象同名键会以后面的为准,最开始写的vue-demi转译规则被完全覆盖,根本没有生效- 原有
transform规则只处理.ts和.vue后缀文件,没有覆盖node_modules下依赖的.js格式ESM文件 transformIgnorePatterns规则写法零散,没有正确把需要转译的Pinia相关依赖加入转译白名单- 部分场景下vue-demi没有正确切换到Vue3适配版本,也会触发兼容问题
修复步骤
- 替换原有
jest.config.js为以下正确配置,删除重复字段,合并转译规则:
module.exports = { moduleFileExtensions: ["js", "ts", "json", "vue"], testEnvironment: "jsdom", transform: { "^.+\\.ts$": "ts-jest", "^.+\\.vue$": "@vue/vue3-jest", "node_modules/(pinia|vue-demi|@pinia/testing)/.+\\.(j|t)s?$": "ts-jest" }, transformIgnorePatterns: [ "<rootDir>/node_modules/(?!(pinia|@pinia/testing|vue-demi|@vue/test-utils)/)" ], moduleNameMapper: { "^vue$": "vue/dist/vue.cjs.js" } };
- 执行以下命令,手动将vue-demi切换到Vue3适配版本,避免版本适配错误:
npx vue-demi-switch 3
- 重新运行单元测试命令即可,不需要修改业务代码或tsconfig配置,生产构建流程不受任何影响。
配置说明
- 合并后的
transform规则不会再出现覆盖问题,会正确转译白名单内node_modules依赖的js/ts文件 - 统一的
transformIgnorePatterns规则会跳过其他node_modules包的转译,保证测试运行速度,仅转译Pinia相关的ESM依赖 moduleNameMapper配置强制Jest加载Vue的CommonJS版本,避免ESM格式的Vue入口触发同类import错误
内容的提问来源于stack exchange,提问作者Ali Afsahnoudeh
相关产品推荐
相关产品推荐

