翻译:疯狂的技术宅
作者:David Neal
来源:okta
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。已经有了很多功能和更新,可以在 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 年 1 月 ~ 3 月
2020 年 4 月
2020 年 10 月
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 了。
从 v13.2.0 开始,Node.js 既支持传统的 CommonJS 模块,也支持新的标准 ECMAScript(ES)模块。这意味着你最终能够使用可能已经能够在浏览器中使用的 import
和 export
语法。另外请务必注意,默认情况下 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"
。
.js
文件重命名为 .mjs
文件。package.json
文件,或者把 package.json
添加到包含 ES 模块的目录中,并将 type
指定为 module
。{
"type": "module"
}
另一种可能性是在根 package.json
文件中启用 ES 模块,然后重命名所有 CommonJS 模块文件来使用 .cjs
扩展名。
我个人觉得 .mjs
和 .cjs
扩展名比较粗略,所以我很乐意看到有一些方法可以通过 package.json 文件去指定 ES 和 CommonJS 模块的用法。
除了 ES 模块支持之外,还可以导入 WebAssembly(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 );
} )();
与 JavaScript 相似,WebAssembly 在设计时就考虑到了安全性问题,以防止任何对底层操作系统的访问(有时称为“沙盒”)。但有时 Node.js 中的 WebAssembly 模块可能会因为能够进行系统级调用而受益。
所以就出现了新的 WebAssembly 系统接口(WASI)。WASI 被设计为用于对基础系统(例如主机应用,操作系统等)进行调用的标准接口。
Node.js 项目对 WASI 的支持已经在最近提交。WASI 可能会是另一个能够在 2020 年看到的令人兴奋的功能!
诊断报告是能够供人类阅读的 JSON 格式的过程信息摘要,其中包括调用栈、操作系统信息、已加载的模块以及能够帮助支持应用程序的其他有用的数据。这些报告能够在未处理的异常、致命错误、进程信号或使用新的 process.report
API 时触发。可以在 Node.js 中配置诊断报告,并以指定的文件名保存到文件夹中。
在撰写本文时,诊断报告仍然处于实验阶段。要启用此功能,需要在执行 Node.js 程序时传递命令行标志:
node --experimental-report --report-uncaught-exception --report-filename=./diagnostics.json index.js
从 v13.x 开始,Node.js 带有完整的 ICU(Unicode 的国际化组件)。ICU 是一个成熟且流行的全球化库。包括支持格式化数字、日期、时间和货币,能够执行时间计算和字符串比较,还有 Unicode 和其他字符集之间转换文本的功能。
本文只是开始拉开了 2020 年改进 Node.js 的所有艰苦工作的序幕!如果你有兴趣随时了解最新的更新或想要以某种方式参与其中,请在 Node.js 官网查看为 Node.js 做出贡献的方式【https://nodejs.org/en/get-involved/】 。
原文:https://developer.okta.com/blog/2019/12/04/whats-new-nodejs-2020