ava转译相对导入文件失败,ES6 import报错:Unexpected token import
Unexpected token import错误 我来帮你搞定这个问题!你遇到的情况是AVA能正常转译测试文件本身的ES6 import语法,但导入本地模块(比如你的Mongoose User模型)时就触发了语法错误,这大概率是因为babel-register没有覆盖到你导入的这些本地文件,或者配置上有冲突。下面是具体的排查和修复步骤:
1. 让AVA明确接管Babel配置
你的当前配置里只给AVA加了babel-register,但它可能没有把转译规则应用到你导入的本地模块上。建议把Babel配置直接写到AVA的配置项里,确保所有相关文件都能被正确转译:
修改package.json中的AVA配置:
"ava": { "require": ["babel-register"], "babel": { "presets": [["es2015", {"modules": false}]], "plugins": ["transform-object-rest-spread", "transform-async-to-generator", "transform-export-extensions"] } }
这样AVA会明确用这个配置去转译测试文件以及它导入的所有本地模块,而不是只依赖根目录的.babelrc(有时候会因为文件位置问题导致读取不到)。
2. 升级Babel预设(推荐)
babel-preset-es2015已经被官方废弃了,换成babel-preset-env能更智能地根据运行环境转译代码,也能更好地兼容AVA:
先安装新的依赖:
npm install --save-dev babel-preset-env
然后更新你的Babel配置(不管是.babelrc还是AVA里的babel字段):
{ "presets": [["env", {"modules": false}]], "plugins": ["transform-object-rest-spread", "transform-async-to-generator", "transform-export-extensions"] }
3. 检查本地模块的导入路径
有时候省略文件扩展名会导致Node.js无法正确识别并转译模块,试试在导入时加上完整的.js扩展名:
// 之前的写法 // import User from './user.model' // 修改后 import User from './user.model.js'
4. 确认本地模块本身的语法
如果你的User模型文件里也用了ES6语法(比如import、箭头函数等),那它必须被Babel转译才能在Node环境运行。前面的配置已经覆盖了这一点,但如果模型文件在特殊目录下,你可以在测试文件顶部手动配置babel-register的转译范围:
require('babel-register')({ // 确保所有本地文件都被转译,排除node_modules(默认就是排除,但可以明确写出来) ignore: /node_modules/ })
最后,修改完配置后重新运行测试:
npx ava users.test.js
应该就能解决这个Unexpected token import的错误啦!
内容的提问来源于stack exchange,提问作者Clement

