Jest测试ANTLR4解析器遇导入错误:Cannot use import statement outside a module
解决Jest导入antlr4时的"Cannot use import statement outside a module"错误
我使用ANTLR4在TypeScript/JavaScript中实现了解析器,编写单元测试时导入antlr4遇到以下错误:
....\node_modules\antlr4\dist\antlr4.node.mjs:1
SyntaxError: Cannot use import statement outside a module1 | import antlr4 from 'antlr4';
| ^
测试文件最简示例:
import antlr4 from 'antlr4'; test('test_case', () => { const chars = new antlr4.InputStream("test"); });
使用的是最新版本的Jest和antlr4,以下是解决该问题的Jest配置步骤:
步骤1:设置项目为ES模块类型
在项目根目录的package.json中添加或修改type字段:
{ "type": "module" }
步骤2:配置Jest支持ES模块
创建或修改项目根目录的jest.config.mjs文件(注意后缀为.mjs,适配ES模块语法),添加以下配置:
export default { // 禁用默认的CommonJS转换,避免干扰ES模块处理 transform: {}, // 指定将.ts和.mjs文件当作ES模块处理 extensionsToTreatAsEsm: ['.ts', '.mjs'], // 处理导入路径中的.js后缀问题,适配ES模块导入规则 moduleNameMapper: { '^(\\.{1,2}/.*)\\.js$': '$1' } };
步骤3:TypeScript项目额外配置
如果项目基于TypeScript,先安装依赖:
npm install --save-dev ts-jest @types/jest
然后修改jest.config.mjs为:
export default { preset: 'ts-jest/presets/default-esm', extensionsToTreatAsEsm: ['.ts'], moduleNameMapper: { '^(\\.{1,2}/.*)\\.js$': '$1' }, globals: { 'ts-jest': { useESM: true } } };
步骤4:调整测试运行命令
在package.json的scripts中更新测试命令,添加Node.js的ES模块支持flag:
{ "scripts": { "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js" } }
完成以上配置后,Jest就能正确处理antlr4的ES模块导入,解决语法错误问题。
内容的提问来源于stack exchange,提问作者F.J.
相关产品推荐
相关产品推荐

