You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 02:17:13