作者:David Neal翻译:疯狂的技术宅
原文:https://developer.okta.com/bl...
未经允许严禁转载
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支持
- 诊断报告
- 对日期、时间、数字和货币格式的全面国际化支持
- 对 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),并且不再受到支持。
预期的 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 进入维护
注意:由于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)模块。这意味着你最终能够使用可能已经能够在浏览器中使用的 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"
。
-
选项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 可以导入 WebAssembly 模块
除了 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 );
} )();
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 做出贡献的方式 。
本文首发微信公众号:前端先锋
欢迎扫描二维码关注公众号,每天都给你推送新鲜的前端技术文章
欢迎继续阅读本专栏其它高赞文章:
- 深入理解Shadow DOM v1
- 一步步教你用 WebVR 实现虚拟现实游戏
- 13个帮你提高开发效率的现代CSS框架
- 快速上手BootstrapVue
- JavaScript引擎是如何工作的?从调用栈到Promise你需要知道的一切
- WebSocket实战:在 Node 和 React 之间进行实时通信
- 关于 Git 的 20 个面试题
- 深入解析 Node.js 的 console.log
- Node.js 究竟是什么?
- 30分钟用Node.js构建一个API服务器
- Javascript的对象拷贝
- 程序员30岁前月薪达不到30K,该何去何从
- 14个最好的 JavaScript 数据可视化库
- 8 个给前端的顶级 VS Code 扩展插件
- Node.js 多线程完全指南
- 把HTML转成PDF的4个方案及实现
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。