做者:David Nealjavascript
翻译:疯狂的技术宅前端
原文:developer.okta.com/blog/2019/1…java
未经容许严禁转载node
2019 年是 Node.js 诞生的第 10 个年头,npm
上可用的包数量超过了 100 万。 Node.js 自己的下载量也在持续增加,同比增加了 40%。另外一个重要的里程碑是 最近 Node.js加入了 OpenJS 基金会,该基金会承诺改善项目的情况和可持续性,并改善与整个 JavaScript 社区的协做。webpack
正如你所见到的那样,在短期内发生了不少事情!Node.js 社区仍在蓬勃发展,即使是到了 2020 年仍然没有放缓的迹象。git
下一个Node.js 的主要版本正在探索更多有趣的功能。在本文中,我将探讨 Node.js 社区在 2020 年值得期待的一些最重要的更新。github
在撰写本文时 Node.js 的最新版本是 13。已经有了不少功能和更新,能够在 2020 年以前开始试用。如下是一些要点:web
在深刻探讨这些细节以前,先看一下咱们对 Node.js 发布时间表的指望。npm
每六个月发布一次新的 Node.js 主要版本,发布时间分别是四月和十月。其涉及到的主要版本被称为当前 版本。在撰写本文时 Node.js 的当前版本是 13,它于 2019 年 10 月份发布。json
每一年的10月发布编号为奇数的版本(例如 v9,v11 和 v13),其寿命很短,所以不适合生产环境。你能够认为奇数版本是 beta 版本。它们被用于测试 Node.js 的下一个偶数版本中的新功能和更改。
偶数版本(例如 v8,v10 和 v12)于每一年 4 月发布。在发布以后,上一个奇数版本将会中止更新。尽管它比奇数版本更稳定,但在接下来的六个月中将会继续积极开发。能够将前六个月视为“发布候选”阶段。
一旦偶数版本通过六个月的考验,将会进入一个新的阶段,被称为“长期支持”(LTS)。 LTS 阶段被认为能够投入生产。在接下来的 12 个月中,LTS 版本将会进行错误修复、安全更新和其余的一些改进,目的是不破坏任何现有程序。
在 LTS 以后,有一个最后的“维护”阶段。在维护期间 Node.js 版本将会只接收 关键 错误和安全修复程序。在维护阶段持续 18 个月后,会被视为寿命终止(EOL),而且再也不受到支持。
咱们应该指望可以在 2020 年看到如下发布时间表。
2020 年 1 月 ~ 3 月
2020 年 4 月
2020 年 10 月
依赖于 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 作出贡献的方式 。