7.25.0 发布:修复 Safari 问题并支持重复命名捕获组
本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →
Babel 7.25.0 正式发布!
@babel/preset-env 现在默认支持正则表达式的重复命名捕获组提案,同时修复了针对 Safari 的类字段问题。此版本还改进了将JSON 模块导入编译为 CommonJS 的支持,并为 @babel/node 的 --eval 模式添加了配置文件支持。
你可以在GitHub 上查阅完整更新日志。
如果你或你的公司希望支持 Babel 和 JavaScript 的发展但不知从何入手,可以通过我们的 Open Collective 进行捐赠,更棒的是直接参与新 ECMAScript 提案的实现!作为志愿者驱动的项目,我们依赖社区支持来资助为广泛 JavaScript 用户服务的各项努力。欢迎通过 team@babeljs.io 联系我们探讨合作!
重点更新
重复命名捕获组 (#16445)
重复命名捕获组提案允许在正则表达式的不同分支中重复使用相同的组名。例如,匹配 dd/mm/yyyy 或 yyyy-mm-dd 格式日期的正则表达式可写作:
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
该提案已在 2024 年 4 月的 TC39 会议上达到 Stage 4,将被纳入下一版 JavaScript 标准。因此它现在已在 @babel/preset-env 中默认启用(根据你的编译目标需求),你可以安全地从配置中移除 @babel/plugin-proposal-duplicate-named-capturing-groups-regex。
若因特殊原因仍需显式声明该插件,其名称已更新为 @babel/plugin-transform-duplicate-named-capturing-groups-regex,以反映该提案已成为标准语言特性。
简化 CommonJS 中的 JSON 模块导入 (#16579)
在 Babel 7.24.0 引入对转换JSON 模块导入的支持后,我们发现生成的代码对 CommonJS 打包工具不够友好。
对于如下代码:
import myConfig from "./config.json" with { type: "json" };
当目标环境为 Node.js 的 CommonJS 时,@babel/plugin-proposal-json-modules 会将其编译为:
const myConfig = JSON.parse(
require("fs").readFileSync(require.resolve("./config.json"))
);
JSON.parse + readFileSync 的组合用于确保 config.json 是纯 JSON 文件,而非试图在加载时执行代码的 config.json.js 文件。
@babel/plugin-proposal-json-modules 现提供 uncheckedRequire 选项来简化输出,代价是降低验证强度。你可以在配置中启用该选项:
{
"plugins": [
["@babel/plugin-proposal-json-modules", { "uncheckedRequire": true }]
]
}
Babel 将生成如下代码:
const myConfig = require("./config.json");
@babel/plugin-bugfix-safari-class-field-initializer-scope (#16569)
早于 16 版本的 Safari 在类字段中的表达式周围使用圆括号时存在一个错误。例如,以下代码会抛出错误:
{
let a = [3];
new class {
c = (a)[0];
};
}
这在使用 Webpack 或编译为 CommonJS 时尤其成问题,因为它们在转换导入时会添加圆括号。例如,以下输入代码:
import { hello } from "./dep";
class A {
prop = hello();
}
会变成
var _dep = /* ... */;
class A {
prop = (0, _dep.hello)();
}
David Taylor 在新的 @babel/plugin-bugfix-safari-class-field-initializer-scope 包中实现了修复(感谢!)。当你的编译目标包括早于 16 版本的 Safari 时,该插件在 @babel/preset-env 中默认启用。