2019年,Node.js已经10岁了,npm上的可用包数量超过了100万个。 Node.js本身的下载量继续上升,同比增长40%。 另一个重要的里程碑是Node.js最近加入了OpenJS基金会,该基金会承诺改善项目的健康和可持续性,并改善与整个JavaScript社区的协作。 如你所见,在相对较短的时间内发生了很多事情! Node.js社区每年都有增长势头,2020年没有放缓的迹象。 在Node.js的下一个主要版本中,有许多有趣的特性正在研究中。 在这篇文章中,我将探讨Node.js社区在2020年可以期待的一些最重要的更新。作者:David Neal
译者:前端突击
Node.js版本13有什么新功能?
在撰写本文时,Node.js的最新版本是13。 我们已经有很多功能和更新可以在2020年之前开始使用。 以下是一系列亮点:- ECMAScript模块
- WebAssembly支持
- Diagnostic report 诊断报告
- 对日期, 时间, 数字与货币格式的完全本地化支持
- QUIC协议支持
- V8 JavaScript引擎性能更新
2020年Node.js发布过程
每六个月发布一个新的主要版本Node.js,一个在10月,一个在4月。 此主要版本称为当前版本。 截至本文撰写之时,Node.js的当前版本为13,于2019年10月发布。 奇数版本(如v9、v11和v13)每年10月发布,时间很短,不被视为已准备好投入生产。 你可能认为奇数版本是测试版。 它们是为测试新特性和导致Node.js下一个偶数版本的更改而设计的。 偶数版本(如v8、v10和v12)每年4月发布。 发布后,以前的奇数版本将停止接收更新。 虽然它比奇数版本更稳定,但在未来六个月内仍将积极开发。 你可以把前六个月看作是一个发布候选阶段。 一旦一个偶数版本经过技术准备和优化后,它将进入了一个新的生命阶段,称为长期支持(LTS)。 LTS阶段被视为生产准备阶段。 在接下来的12个月中,LTS版本以不破坏任何现有应用程序的目的接收bug修复、安全更新和其他改进。 在LTS之后,有一个最后的维护阶段。 在维护过程中,Node.js版本只会收到严重的错误和安全修复。 维护期为18个月。 经过18个月的维护,它被视为寿命结束(EOL),不再受支持。预计2020年发布时间表
我们预计在2020年会看到以下的发布时间表。2020年1-3月
- 13.x是当前版本,并且正在开发
- 10.x和12.x是LTS
- 14.x发布并成为当前版本
- 13.x 14.x发布后不久停止工作
- 10.x进入维护
- 15.x发布并成为当前版本
- 14.x进入LTS
- 12.x进入维护
注:
由于节点8.x的生命周期结束(EOL)依赖于OpenSSL-1.0.2,因此计划在2019年底结束,OpenSSL-1.0.2也计划在2019年底结束。
如果还没有来的及升级的,请计划将8.x应用程序迁移到10.x或12.x。
对ECMAScript Modules的支持
从v13.2.0开始,Node.js支持传统的CommonJS模块和新的标准ECMAScript(ES)模块。 这意味着您最终可以使用导入和导出语法,您可能已经在浏览器中运行了客户端JavaScript。 另外,需要注意的是Node.js中的ES模块在默认情况下启用了JavaScript strict模式,因此不必在每个文件的顶部指定“use strict”。// message file
async function sendMessage{ ... }
export { sendMessage };
// index file
import { sendMessage } from "./message"
但是,您仍然需要做一些工作,让Node.js知道您正在使用ES模块。
最常用的两种方法是使用.mjs文件扩展名或在最近的parent package.json文件中指定“type”:
“module”
- 选项1: 将.js文件重命名为 .mjs文件
- 选项2: 更新根package.json文件,或将package.json添加到包含ES模块的文件夹中,并将类型指定为module
{type: module}
另一种可以在根package.json文件中启用ES模块,然后重命名所有CommonJS模块文件以使用.cjs扩展名。
就我个人而言,我觉得.mjs和.cjs扩展有点麻烦,所以我很高兴看到有一些方法可以用package.json文件指定ES和CommonJS模块的用法。
这显示更为简单。
NodeJs能够导入WebAssembly模板了
除了支持ES模块外,还可以导入WebAssembly(Wasm)模块! WebAssembly模块是一种可移植的编译二进制格式,可以比JavaScript更快地解析并以本机速度执行。 WebBaseMead模块可以使用诸如C/C++、GO、C.*、Java、Python、Elixir、Rust等语言来编译。 截至本文撰写时,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 );
})();
也可以用Nodejs动态语法import来引入WebAssembly模块
"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在设计时考虑了安全性,以防止访问任何底层操作系统,有时称为“沙盒”【sandboxed】。 但是,有时Node.js中控件中的WebAssembly模块可能会受益于能够进行系统级调用。 这就是新的WebAssembly系统接口(WASI)出现的地方。 WASI被设计成一个标准接口,用于调用底层系统,如主机应用程序、本机操作系统等。 最初的WASI支持最近被提交到Node.js项目。 WASI是2020年Node.js的另一个激动人心的特性!2020年发布诊断报告 诊断报告是人类可读的JSON格式的流程信息摘要,包括调用堆栈、操作系统信息、加载的模块和其他设计用于帮助支持应用程序的有用数据。 这些报告可以在未处理的异常、致命错误、进程信号或使用新的process.report API时触发。 Node.js可以配置为将诊断报告保存到指定的文件夹和文件名。 截至本文撰写之时,诊断报告仍在实验阶段。 要启用此功能,必须在执行Node.js应用程序时传递命令行标志。 例如:
node --experimental-report --report-uncaught-exception --report-filename=./diagnostics.json index.js
2020年的其他Node.js更新
- QUIC协议支持: 一种用于连接应用程序的现代传输,具有更高的性能和可靠性
- 更好的Python3构建支持: 到2020年,应该可以使用Python3构建Node.js和本机模块
- 更新的V8 JavaScript引擎: V8 v7.8和7.9提高了性能并支持Wasm
-
稳定的工作线程API:Node.js中的Worker threads支持并行的、CPU密集型JavaScript操作