Home / Backend / Configura Babel en Node.js para usar JavaScript moderno en 2026
Configura Babel en Node.js para usar JavaScript moderno en 2026

Configura Babel en Node.js para usar JavaScript moderno en 2026

2 October 2026 · 15 min de lectura

Introduccion al uso de Babel en entornos Node.js actuales

En el ecosistema de desarrollo backend con JavaScript, la capacidad de escribir codigo utilizando las caracteristicas mas recientes del lenguaje mientras se mantiene compatibilidad con versiones especificas de Node.js resulta fundamental. Babel actua como un compilador que transforma sintaxis moderna de JavaScript en versiones que el motor de Node.js puede ejecutar de manera confiable. Aunque Node.js incorpora de forma nativa un numero creciente de caracteristicas de ECMAScript, existen escenarios donde se requiere un control preciso sobre el proceso de transpilacion, especialmente cuando se trabaja con propuestas en etapa experimental, TypeScript o cuando se necesita generar codigo optimizado para versiones anteriores del runtime.

Este tutorial detalla el proceso completo de configuracion de Babel en un proyecto Node.js utilizando las practicas recomendadas en 2026. Se abordan las particularidades de Babel 8, que introduce cambios significativos como el soporte exclusivo de modulos ESM, la eliminacion de la compilacion predeterminada a ES5 y nuevos requisitos de version de Node.js. El objetivo es proporcionar una guia practica que permita integrar Babel de forma eficiente tanto en flujos de desarrollo como en procesos de construccion para produccion.

La necesidad de Babel en Node.js no ha desaparecido. Aunque muchas caracteristicas de ES2015 en adelante ya estan disponibles de forma nativa, el compilador sigue siendo util cuando se desea utilizar sintaxis que aun no ha alcanzado el soporte completo, cuando se trabaja con monorepos que requieren transformaciones consistentes o cuando se necesita aplicar polyfills de manera controlada. Ademas, herramientas como TypeScript o ciertos frameworks backend continuan dependiendo de Babel para el procesamiento del codigo fuente.

A lo largo de las siguientes secciones se exploraran los pasos de instalacion, la configuracion de archivos, el uso de la interfaz de linea de comandos, el registro automatico de transformaciones y la integracion con scripts de npm. Cada concepto se acompana de ejemplos de codigo concretos que pueden copiarse y adaptarse a proyectos reales. Se presta especial atencion a las diferencias entre el enfoque tradicional basado en archivos .babelrc y las recomendaciones actuales que favorecen babel.config.json o archivos de configuracion en formato ESM.

Requisitos previos y preparacion del entorno

Antes de comenzar con la instalacion de Babel es necesario contar con un entorno de desarrollo adecuado. Se recomienda utilizar una version de Node.js compatible con Babel 8, es decir, Node.js 22.18 o superior en la linea 22, o bien Node.js 24.11 o posterior. Estas versiones garantizan el soporte nativo de require(esm) y permiten que los paquetes de Babel se ejecuten sin problemas. Se sugiere verificar la version instalada mediante el comando correspondiente en la terminal.

node --version

Si la version mostrada no cumple con los requisitos minimos, es conveniente actualizar Node.js utilizando el gestor de versiones nvm o descargando el instalador oficial. Una vez confirmada la version adecuada, se procede a crear un nuevo directorio para el proyecto y a inicializar un archivo package.json.

mkdir proyecto-babel-node
cd proyecto-babel-node
npm init -y

El archivo package.json generado servira como base para declarar las dependencias de desarrollo y los scripts de construccion. Es importante trabajar siempre con dependencias locales en lugar de instalaciones globales, ya que esto garantiza la reproducibilidad del entorno en diferentes maquinas y en pipelines de integracion continua.

En este punto conviene decidir si el proyecto utilizara modulos CommonJS o ESM de forma nativa. Node.js permite declarar el tipo de modulo en el package.json mediante el campo “type”. Para proyectos modernos se recomienda adoptar ESM, aunque Babel ofrece flexibilidad para trabajar con ambos sistemas.

{
    "name": "proyecto-babel-node",
    "version": "1.0.0",
    "type": "module",
    "scripts": {}
}

