「译」Babel 7.12.0 released,快来瞧瞧有哪些亮点

软件建
• 阅读 1730

前言

「译」Babel 7.12.0 released,快来瞧瞧有哪些亮点
本文系 Babel 官方 Blog 翻译,原文地址:https://babeljs.io/blog/2020/10/15/7.12.0

正文开始

2020 年 10 月 15 日

我们刚刚发布了 Babel 的新的次要版本!

这次发布包括对新的 TypeScript 4.1 beta features:template literal typeskey remapping in mapped types

另外,我们实现了两个新的 ECMAScript 提案:class static blocksimports and exports with string names

过去,我们将 @babel/plugin-sytax-module-attributes(以及相应地解析器插件 moduleAttributes)重命名为 @babel/plugin-syntax-import-assertions(和 importAssertions),为了匹配近期的提案更新。旧的插件可以在 Babel 8 之前运行,但是现在已启用。

你可以在 GitHub 上阅读完整的更改日志。

最重要的部分

TypeScript 4.1(#12129#12131

TypeScript 4.1 beta 宣布于几星期前,它包括了新功能的类型。

Template Iiteral types 允许使用模板字面量语法在类型级别上连接字符串:

type Events = "Click" | "Focus";

type Handler = {
  [K in `on${Events}`]: Function
};

const handler: Handler = {
    onClick() {}, // Ok
    onFocus() {}, // Ok
    onHover() {}, // Error!
};

key remapping in mapped types 一起,他们可以用于标识复制的对象转化:

type Getters<T> = {
    [K in keyof T as `get${Capitalize<K>}`]: () => T[K]
};

interface Dog { name: string; age: number; }

const lazyDog: Getters<Dog> = /* ... */;
lazyDog.getName(); // string
lazyDog.age; // error!

你可以在发布公告中阅读有关 TypeScript 4.1 的更多信息,或查看有关这些功能将释放哪些功能的其他示例。但是,请记住 TypeScript 4.1 仍然处于实验阶段!

Class static blocks(#12079#12143

Babel REPL 示例
class C {
  static #x = 42;
  static y;
  static {
    try {
      this.y = doSomethingWith(this.#x);
    } catch {
      this.y = "unknown";
    }
  }
}

在阶段 2(stage 2 proposal)的提案中,你可以在评估类定义时应用其他静态变量的初始化。它不是要替换静态字段,而是要启用之前无法完成的新用例。在上面的示例中,静态属性 y 使用 #x 初始化。如果doSomethingWith(this.#x) 抛出异常,y 将由默认值 unknown 分配。

你可以在提案描述中阅读更多有关信息。

感谢 JunLiang,你可以通过安装 @babel/plugin-proposal-class-static block 插件并添加到你的 Babel config 中来测试这个提案。由于,你可能已经在使用其他类似功能插件,因此,请确保将其他插件放在它之前:

{
  "plugins": [
    "@babel/plugin-proposal-class-static-block",
    "@babel/plugin-proposal-class-properties"
  ]
}

Imports and exports with string names(#12091

这是在上次 TC 39 会议期间达成的共识,通过这个 PR 来允许字符串作为导入和导出变量的名称。

// emojis.js
let happy = "wooo!";
export { happy as "?" };

// main.js
import { "?" as smile } from "./emojis.js";
console.log(smile); // wooo!

这将允许跨模块使用任何有效的 UTF-16 的名称,从而使得 JavaScript 与其他语言(例如 WebAssembly)完全兼容。

你可以通过在配置中添加 @babel/plugin-syntax-module-string-names 来解析支持这个功能:

// babel.config.json
{
  "presets:" ["@babel/preset-env"],
  "plugins": [
    "@babel/syntax-module-string-names"
  ]
}

这个语法一旦合到主要的 ECMAScript 规范中,就会默认启用该功能。

请注意,这无法将任意字符串转为 ES 2015 风格的导入和导出:仅在针对其他模块系统,例如 CommonJS。

Import assertions parsing(#12139

module arrtibutes 提案已进行了重大更改,并且也重命名为 import assertions

我们已经实现了对该提案新版本的解析支持,可以使用 @babel/plugin-syntax-import-assertions 插件(或者,如果你直接使用 @babel/parser,则可以使用 importAsserttions )启用该提案。

 {
   "plugins": [
-    ["@babel/syntax-module-attributes", { "version": "may-2020" }]
+    "@babel/syntax-import-assertions"
   ]
 }

其最重要的语法改变是 with 关键词会被 assert 替换,并且断言 assertions 现在会用大括号包裹起来:

import json from "./foo.json" assert { type: "json" };

import("foo.json", { assert: { type: "json" } });

你可以在提案 README中查看更多有关这些改变的信息。

⚠️ @babel/plugin-syntax-module-attributes 直到我们发布 Babel 8.0.0 前都将会正常工作,但是不再维护,所以我们强烈建议迁移到新的插件。

❤️ 爱心三连击

通过阅读,如果你觉得有收获的话,可以爱心三连击!!!
「译」Babel 7.12.0 released,快来瞧瞧有哪些亮点

点赞
收藏
评论区
推荐文章
20pzqm 20pzqm
3年前
遇到几个前端小问题
babel问题babel是负责转换ES新版本语法到老版本js上的。比如解构语法...程序有如下报错SyntaxError:Unexpectedtoken8|letdataModulebuildfailed:Error:NoPostCSSConfigfoundin:E:\CODE\xxxxxx新建.pos
Jacquelyn38 Jacquelyn38
4年前
React.js中JSX的原理与关键实现
在开始开发之前,我们需要创建一个空项目文件夹。安装1.初始化npm init y2.安装webpack相关依赖npm install webpack webpackcli D3.安装babelloader相关依赖npm install babelloader @babel/core @babel/presetenv D4.
梦
5年前
微信小程序new Date()转换时间异常问题
微信小程序苹果手机页面上显示时间异常,安卓机正常问题image(https://imghelloworld.osscnbeijing.aliyuncs.com/imgs/b691e1230e2f15efbd81fe11ef734d4f.png)错误代码vardate'2021030617:00:00'vardateT
Stella981 Stella981
4年前
Babel配置中的presets、plugins、各个阶段stage的含义
什么是BabelBabel官方文档:https://babeljs.io/Babel 中文文档:https://www.babeljs.cn/我们知道各个浏览器对JavaScript版本的支持各不相同,很多新的语法无法直接在浏览器中运行,为了解决这个“沟通不畅”的问题,所以就有了Babel,Babel主要用于将ECMAScrip
Stella981 Stella981
4年前
Babel Installation
1\.Installationnpminstallsavedevbabelloaderbabelcore2\.UsageviaConfigvarPersonrequire("babel!./Person.js").default;newPerson();viaL
Stella981 Stella981
4年前
ES6 系列之 Babel 是如何编译 Class 的(下)
_摘要:_ 前言在上一篇\《ES6系列Babel是如何编译Class的(上)》\(https://github.com/mqyqingfeng/Blog/issues/105),我们知道了Babel是如何编译Class的,这篇我们学习Babel是如何用ES5实现Class的继承。ES5寄生组合式继承\
Stella981 Stella981
4年前
Babel 和 PostCss 的一些基本配置
Babel是一个javascript编译器,PostCSS是一个样式转换工具。两者都可以看作是一个转化平台,我们可以在上面使用一些插件,来达到想要的代码转化。几乎每个前端项目都要使用它们。Babel配置.babelrc文件{"presets"://babe
Stella981 Stella981
4年前
ES6学习之Babel的正确安装姿势(我已测,可以在alt+F12命令行实时转ES5)
本文介绍Babel6.x的安装过程~首先呢,可以使用Babel在线转换 https://babeljs.io/repl/(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fbabeljs.io%2Frepl%2F)!(https://static.oschina.net
Stella981 Stella981
4年前
Babel
Babel是JavaScript编译器,主要用于将ECMAScript2015版本的代码转换为向后兼容的JavaScript语法,以便能够运行在当前和旧版本的浏览器或其他环境中.中文官方地址https://www.babeljs.cn/(https://www.oschina.net/action/GoToLink?urlhttps%
Stella981 Stella981
4年前
Babel 学习笔记
在Github上Fork了别人的代码,在package.json中看到了很多与Babel有关的包,很是不解他们之间的关系。本文为Babel学习过程中记录的笔记,(建议直接去Babel官网(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fbabeljs.cn%2F
Stella981 Stella981
4年前
Babel:plugin、preset的区别与使用
关注“重度前端”助力前端深度学习━━━━━前言在现代大前端的生态环境下,相信大部分前端同行都用过babel,也知道babel的作用以及相关的配置和使用,本文不说如何配置和使用,老张想从一个宏观的角度去理解babel,理解它的机制,希望可以在后续的使用中不至于存在那么多的迷惑。本文概览简单