Rails7项目Jest+Babel配置报错:无法在模块外使用import语句
我正在开发一个Ruby on Rails 7项目,使用Lit Element编写了若干JS Web组件,想要集成Jest进行单元测试。项目未使用TypeScript,仅用原生JS,当前环境为node v18.12.1、npm v9.2.0。
按照Jest官方入门步骤安装并配置后,简单测试可正常通过,但测试引入lit(import {LitElement} from 'lit';)的自定义组件时,出现报错:
SyntaxError: Cannot use import statement outside a module
按照Jest+Babel官方配置指南安装babel-jest、@babel/preset-env并完成配置后,问题仍未解决。尝试了多种方案,包括修改jest的transform、transformIgnorePatterns配置,以及在package.json中添加"type": "module"等,但均无效,仍出现相同报错。
当前配置文件:
package.json
{ "scripts": { "test": "jest" }, "jest": { "transform": { "^.+\\.[t|j]sx?$": "babel-jest" } }, "devDependencies": { "@babel/preset-env": "^7.20.2", "babel-jest": "^29.4.3", "jest": "^29.4.3", "lit": "^2.6.1" } }
babel.config.json
{ "presets": ["@babel/preset-env"] }
请问我遗漏了什么配置?
调整Jest的transformIgnorePatterns,让Babel转译lit相关包
Jest默认会忽略node_modules内的包转译,但lit及其依赖是ES模块格式,必须让babel-jest处理它们。修改package.json中的Jest配置:"jest": { "transform": { "^.+\\.[t|j]sx?$": "babel-jest" }, "transformIgnorePatterns": [ "/node_modules/(?!lit|lit-html|lit-element|@lit)" ] }这里通过负向断言,排除lit相关的包,确保Babel能转译这些ES模块。
更新Babel配置,适配Node环境并保留模块语法
修改babel.config.json,指定目标环境为当前Node版本,并禁用Babel的模块转换(让Jest处理模块解析):{ "presets": [ [ "@babel/preset-env", { "targets": { "node": "current" }, "modules": false } ] ] }移除package.json中的
"type": "module"字段(如果之前添加过)
Jest对ES模块的原生支持需要额外配置,而通过Babel转译的场景下,保持CommonJS模式更稳妥,避免模块格式冲突。确保测试文件使用
.js扩展名
不要使用.mjs作为测试文件扩展名,否则Jest会直接将其当作ES模块处理,引发额外的解析问题。
内容的提问来源于stack exchange,提问作者lifeofbrian

