Nivel inicial5 min de lectura · Publicado el

Jest: Cannot use import statement outside a module

Jest y el token import: el test trae import, Jest espera require, y se arregla con Babel o con el modo ESM de Node. Jest no entiende importrubentejera.com Jestrequiretu testimportadaptadorBabelotro enchufemodo ESM
Tu test trae import, una clavija de otro país, y Jest espera require, el enchufe de CommonJS. O pones un adaptador (Babel traduce el import) o cambias el enchufe (el modo ESM, con NODE_OPTIONS=--experimental-vm-modules).

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.

  1. Instala Babel: npm install --save-dev babel-jest @babel/core @babel/preset-env
  2. Crea babel.config.cjs en la raíz del proyecto.
  3. 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.

En Windows, la variable de entorno se escribe distinto; usa `cross-env` o llama a Jest como `node --experimental-vm-modules node_modules/jest/bin/jest.js`.
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 (con babel-jest 30.5.2, @babel/core 8.1.0 y @babel/preset-env 8.0.7) y la opción 2. El mensaje de Jest 29 se comprobó con Jest 29.7.0.