La eleccion del tipo de modulo influye en la forma en que se configuraran los archivos de Babel y en los targets que se definiran posteriormente. Con el entorno preparado, el siguiente paso consiste en instalar los paquetes principales de Babel.

Instalacion de los paquetes esenciales de Babel

La instalacion de Babel se realiza mediante npm o yarn, agregando los paquetes como dependencias de desarrollo. Los tres componentes fundamentales son @babel/core, que contiene el motor de transformacion, @babel/cli, que proporciona la interfaz de linea de comandos, y @babel/preset-env, que determina automaticamente las transformaciones necesarias segun el entorno objetivo.

npm install --save-dev @babel/core @babel/cli @babel/preset-env

Esta instalacion coloca los paquetes dentro de la carpeta node_modules y actualiza el archivo package.json. Es recomendable verificar que se haya instalado una version de Babel 8 o superior, ya que las instrucciones de este tutorial se centran en las caracteristicas de esa version mayor.

npm ls @babel/core

Si el resultado muestra una version 7.x, es probable que la version de Node.js instalada no cumpla con los requisitos de Babel 8. En ese caso se debe actualizar Node.js y volver a ejecutar la instalacion. Babel 8 se distribuye exclusivamente como modulos ESM, lo que simplifica su arquitectura interna y reduce el tamano de los paquetes.

Adicionalmente, en muchos proyectos resulta util instalar @babel/node, que permite ejecutar archivos directamente con transformacion en tiempo de ejecucion, y @babel/register, que intercepta las llamadas a require para aplicar transformaciones de forma automatica. Estos paquetes se instalan de la misma manera.

npm install --save-dev @babel/node @babel/register

Una vez instalados los paquetes, el siguiente paso consiste en crear el archivo de configuracion que guiara el comportamiento de Babel.

Configuracion moderna de Babel con babel.config.json

En las versiones actuales de Babel se recomienda utilizar un archivo babel.config.json ubicado en la raiz del proyecto. Este archivo ofrece una configuracion de alcance de proyecto que es mas predecible que los antiguos archivos .babelrc, especialmente en monorepos o cuando se trabaja con herramientas de construccion complejas.

El contenido basico de un archivo babel.config.json orientado a Node.js se muestra a continuacion.

{
    "presets": [
        [
            "@babel/preset-env",
            {
                "targets": {
                    "node": "current"
                }
            }
        ]
    ]
}

La opcion “targets” con el valor “node”: “current” indica a Babel que genere codigo compatible con la version de Node.js que se esta utilizando en el momento de la compilacion. Esta configuracion resulta ideal durante el desarrollo. Para entornos de produccion es preferible especificar una version concreta, como “node”: “22.0.0”, de modo que el codigo generado sea predecible independientemente de la version de Node.js del desarrollador.

Babel 8 modifica el comportamiento predeterminado de @babel/preset-env. Ya no se compila automaticamente a ES5 ni se convierte a CommonJS. En su lugar, el preset se basa en los defaults de browserslist, lo que actualmente equivale aproximadamente a ES2023. Si se necesita generar CommonJS, se debe indicar explicitamente mediante la opcion modules.

{
    "presets": [
        [
            "@babel/preset-env",
            {
                "targets": {
                    "node": "22.0.0"
                },
                "modules": "commonjs"
            }
        ]
    ]
}

Es posible utilizar archivos de configuracion en formato JavaScript o TypeScript cuando se requiere logica dinamica. Un ejemplo de babel.config.mjs se presenta a continuacion.

export default {
    presets: [
        [
            "@babel/preset-env",
            {
                targets: {
                    node: "current",
                },
            },
        ],
    ],
};

La eleccion entre JSON y JavaScript depende de la complejidad de la configuracion. Para la mayoria de los proyectos, babel.config.json resulta suficiente y ofrece mejores caracteristicas de cacheo y analisis estatico.

Creacion de un archivo de entrada y transformacion basica

Con la configuracion lista, se crea un archivo de ejemplo que utilice sintaxis moderna de JavaScript. Este archivo servira para verificar que Babel realiza las transformaciones esperadas.

// src/index.js
const numbers = [1, 2, 3, 4, 5];
const doubled = numbers.map((n) => n * 2);

const person = {
    name: "Ana",
    age: 30,
    greet() {
        return `Hola, soy ${this.name}`;
    },
};

