Jest: Cannot use import statement outside a module
Escribes un test con import, lanzas Jest y falla antes de ejecutar nada. Es como enchufar un aparato con clavija inglesa: el aparato funciona, pero el enchufe no lo reconoce. Jest espera require (CommonJS) y tú le das import (módulos ES). Necesitas un adaptador (Babel) o un enchufe nuevo (el modo ESM de Node).
El error
Es el mismo problema con tres mensajes distintos, según la versión de Jest:
| Versión | Mensaje |
|---|---|
| Jest de 2016–2018 | SyntaxError: Unexpected token import |
| Jest 29 | Jest encountered an unexpected token … SyntaxError: Cannot use import statement outside a module |
| Jest 30 | Must use import to load ES Module … The file contains ESM syntax (import/export) that could not be executed as CommonJS |
Jest 30 ya te propone las salidas en el propio error: configurar un transform como babel-jest o activar los módulos ES. Son las dos opciones de abajo.
Aparece con un test como este:
// test/romanNumerals.test.js
import { romanNumerals } from "../src/romanNumerals.js";
describe("romanNumerals", () => {
it("convierte números a romanos", () => {
expect(romanNumerals(3)).toBe("III");
});
});
Opción 1: Babel (la más compatible)
Babel traduce el import a require antes de que Jest ejecute el fichero.
- Instala Babel:
npm install --save-dev babel-jest @babel/core @babel/preset-env - Crea
babel.config.cjsen la raíz del proyecto. - Lanza
npx jest.
// babel.config.cjs
module.exports = {
presets: [["@babel/preset-env", { targets: { node: "current" } }]],
};
targets: { node: "current" } le dice a Babel que solo traduzca lo que tu versión de Node no entiende, que hoy es básicamente import y export. Jest detecta el fichero de configuración y usa babel-jest sin más ajustes.
Opción 2: módulos ES nativos (sin Babel)
Jest puede ejecutar import directamente usando una función de Node que todavía es experimental.
{
"type": "module",
"scripts": {
"test": "NODE_OPTIONS=--experimental-vm-modules jest"
},
"jest": {
"transform": {}
}
}
"transform": {} desactiva Babel en Jest para que el código llegue tal cual, como recomienda la documentación.
Con eso, npm test funciona. Verás un aviso ExperimentalWarning: VM Modules is an experimental feature de Node: es normal.
| Babel | ESM nativo | |
|---|---|---|
| Dependencias extra | Tres paquetes | Ninguna |
| Estado en Jest 30 | Estable | Experimental |
| Mocks de módulos | jest.mock() |
jest.unstable_mockModule(), aún en desarrollo |
La solución de 2018, y por qué ya no
La versión original de este artículo instalaba babel-plugin-transform-es2015-modules-commonjs y lo activaba en un .babelrc. Ese plugin es de Babel 6; desde Babel 7 los paquetes van bajo @babel/ y lo habitual es usar @babel/preset-env, que ya incluye esa transformación. Si lo encuentras en un proyecto antiguo, sustitúyelo por la opción 1.
Si estás empezando con Jest, mira cómo instalar Jest en un proyecto de JavaScript, y para entender bien import y export, exportar e importar funciones en JavaScript.
Fuentes
- Jest 30: Getting Started: Using Babel y ECMAScript Modules, consultados en noviembre de 2026.
- Babel: @babel/preset-env y Configure Babel.
- Incidencia original enlazada en 2018: jestjs/jest#2081, «Unexpected Token Import for ES6 modules», abierta en 2016 y cerrada el 11 de noviembre de 2016.
- Ejecutado con Node 24.21.0 y Jest 30.5.2 en un proyecto de prueba: el error sin configuración, el error con solo
"type": "module", la opción 1 (conbabel-jest30.5.2,@babel/core8.1.0 y@babel/preset-env8.0.7) y la opción 2. El mensaje de Jest 29 se comprobó con Jest 29.7.0.