Saltar al contenido principal

7.25.0 Lanzado: Correcciones para Safari y grupos de captura con nombres duplicados

· 4 min de lectura
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 →

¡Babel 7.25.0 ya está disponible!

@babel/preset-env ahora incluye por defecto soporte para la propuesta de grupos de captura con nombres duplicados en expresiones regulares, junto con una corrección para campos de clase al compilar para Safari. Esta versión también mejora el soporte para compilar importaciones de módulos JSON a CommonJS y añade compatibilidad con archivos de configuración en el modo --eval de @babel/node.

Puedes consultar el registro completo de cambios en GitHub.

Si tú o tu empresa desean apoyar a Babel y la evolución de JavaScript pero no saben cómo, pueden donar a través de nuestro Open Collective o, mejor aún, colaborar directamente en la implementación de nuevas propuestas de ECMAScript. Como proyecto impulsado por voluntarios, dependemos del apoyo comunitario para financiar nuestros esfuerzos en soportar la amplia gama de usuarios de JavaScript. Contáctenos en team@babeljs.io si desean discutir más detalles.

Destacados

Grupos de captura con nombres duplicados (#16445)

La propuesta de grupos de captura con nombres duplicados permite reutilizar el mismo nombre para grupos en ramas alternativas dentro de una expresión regular. Por ejemplo, una RegExp que coincida con fechas en formato dd/mm/yyyy o yyyy-mm-dd podría escribirse como

let re =
/(?<day>\d\d)\/(?<month>\d\d)\/(?<year>\d\d\d\d)|(?<year>\d\d\d\d)-(?<month>\d\d)-(?<day>\d\d)/;

"21/12/2023".match(re).groups.day; // 21
"2023-12-21".match(re).groups.day; // 21

Esta propuesta alcanzó la Etapa 4 en la reunión de TC39 de abril 2024 y se incluirá en la próxima versión del estándar JavaScript. Por lo tanto, ahora está activada por defecto en @babel/preset-env (cuando sea necesario según tus targets), y puedes eliminar con seguridad @babel/plugin-proposal-duplicate-named-capturing-groups-regex de tu configuración.

Si por alguna razón aún necesitas incluir explícitamente el plugin, ha sido renombrado a @babel/plugin-transform-duplicate-named-capturing-groups-regex al convertirse la propuesta en una característica estándar del lenguaje.

Simplificación de importaciones de módulos JSON en CommonJS (#16579)

Tras introducir soporte para transformar importaciones de módulos JSON en Babel 7.24.0, identificamos que el código generado no era óptimo para bundlers CommonJS.

Dado este código:

import myConfig from "./config.json" with { type: "json" };

@babel/plugin-proposal-json-modules lo compilaría así cuando el destino es CommonJS en Node.js:

const myConfig = JSON.parse(
require("fs").readFileSync(require.resolve("./config.json"))
);

La combinación JSON.parse + readFileSync es necesaria para garantizar que config.json sea realmente un archivo JSON y no un config.json.js que intente ejecutar código subrepticiamente durante la carga.

@babel/plugin-proposal-json-modules incluye ahora una opción uncheckedRequire para simplificar la salida, a costa de menor validación. Puedes activarla en tu configuración:

babel.config.json
{
"plugins": [
["@babel/plugin-proposal-json-modules", { "uncheckedRequire": true }]
]
}

y Babel generará el siguiente código:

const myConfig = require("./config.json");

@babel/plugin-bugfix-safari-class-field-initializer-scope (#16569)

Las versiones de Safari anteriores a la 16 tienen un error al usar paréntesis alrededor de expresiones en campos de clase. Por ejemplo, el siguiente código lanzaría un error:

{
let a = [3];
new class {
c = (a)[0];
};
}

Esto es especialmente problemático al usar Webpack o al compilar a CommonJS, ya que añaden paréntesis al transformar las importaciones. Por ejemplo, este código de entrada:

import { hello } from "./dep";

class A {
prop = hello();
}

se convertiría en

var _dep = /* ... */;

class A {
prop = (0, _dep.hello)();
}

David Taylor implementó una solución (¡gracias!) en el nuevo paquete @babel/plugin-bugfix-safari-class-field-initializer-scope, que está activado por defecto en @babel/preset-env cuando tus objetivos incluyen versiones de Safari anteriores a la 16.