2019 年是 Node.js 诞生的第 10 个年头,npm 上可用的包数量超过了 100 万。 Node.js 本身的下载量也在持续增长,同比增长了 40%。另一个重要的里程碑是 最近 Node.js加入了 OpenJS 基金会,该基金会承诺改善项目的状况和可持续性,并改善与整个 JavaScript 社区的协作。

正如你所见到的那样,在短时间内发生了很多事情!Node.js 社区仍在蓬勃发展,即便是到了 2020 年仍然没有放缓的迹象。

下一个Node.js 的主要版本正在探索更多有趣的功能。在本文中,我将探讨 Node.js 社区在 2020 年值得期待的一些最重要的更新。

What's New for Node.js in 2020

Node.js 13 中有什么新功能?

在撰写本文时 Node.js 的最新版本是 13。已经有了很多功能和更新,可以在 2020 年之前开始试用。以下是一些要点:

  • ECMAScript 模块
  • WebAssembly支持
  • 诊断报告
  • 对日期、时间、数字和货币格式的全面国际化支持
  • 对 QUIC 协议的支持
  • V8 JavaScript 引擎性能更新

在深入探讨这些细节之前,先看一下我们对 Node.js 发布时间表的期望。

2020 年的 Node.js 发布进程

每六个月发布一次新的 Node.js 主要版本,发布时间分别是四月和十月。其涉及到的主要版本被称为当前 版本。在撰写本文时 Node.js 的当前版本是 13,它于 2019 年 10 月份发布。

每年的10月发布编号为奇数的版本(例如 v9,v11 和 v13),其寿命很短,因此不适合生产环境。你可以认为奇数版本是 beta 版本。它们被用于测试 Node.js 的下一个偶数版本中的新功能和更改。

偶数版本(例如 v8,v10 和 v12)于每年 4 月发布。在发布之后,上一个奇数版本将会停止更新。尽管它比奇数版本更稳定,但在接下来的六个月中将会继续积极开发。可以将前六个月视为“发布候选”阶段。

一旦偶数版本经过六个月的考验,将会进入一个新的阶段,被称为“长期支持”(LTS)。 LTS 阶段被认为可以投入生产。在接下来的 12 个月中,LTS 版本将会进行错误修复、安全更新和其他的一些改进,目的是不破坏任何现有程序。

在 LTS 之后,有一个最后的“维护”阶段。在维护期间 Node.js 版本将会只接收 关键 错误和安全修复程序。在维护阶段持续 18 个月后,会被视为*寿命终止*(EOL),并且不再受到支持。

Node.js版本生命周期

预期的 2020 年发行时间表

我们应该期望能够在 2020 年看到以下发布时间表。

2020 年 1 月 ~ 3 月

  • 13.x 是*当前*版本,并且正在积极开发中
  • 10.x 和 12.x 是LTS

2020 年 4 月

  • 14.x 发布并成为*当前*版本
  • 14.x 版本发布后 13.x 的相关工作立即停止
  • 10.x 进入维护

2020 年 10 月

  • 15.x 发布并成为*当前*版本
  • 14.x 进入LTS
  • 12.x 进入维护

2020 年 Node.js 新功能发布时间表

注意:由于Node 8.x 的生命周期(EOL)依赖于 OpenSSL-1.0.2, OpenSSL-1.0.2 的生命周期在 2019年底结束,所以计划将Node 8.x 的 EOL 定于2019年底。你应该开始计划将 8.x 程序迁移到 10.x 或 12.x 了。

对ECMAScript模块的支持

从 v13.2.0 开始,Node.js 既支持传统的 CommonJS 模块,也支持新的标准 ECMAScript(ES)模块。这意味着你最终能够使用可能已经能够在浏览器中使用的 importexport 语法。另外请务必注意,默认情况下 Node.js 中的 ES 模块启用了 JavaScript 严格模式,你不必在每个文件的开始都指定 use strict

// message file
async function sendMessage { ... }
export { sendMessage };

// index file
import { sendMessage } from "./message";

