7.11.0发布:在preset-env中支持ECMAScript 2021,支持TypeScript 4.0,打印配置和`babel-eslint`的未来

274 阅读5分钟

7.11.0发布:preset-env中的ECMAScript 2021支持,TypeScript 4.0支持,打印配置和`babel-eslint`的未来

我们刚刚发布了Babel的一个新的小版本!

这个7.11版本包括

  • preset-env 支持逻辑赋值 ( )、数字分隔符 ( )和命名空间的重新输出 ( )??=``1_2``export * as ns from ...
  • 支持TypeScript 4.0
  • 解析器支持Stage-1Decimal提案(7.11m)
  • 一个环境标志来打印给定文件的已解决的Babel配置 (BABEL_SHOW_CONFIG_FOR)

除此以外,我们现在发布了babel-eslint 的后续版本:@babel/eslint-parser!

你可以在GitHub上阅读整个更新日志。

此外,如果你有任何问题或想讨论的东西,我们已经在我们的仓库上启用了GitHub讨论功能

如果你或你的公司想支持Babel和JavaScript的发展,但不确定如何支持,你可以在我们的开放集体中为我们捐款,更好的是,直接和我们一起实现ECMAScript的新提案作为一个志愿者驱动的项目,我们依靠社区的支持来资助我们支持广大的JavaScript用户。如果你想讨论更多,请联系team@babeljs.io!

支持ECMAScript 2021(#11864)

在上次会议中,TC39将逻辑赋值和数字分隔符的提案移到了第四阶段!Babel已经通过支持这些提案来支持这些提案。Babel已经通过@babel/plugin-proposal-logical-assignment-operators@babel/plugin-proposal-numeric-separators 插件支持这些提议。现在它们被包含在@babel/preset-env ,并根据你的目标进行编译,就像其他ECMAScript特性一样。

逻辑赋值

逻辑赋值提供了一个结合逻辑运算符和赋值表达式的速记符号。

this.disabled ??= false;
this.disabled ?? (this.disabled = false);

clicked &&= !isDoubleClicked();
clicked = clicked && !isDoubleClicked();

hasDups ||= (prev === cur);
if (!hasDup) hasDups = (prev === cur);

数值分隔符

数字分隔符(_)是一个可以在数字字段中的数字之间插入的字符,以帮助实现视觉上的分隔。

1_000_000_000
0.000_000_000_1

(#11849导出命名空间

一个导入的模块可以作为一个新的命名空间重新导出。

export * as ns from "mod";

ℹ️这已经包含在ECMAScript 2020中了,但还不被@babel/preset-env 支持。

从7.11版本开始,如果caller 支持的话,@babel/preset-env 会跳过@babel/plugin-proposal-export-namespace-from :这可以让export * as ns 按原样直接被捆绑器处理。注意babel-loader@rollup/plugin-babel 还没有告诉 Babel 他们支持这种语法,但我们正在和相关的维护者一起研究。

如果设置了{ modules: false } ,Babel会认为转码后的代码会在有本地ESM支持的引擎中运行。export * as ns ,就像其他ECMAScript特性一样,会基于targets 进行编译。

如果您打算捆绑转置的代码,请删除{ modules: false } 选项。默认情况下,preset-env 将根据callerbabel-loader@rollup/plugin-babel 传递的数据来决定模块的转换。

{
  "presets": [
    ["@babel/env", {
      "targets": ["defaults"],
-     "modules": false,
    }]
}

如果你为modules 选项提供了一个不同的值,export * as ns 将始终被转换。


如果你直接使用任何一个

  • @babel/plugin-proposal-export-namespace-from
  • @babel/plugin-proposal-logical-assignment-operators
  • @babel/plugin-proposal-numeric-separators

你可以从你的配置中删除它们,因为它们将被默认包含。

{
  "presets": [
    ["@babel/env", { "targets": ["defaults"] }]
  ],
  "plugins": [
-   "@babel/plugin-proposal-export-namespace-from",
-   "@babel/plugin-proposal-logical-assignment-operators",
-   "@babel/plugin-proposal-numeric-separators"
  ]
}

支持TypeScript 4.0

TypeScript 4.0引入了几个新特性

变体元组类型

你现在可以在元组类型中指定通用的传播,传播可以在任何位置。

type Arr = readonly any[];

function collect<L extends Arr, M extends Arr>(b: boolean, l: L, m: M): [boolean, ...L, ...M] {
  return [b, ...l, ...m];
}

标记的元组元素

元组元素现在可以被标记了:

type Log = [failed: boolean, reason?: Error, ...stacks?: string[]]
// same as
type Log = [boolean, Error?, string[]?];

unknown on 条款绑定catch

你可以指定catch 子句变量的unknown 类型:

try {
  // ...
} catch (e: unknown) {
  // type error! Error() only accepts string | undefined
  throw new Error(e);

  if (typeof e === "string") {
    // e is a string
    throw new Error(e);
  }
}

请注意,目前只有unknownany 允许抓取绑定类型注释。@babel/parser 不执行这种检查,因为类型别名 (type ANY = any) 和交叉 (any | unknown) 都不是在编译时评估的。

从Babel 7.11开始,你可以使用这些新功能,而不需要改变任何配置。欲了解更多信息,请查看TypeScript 4.0公告

十进制字面分析器支持

十进制文字提案(Stage 1)提供了一个十进制数字的符号,类似于BigInt和整数。

0.1m + 0.2m === 0.3m; // true

Babel现在支持解析这些字面符号:您可以在Babel配置中添加@babel/plugin-syntax-decimal 插件,如果您直接使用@babel/parser ,可以启用decimal 插件。Babel不提供小数的polyfill实现。

打印配置

Babel可以通过多种方式进行配置(以编程方式或通过JSON/JavaScript配置)。然而,这种灵活性并不是免费的:要了解您的项目中哪些是适用的配置文件,以及Babel如何合并这些配置,可能会很困难。你也可以间接地使用Babel,而配置是由驻扎在你的node_modules中的一个包生成的。所有这些用例都表明,需要一种方法来输出配置信息,以帮助调试任何编译问题。

Babel 7.11为此提供了一个环境变量:

# *nix or WSL
BABEL_SHOW_CONFIG_FOR=./src/myComponent.jsx npm start
$env:BABEL_SHOW_CONFIG_FOR = ".\src\myComponent.jsx"; npm start

将打印应用在src/myComponent.jsx 的有效配置。

请查看配置的详细用法和输出示例。

@babel/eslint-parser

babel-eslint 已经被移到了Babel的Monorepo中,有了新的名字: 。它在Babel和ESLint之间提供了更好的整合,并具有完整的ES2020支持。在《@babel/eslint-parser babel-eslint》博文中,Kai补充了更多关于 的状态。@babel/eslint-parser