console.log(doubled);
console.log(person.greet());

export const sum = (a, b) => a + b;

Para transformar este archivo se utiliza la interfaz de linea de comandos de Babel. El siguiente comando lee el archivo fuente y escribe el resultado en un directorio de salida.

npx babel src/index.js --out-dir dist

El resultado generado en dist/index.js contendra el codigo transformado segun las reglas definidas en la configuracion. Si se desea observar el proceso en tiempo real o aplicar transformaciones a un directorio completo, se pueden agregar opciones adicionales.

npx babel src --out-dir dist --source-maps

La generacion de source maps facilita la depuracion al permitir que las herramientas de desarrollo mapeen el codigo transformado de vuelta al codigo original. Esta practica es altamente recomendable tanto en desarrollo como en produccion.

Integracion de scripts de construccion en package.json

Para facilitar el uso diario de Babel, es conveniente definir scripts en el archivo package.json. Estos scripts permiten ejecutar la transformacion y el inicio de la aplicacion con un solo comando.

{
    "scripts": {
        "build": "babel src --out-dir dist --source-maps",
        "start": "node dist/index.js",
        "dev": "babel src --out-dir dist --source-maps --watch"
    }
}

El script “build” realiza la transformacion completa del directorio src hacia dist. El script “start” ejecuta el codigo ya transformado. El script “dev” agrega la opcion –watch, de modo que Babel monitorea los cambios en los archivos fuente y regenera el codigo de salida de forma automatica.

npm run build
npm start

Cuando se trabaja con un servidor que necesita reiniciarse ante cambios, es habitual combinar Babel con herramientas como nodemon. En ese caso se puede crear un script que utilice babel-node o que observe el directorio dist.

Uso de @babel/register para transformacion en tiempo de ejecucion

En escenarios de desarrollo es posible aplicar las transformaciones de Babel de forma automatica al momento de cargar los modulos, sin necesidad de un paso de construccion previo. El paquete @babel/register logra este comportamiento al interceptar el mecanismo de carga de Node.js.

Para utilizarlo se crea un archivo de entrada que registra Babel antes de importar el resto de la aplicacion.

// register.js
import "@babel/register";

import "./src/index.js";

Posteriormente se ejecuta este archivo con Node.js.

node register.js

Por defecto, @babel/register ignora los archivos ubicados dentro de node_modules. Esta decision mejora el rendimiento y evita transformaciones innecesarias. Si se necesita modificar este comportamiento, se pueden pasar opciones al momento de registrar el hook.

import register from "@babel/register";

register({
    ignore: [],
    extensions: [".js", ".ts"],
});

Aunque @babel/register resulta conveniente durante el desarrollo, no se recomienda su uso en produccion debido al impacto en el tiempo de inicio y al consumo de memoria. En produccion siempre es preferible realizar la transformacion de forma anticipada mediante el CLI.

Ejecucion directa con @babel/node

El paquete @babel/node proporciona un ejecutable que se comporta de manera similar a node, pero aplica las transformaciones de Babel antes de ejecutar el codigo. Esta herramienta resulta util para pruebas rapidas o para scripts de corta duracion.

npx babel-node src/index.js

Tambien es posible iniciar un REPL interactivo con soporte de sintaxis moderna.

npx babel-node

Es importante recordar que babel-node no esta disenado para entornos de produccion. Su uso genera una sobrecarga significativa porque mantiene la cache de transformaciones en memoria y recompila el codigo en cada ejecucion. Para servidores de larga duracion se debe preferir el flujo de construccion con el CLI seguido de la ejecucion del codigo generado.

Manejo de modulos ESM y CommonJS en Babel 8

Babel 8 introduce un cambio importante: el preset-env genera por defecto modulos ESM en lugar de CommonJS. Esta decision se alinea con la adopcion creciente de ESM en el ecosistema Node.js. Sin embargo, muchos proyectos legacy aun dependen de CommonJS, por lo que es necesario configurar explicitamente el comportamiento deseado.

Cuando el proyecto declara “type”: “module” en package.json, Babel genera de forma natural import y export. Si se necesita generar require y module.exports, se utiliza la opcion modules dentro de la configuracion del preset.

{
    "presets": [
        [
            "@babel/preset-env",
            {
                "targets": {
                    "node": "22"
                },
                "modules": "commonjs"
            }
        ]
    ]
}