但是为了使 Node.js 知道正在使用 ES 模块,你仍然需要做一些工作。最常见的两种方法是使用 .mjs 文件扩展名,或者在最近的父 package.json 文件中指定 "type":"module"

  • 选项1:.js 文件重命名为 .mjs 文件。
  • 选项2:更新根 package.json 文件,或者把 package.json 添加到包含 ES 模块的目录中,并将 type 指定为 module
{
   "type": "module"
}

另一种可能性是在根 package.json 文件中启用 ES 模块,然后重命名所有 CommonJS 模块文件来使用 .cjs 扩展名。

我个人觉得 .mjs.cjs 扩展名比较粗略,所以我很乐意看到有一些方法可以通过 package.json 文件去指定 ES 和 CommonJS 模块的用法。

Node.js 可以导入 W​​ebAssembly 模块

除了 ES 模块支持之外,还可以导入 W​​ebAssembly(Wasm)模块! 这是一种可移植的已编译二进制格式,具有 JavaScript 更快的解析速度,并能够以本机速度执行。可以使用 C/C++、Go、C#、Java、Python、Elixir、Rust 等语言去创建 WebAssembly 模块。

在撰写本文时,WebAssembly 模块支持仍处于试验阶段。要启用此功能,需要在执行 Node.js 程序时传递命令行标志。例如:

node --experimental-wasm-modules index.js

假设你有一个实现为 WebAssembly 模块的图像处理库。使用此 Wasm 模块的语法如下所示。

import * as imageUtils from "./imageUtils.wasm";
import * as fs from "fs";
( async () => {
   const image = await fs.promises.readFile( "./image.png" );
   const updatedImage = await imageUtils.rotate90degrees( image );
} )();

也可以用 Node.js 中新的动态 import() 语句进行导入。

"use strict";
const fs = require("fs");
( async () => {
   const imageUtils = await import( "./imageUtils.wasm" );
   const image = await fs.promises.readFile( "./image.png" );
   const updatedImage = await imageUtils.rotate90degrees( image );
} )();

WebAssembly 系统接口(WASI)

与 JavaScript 相似,WebAssembly 在设计时就考虑到了安全性问题,以防止任何对底层操作系统的访问(有时称为“沙盒”)。但有时 Node.js 中的 WebAssembly 模块可能会因为能够进行系统级调用而受益。

所以就出现了新的 WebAssembly 系统接口(WASI)。WASI 被设计为用于对基础系统(例如主机应用,操作系统等)进行调用的标准接口。

Node.js 项目对 WASI 的支持已经在最近提交。 WASI 可能会是另一个能够在 2020 年看到的令人兴奋的功能!

2020 年发布诊断报告

诊断报告是能够供人类阅读的 JSON 格式的过程信息摘要,其中包括调用栈、操作系统信息、已加载的模块以及能够帮助支持应用程序的其他有用的数据。这些报告能够在未处理的异常、致命错误、进程信号或使用新的 process.report API 时触发。可以在 Node.js 中配置诊断报告,并以指定的文件名保存到文件夹中。

在撰写本文时,诊断报告仍然处于实验阶段。要启用此功能,需要在执行 Node.js 程序时传递命令行标志:

node --experimental-report --report-uncaught-exception --report-filename=./diagnostics.json index.js

国际化支持将在 2020 年扩展

从 v13.x 开始,Node.js 带有完整的 ICU(Unicode 的国际化组件)。 ICU 是一个成熟且流行的全球化库。包括支持格式化数字、日期、时间和货币,能够执行时间计算和字符串比较,还有 Unicode 和其他字符集之间转换文本的功能。

2020 年 Node.js 的其他更新

  • QUIC 协议支持:一种现代传输方式,具有增强的性能和可靠性。
  • 更好的 Python 3 构建支持:在 2020 年,应该可以用 Python 3 构建 Node.js 和本机模块。
  • 更新的 V8 JavaScript 引擎: V8 的 7.8 和 7.9 版本提高了性能并支持 Wasm。
  • 稳定的 Workers Threads API: Node.js 中的 Worker 线程能够支持并行的、占用大量 CPU 的 JavaScript 操作。

了解有关 Node.js,JavaScript 和安全性的更多信息

本文只是开始拉开了 2020 年改进 Node.js 的所有艰苦工作的序幕!如果你有兴趣随时了解最新的更新或想要以某种方式参与其中,请在 Node.js 官网查看为 Node.js 做出贡献的方式