7.15.0版发布——黑客式管道、TypeScript常量枚举和Rhino目标支持

137 阅读4分钟

7.15.0版发布——黑客式管道、TypeScript常量枚举和Rhino目标支持

该版本默认启用了解析顶级等待(5月会议上的第4阶段)和转换私有字段的人体工程学品牌检查(7月会议上的第4阶段)。现在还支持Hack风格的流水线操作符。我们还改进了对TypeScript的支持,实现了对const 枚举和命名空间别名的转换支持,我们还扩展了我们的启发式方法,将.displayName 添加到由React.createContext() (#13501)创建的React组件。

我们还引入了一个新的编译器假设。 noIncompleteNsImportDetection来在编译ECMAScript模块到CommonJS时产生一个更小的输出,而不用担心模块循环造成的部分初始化命名空间导入。

此外,你现在可以指定Rhino作为编译目标。

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

我们非常感谢社区在过去几个月里对我们的支持,自从我们在5月更新了资助职位后。如果你想讨论赞助的问题,请联系team@babeljs.io!

亮点

默认启用ECMAScript功能

在过去的两次会议上,针对私有字段的 顶级await符合人体工程学的品牌检查提案达到了第四阶段:

import * as db from "database";

await db.connect(); // top-level await

class DBConnector {
  #password;
  static isConnector(obj) {
    return #password in obj; // ergonomic brand checks
  }
}

Babel现在默认支持它们,所以您可以从配置中删除以下插件:

  • @babel/plugin-syntax-top-level-await
  • @babel/plugin-syntax-private-property-in-object
  • @babel/plugin-proposal-private-property-in-object

请注意,Babel目前只能解析顶层await ,不能进行转换:

TypeScript的新特性

TypeScript 4.4并不包括任何我们必须实现的新语法,除了一个小限制:你不能指定抽象类字段的值。

abstract class C {
    abstract prop = 1; // now a SyntaxError!
}

然而,我们确实添加了两个我们长期以来一直缺少的TypeScript功能:const enums和命名空间别名(import Alias = Namespace)。

之前我们在使用const enums时出现了一个错误,因为它需要类型信息才能正确编译。作为一种变通方法,社区建立的插件,如 babel-plugin-const-enum.Babel现在在编译枚举时忽略了const 修改器,这与TypeScript在使用--isolatedModules 选项时的行为一致。

如果你想要一个更优化的输出,类似于TypeScript产生的默认代码,你可以启用 optimizeConstEnums@babel/plugin-tranform-typescript@babel/preset-typescript 选项。

// Input
const enum Animals { Dog }
console.log(Animals.Dog);

// Output (default)
var Animals;
(function (Animals) {
  Animals[Animals["Dog"] = 0] = "Dog";
})(Animals || (Animals = {}));

console.log(Animals.Dog);

// Output with `optimizeConstEnums`
console.log(0);

黑客式管道操作符支持

"Hack-style pipelines "流水线操作符提案的一种新风味,旨在取代 "智能混合 "的变体。

黑客式管道要求你总是使用一个 "主题标记"(如# )来引用前一个管道步骤的值:

// Input
"World"
  |> `Hello, ${#}!`
  |> alert(#);

// output
var _ref, _ref2;

_ref2 = (_ref = "World", `Hello, ${_ref}!`), alert(_ref2);

你可以通过启用 中的选项来测试这个建议。 proposal: "hack"@babel/plugin-proposal-pipeline-operator选项来测试这个建议。你还必须选择使用哪个主题标记,在"#""%" 之间。

// babel.config.json
{
  "plugins": [
    ["@babel/plugin-proposal-pipeline-operator", {
      "proposal": "hack",
      "topicToken": "#"
    }]
  ]
}

为Babel 8准备@babel/eslint-parser

在过去的几个月里,我们一直在缓慢地继续进行Babel 8的工作。我们还没有为Babel 8的测试版做好准备,但我们已经开始暴露出第一批实验性的变化。

我们计划将Babel从CommonJS完全转换为ECMAScript模块,但这有一个问题:配置加载将更多地采用异步方式,而@babel/eslint-parser 只能同步工作(因为ESLint只支持同步解析器)。

@babel/eslint-parser 7.15.0暴露了一个新的入口: 。它将Babel配置加载和解析任务转移到一个单独的worker上,由主线程同步管理,同时仍然支持异步配置加载。作为Babel 7的一个直接优势,它允许使用本地ECMAScript模块来处理Babel配置文件,即使在使用 。@babel/eslint-parser/experimental-worker @babel/eslint-parser

您可以帮助我们,现在就在您现有的项目中测试它,并在我们的问题页面上报告任何错误:

// .eslintrc.js
module.exports = {
  parser: "@babel/eslint-parser/experimental-worker"
};

ℹ️这个入口需要Node.js >= 12.3.0