Saltar al contenido principal

@babel/register

Traducción Beta No Oficial

Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →

Una de las formas de usar Babel es mediante el gancho de require. Este gancho se vinculará al require de Node y compilará archivos automáticamente al vuelo. Es equivalente al coffee-script/register de CoffeeScript.

Instalación

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

Uso

JavaScript
require("@babel/register");

Todos los archivos posteriores requeridos por Node con las extensiones .es6, .es, .jsx, .mjs y .js serán transformados por Babel.

Polyfill no incluido

Debes incluir el polyfill por separado al usar características que lo requieran, como generadores.

Ignora node_modules por defecto

NOTA: Por defecto, todos los requerimientos a node_modules serán ignorados. Puedes sobrescribir esto pasando una expresión regular de ignorado mediante:

JavaScript
require("@babel/register")({
// This will override `node_modules` ignoring - you can alternatively pass
// an array of strings to be explicitly matched or a regex / glob
ignore: [],
});

Especificación de opciones

JavaScript
require("@babel/register")({
// Array of ignore conditions, either a regex or a function. (Optional)
// File paths that match any condition are not compiled.
ignore: [
// When a file path matches this regex then it is **not** compiled
/regex/,

// The file's path is also passed to any ignore functions. It will
// **not** be compiled if `true` is returned.
function(filepath) {
return filepath !== "/path/to/es6-file.js";
},
],

// Array of accept conditions, either a regex or a function. (Optional)
// File paths that match all conditions are compiled.
only: [
// File paths that **don't** match this regex are not compiled
/my_es6_folder/,

// File paths that **do not** return true are not compiled
function(filepath) {
return filepath === "/path/to/es6-file.js";
},
],

// Setting this will remove the currently hooked extensions of `.es6`, `.es`, `.jsx`, `.mjs`
// and .js so you'll have to add them back if you want them to be used again.
extensions: [".es6", ".es", ".jsx", ".js", ".mjs"],

// Setting this to false will disable the cache.
cache: true,
});

Puedes pasar todas las demás opciones, incluyendo plugins y presets. Ten en cuenta que los archivos de configuración también se cargarán y la configuración programática se fusionará sobre las opciones del archivo de configuración. @babel/register no admite ignore y only en archivos de configuración.

Variables de entorno

Por defecto, el CLI @babel/node y @babel/register guardarán una caché JSON en tu directorio temporal.

Esto mejorará considerablemente el inicio y la compilación de tus archivos. Sin embargo, hay escenarios donde querrás cambiar este comportamiento y existen variables de entorno expuestas para permitírtelo.

BABEL_CACHE_PATH

Especifica una ubicación diferente para la caché.

Shell
BABEL_CACHE_PATH=/foo/my-cache.json babel-node script.js

BABEL_DISABLE_CACHE

Deshabilita la caché.

Shell
BABEL_DISABLE_CACHE=1 babel-node script.js

Compilación de plugins y presets sobre la marcha

@babel/register utiliza el sistema de ganchos require() de Node para compilar archivos sobre la marcha cuando se cargan. Aunque esto es muy útil en general, significa que pueden darse casos confusos donde el código dentro de un gancho require() provoca más llamadas a require, creando un ciclo de dependencias. En el caso de Babel, esto podría significar que durante el proceso en que Babel intenta compilar un archivo del usuario, Babel podría terminar intentando compilarse a sí mismo mientras se carga.

Para evitar este problema, este módulo deshabilita explícitamente la compilación reentrante, es decir, la lógica de compilación de Babel no puede activar más compilaciones de otros archivos sobre la marcha. La desventaja es que si quieres definir un plugin o preset que se compile dinámicamente, el proceso se complica.

La clave es que tu propio código debe cargar primero el plugin/preset. Asumiendo que el plugin/preset carga todas sus dependencias por adelantado, lo que deberás hacer es:

require("@babel/register")({
// ...
});

require("./my-plugin");

Dado que es tu propio código el que activó la carga, y no la lógica interna de @babel/register, esto debería compilar correctamente cualquier plugin/preset que cargue de forma síncrona.

Implementación experimental de Babel 8

También puedes probar la nueva implementación experimental que estará habilitada por defecto en Babel 8 usando:

JavaScript
require("@babel/register/experimental-worker");

Internamente ejecuta Babel de forma asíncrona, por lo que es compatible con archivos de configuración .mjs. Ya puedes usarlo como reemplazo de @babel/register con algunas salvedades:

  • Si especificas opciones de @babel/register programáticamente (usando require("@babel/register")({ /* ... options */ })), debes asegurarte de que sean serializables. Esto significa que no puedes pasar funciones de plugin definidas en línea, sino que debes moverlas a un archivo separado ./my-plugin.js o a un archivo babel.config.js.

  • La nueva implementación sigue siendo experimental: debería tener las mismas características que la actual, pero pueden aparecer nuevos errores y regresiones.

Nota: @babel/register no admite la compilación de módulos ES nativos de Node.js sobre la marcha, ya que actualmente no existe una API estable para interceptar la carga de módulos ES.