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