自定义NodeEnvironment时出现Unexpected token import语法错误求助
解决Jest自定义NodeEnvironment时的
SyntaxError: Unexpected token import错误 这个问题的核心原因是:Jest加载自定义测试环境文件时,默认使用Node原生的require机制解析,而Node 8.11.1对ES模块(import/export)的支持是实验性的,且Jest不会自动转译自定义环境文件——但你的普通测试文件能正常用ES模块,是因为Jest会用babel或其他转译工具处理它们。
下面给你两个可行的解决方案:
方案一:改用CommonJS语法(最稳妥,适配Node 8)
直接把自定义环境文件里的ES模块语法改成Node 8完全支持的CommonJS语法,这是最快解决问题的方式:
// 替换原来的import语句 const { NodeEnvironment } = require('jest-environment-node'); // 替换原来的export default module.exports = class CustomIntegrationEnv extends NodeEnvironment { constructor(config, context) { super(config, context); // 你的自定义环境逻辑 } // 其他生命周期方法... };
方案二:配置Jest+Babel转译自定义环境文件(坚持用ES模块)
如果你想继续用ES模块语法,需要让Jest用Babel转译你的自定义环境文件:
- 安装必要的Babel依赖:
yarn add --dev @babel/core @babel/preset-env babel-jest
- 在项目根目录创建
babel.config.js,配置适配Node 8.11.1的转译规则:
module.exports = { presets: [ ['@babel/preset-env', { targets: { node: '8.11.1' } }] ] };
- 修改
jest.config.js,确保自定义环境文件被Babel转译:
module.exports = { testEnvironment: './__tests__/_helpers_/environments/integration.js', // 让所有.js文件都经过babel-jest转译 transform: { '^.+\\.js$': 'babel-jest' }, // 确保Jest不会忽略你的自定义环境文件所在目录的转译 transformIgnorePatterns: [ 'node_modules/(?!jest-environment-node)' ] };
注意:Node 8.x的ES模块支持需要额外启用实验性特性(比如
--experimental-modules参数),但Jest默认不会添加这个参数,所以方案一的兼容性更好。
内容的提问来源于stack exchange,提问作者Jake Klassen
相关产品推荐
相关产品推荐