En proyectos mixtos es posible utilizar la opcion overrides para aplicar configuraciones distintas segun el tipo de archivo.

{
    "presets": ["@babel/preset-env"],
    "overrides": [
        {
            "test": "*.cjs",
            "sourceType": "commonjs"
        }
    ]
}

Esta flexibilidad permite migrar gradualmente de CommonJS a ESM sin necesidad de transformar todo el proyecto de una sola vez.

Incorporacion de plugins adicionales

Aunque @babel/preset-env cubre la mayoria de las transformaciones sintacticas, existen situaciones en las que se requieren plugins especificos. Por ejemplo, si se desea utilizar decoradores o sintaxis de stage-3, se deben instalar y declarar los plugins correspondientes.

npm install --save-dev @babel/plugin-proposal-decorators

Luego se agregan a la configuracion.

{
    "presets": [
        [
            "@babel/preset-env",
            {
                "targets": {
                    "node": "current"
                }
            }
        ]
    ],
    "plugins": [["@babel/plugin-proposal-decorators", { "version": "2023-11" }]]
}

Es importante revisar la documentacion de cada plugin para conocer las opciones recomendadas, ya que muchas propuestas evolucionan y cambian de version. Babel 8 ha eliminado o deprecado varios plugins antiguos, por lo que se recomienda migrar a las versiones mas recientes de cada propuesta.

Cuando se trabaja con TypeScript, se puede agregar @babel/preset-typescript. Este preset elimina los tipos y deja el codigo JavaScript listo para ser ejecutado.

npm install --save-dev @babel/preset-typescript
{
    "presets": ["@babel/preset-env", "@babel/preset-typescript"]
}

En este caso se debe indicar a la CLI que procese archivos con extension .ts.

npx babel src --out-dir dist --extensions ".ts,.js"

Estructura recomendada de directorios para proyectos Babel

Una organizacion clara de los directorios facilita el mantenimiento del proyecto. Una estructura tipica se muestra a continuacion.

proyecto-babel-node/
├── src/
│   ├── index.js
│   ├── routes/
│   └── utils/
├── dist/
├── babel.config.json
├── package.json
└── node_modules/

El directorio src contiene el codigo fuente escrito con sintaxis moderna. El directorio dist almacena el codigo transformado que sera ejecutado por Node.js. Es conveniente agregar dist al archivo .gitignore para evitar versionar el codigo generado.

echo "dist/" >> .gitignore

En proyectos mas grandes se pueden agregar carpetas adicionales para pruebas, configuracion y documentacion. La clave es mantener una separacion clara entre el codigo fuente y el codigo de salida.

Ejemplo completo de un servidor HTTP con Babel

Para ilustrar el flujo completo se presenta un ejemplo de servidor HTTP simple que utiliza caracteristicas modernas de JavaScript.

// src/server.js
import http from "node:http";

const PORT = process.env.PORT || 3000;

const server = http.createServer((req, res) => {
    const { method, url } = req;

    if (method === "GET" && url === "/") {
        res.writeHead(200, { "Content-Type": "application/json" });
        res.end(JSON.stringify({ message: "Servidor funcionando con Babel" }));
        return;
    }

    res.writeHead(404);
    res.end();
});

server.listen(PORT, () => {
    console.log(`Servidor escuchando en el puerto ${PORT}`);
});

La configuracion de Babel correspondiente podria ser la siguiente.

{
    "presets": [
        [
            "@babel/preset-env",
            {
                "targets": {
                    "node": "22"
                }
            }
        ]
    ]
}

Los scripts en package.json quedarian de esta forma.

{
    "scripts": {
        "build": "babel src --out-dir dist",
        "start": "node dist/server.js",
        "dev": "babel src --out-dir dist --watch & nodemon dist/server.js"
    }
}

Al ejecutar npm run build se genera el codigo transformado. Luego npm start inicia el servidor. Durante el desarrollo, el script dev mantiene la transformacion en modo watch y reinicia el servidor ante cambios.

Consideraciones de rendimiento y buenas practicas

