Node.js在2020年的新功能

1,572 阅读7分钟

作者:David Neal

译者:前端突击

原文:developer.okta.com/blog/2019/1…

2019年,Node.js已经10岁了,npm上的可用包数量超过了100万个。 Node.js本身的下载量继续上升,同比增长40%。 另一个重要的里程碑是Node.js最近加入了OpenJS基金会,该基金会承诺改善项目的健康和可持续性,并改善与整个JavaScript社区的协作。 如你所见,在相对较短的时间内发生了很多事情! Node.js社区每年都有增长势头,2020年没有放缓的迹象。 在Node.js的下一个主要版本中,有许多有趣的特性正在研究中。 在这篇文章中,我将探讨Node.js社区在2020年可以期待的一些最重要的更新。

Node.js版本13有什么新功能?

在撰写本文时,Node.js的最新版本是13。 我们已经有很多功能和更新可以在2020年之前开始使用。 以下是一系列亮点:
  • ECMAScript模块
  • WebAssembly支持
  • Diagnostic report 诊断报告
  • 对日期, 时间, 数字与货币格式的完全本地化支持
  • QUIC协议支持
  • V8 JavaScript引擎性能更新
在深入了解这些更新的详细信息之前,让我们先看看Node.js的发布计划。

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


2020年4月
  • 14.x发布并成为当前版本
  • 13.x 14.x发布后不久停止工作
  • 10.x进入维护


2020年10月
  • 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年国际化支持扩大 从v13.x开始,Node.js使用完整的ICU(Unicode的国际组件)进行编译。 ICU是一个成熟而流行的全球化图书馆。 在许多特性中,ICU包括对格式化数字、日期、时间和货币、执行时间计算和字符串比较以及在Unicode和其他字符集之间转换文本的支持。

2020年的其他Node.js更新
  • QUIC协议支持: 一种用于连接应用程序的现代传输,具有更高的性能和可靠性
  • 更好的Python3构建支持: 到2020年,应该可以使用Python3构建Node.js和本机模块
  • 更新的V8 JavaScript引擎: V8 v7.8和7.9提高了性能并支持Wasm
  • 稳定的工作线程API:Node.js中的Worker threads支持并行的、CPU密集型JavaScript操作



不定期干活,欢迎关注,长按二维码,关注【前端突击】,猎鹰突击,迎难而上,期待你的加入...