跳至主内容

7.27.0 发布:更好的生态系统对齐

· 1 分钟阅读
非官方测试版翻译

本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →

Babel 7.27.0 发布了!

此版本虽然没有重大新功能,但更好地使 Babel 的行为与标准 JavaScript 及其他工具对齐。

代码输出器现在默认会输出正确的 导入属性 语法,不再需要用户显式启用相关选项。

我们还调整了 @babel/preset-typescriptrewriteImportExtensions 选项的行为,修复了与 TypeScript 的 --rewriteRelativeImportExtensions 相比的若干差异。

最后,我们更新了 @babel/parser 中的 estree 兼容性插件,使其能为 装饰器 阶段 3 提案引入的 accessor foo = "val" 类属性生成 AccessorProperty 节点。请注意,出于历史兼容性原因,@babel/parser 仅在 estree 插件的 classFeatures 选项启用时,才会为类特性生成符合 ESTree 规范的 AST。

有多项变更可能对插件作者有益:您可以在 GitHub 上阅读完整的更新日志。

如果您或您的公司希望支持 Babel 和 JavaScript 的发展,但不确定如何操作,您可以通过 Open Collective 向我们捐款,或者更好的是,直接与我们合作实现新的 ECMAScript 提案!作为志愿者驱动的项目,我们依赖社区支持来资助为广泛 JavaScript 用户提供帮助的工作。如需进一步讨论,请通过 team@babeljs.io 联系我们!

重点更新

rewriteImportExtensions 的调整 (#17118)

Babel 7.26.0 增加了对动态 import() 的支持,该功能在使用 @babel/preset-typescriptrewriteImportExtensions 选项时生效,旨在与 TypeScript 新增的 rewriteRelativeImportExtensions 对齐。

然而,我们随后发现处理非相对路径时存在差异:Babel 会将 import("/foo/bar/baz.ts") 重写为 import("/foo/bar/baz.js"),而 TypeScript 会保持原样。由于 Babel 的目标是尽可能镜像 TypeScript 的选项,我们认为这一差异属于缺陷并在 Babel 7.27.0 中修复了它。

默认输出导入属性 (#16977)

Babel 多年前首次实现导入属性时,该提案仍称为"模块属性"且语法不同:

import data from "./data.json" with type: "json";

当我们发布符合标准的导入属性时,保留了现有的生成器行为。这意味着在输出以下 AST 时:

ImportDeclaration {
specifiers: [],
source: StringLiteral("./data.json"),
attributes: [
ImportAttribute { key: Identifier("type"), value: StringLiteral("json") }
]
}

我们会生成 import "./data.json" with type: "json" 而非 import "./data.json" with { type: "json" }

@babel/generator 现在默认会生成 import "./data.json" with { type: "json" } 以匹配标准 JavaScript 语法。但在以下情况下仍会生成旧语法:

  • importAttributesKeyword 选项设为 "with-legacy"

  • AST 是通过 解析 旧语法生成的,此时会在 ImportDeclaration 节点上定义 .extra.deprecatedWithLegacySyntax: true 属性。