El uso de Babel introduce una etapa adicional en el proceso de desarrollo y despliegue. Para minimizar el impacto en el rendimiento se recomiendan varias practicas. En primer lugar, se debe limitar el alcance de las transformaciones mediante targets precisos. Compilar para “node”: “current” durante el desarrollo y para una version LTS especifica en produccion reduce la cantidad de codigo transformado.

En segundo lugar, se recomienda habilitar la cache de Babel cuando se utiliza con herramientas de construccion como webpack o en procesos de CI. La cache evita recompilar archivos que no han cambiado.

En tercer lugar, se debe evitar el uso de babel-node y @babel/register en produccion. Estas herramientas estan orientadas al desarrollo y pueden degradar significativamente el tiempo de arranque de la aplicacion.

Finalmente, es aconsejable mantener actualizadas las dependencias de Babel. El equipo de Babel publica actualizaciones frecuentes que mejoran el rendimiento, corrigen errores y agregan soporte para nuevas caracteristicas del lenguaje. Utilizar un archivo de bloqueo como package-lock.json garantiza que todos los miembros del equipo y los entornos de despliegue utilicen exactamente las mismas versiones.

Integracion con herramientas de desarrollo modernas

Babel se integra de forma natural con otras herramientas del ecosistema. Cuando se utiliza TypeScript, se puede combinar @babel/preset-typescript con el compilador de TypeScript para obtener tanto la eliminacion de tipos como la verificacion estatica. En proyectos que emplean ESLint, el parser @babel/eslint-parser permite que el linter comprenda la sintaxis que Babel transforma.

En entornos de monorepo gestionados con herramientas como Nx o Turborepo, Babel puede configurarse de forma centralizada mediante un archivo babel.config.json en la raiz, mientras que cada paquete define sus propios targets si es necesario. Esta arquitectura facilita la consistencia en transformaciones a lo largo de multiples paquetes.

Para aplicaciones que requieren polyfills, Babel 8 recomienda el uso de babel-plugin-polyfill-corejs3 en lugar de las opciones useBuiltIns que existian en versiones anteriores. Este plugin ofrece un control mas fino sobre la inyeccion de polyfills.

Migracion desde versiones anteriores de Babel

Los proyectos que aun utilizan Babel 7 pueden migrar a Babel 8 de forma gradual. El primer paso consiste en actualizar la configuracion de Babel 7 para que se asemeje a los nuevos defaults de Babel 8. Esto incluye definir targets de forma explicita y eliminar opciones como loose o spec que han sido reemplazadas por el sistema de assumptions.

Una vez que el proyecto funciona correctamente con la configuracion modernizada en Babel 7, se procede a actualizar los paquetes a la version 8. Es importante verificar que la version de Node.js cumpla con los nuevos requisitos minimos. Despues de la actualizacion se deben ejecutar las pruebas de la aplicacion para detectar cualquier comportamiento inesperado derivado de los cambios en los defaults de transformacion.

Babel proporciona una guia de migracion detallada que enumera todos los cambios de ruptura y las acciones recomendadas. Seguir esa guia reduce el riesgo de problemas durante la actualizacion.

Conclusion sobre la configuracion de Babel en Node.js

La configuracion de Babel en proyectos Node.js permite aprovechar las caracteristicas mas recientes del lenguaje JavaScript de manera controlada y predecible. Con Babel 8 el proceso se ha simplificado en algunos aspectos, al tiempo que se han introducido requisitos mas estrictos de version de Node.js y un enfoque orientado a ESM. Al seguir los pasos descritos en este tutorial se obtiene un entorno de desarrollo robusto que facilita la escritura de codigo moderno y su ejecucion confiable en diferentes versiones del runtime.

La clave del exito reside en definir targets precisos, utilizar archivos de configuracion de alcance de proyecto y separar claramente el codigo fuente del codigo transformado. Herramientas como el CLI de Babel, @babel/register y @babel/node ofrecen flexibilidad para diferentes fases del ciclo de vida de la aplicacion, desde el desarrollo rapido hasta la construccion optimizada para produccion.

Mantenerse al dia con las actualizaciones de Babel y adaptar la configuracion a medida que el lenguaje evoluciona garantiza que el proyecto continúe beneficiandose de las mejoras en rendimiento y soporte de nuevas sintaxis. Con una configuracion adecuada, Babel se convierte en una pieza transparente e indispensable del flujo de trabajo de desarrollo backend con JavaScript.