前言
时隔一年,Node.js 12 如约而至,正式发布第一个 Current 版本。它将从 2019 年 10 月开始进入长期支持(LTS)版本直到 2022 年 4 月。
该版本带来的新特性:
- V8 更新带来好多不错的特性。
- HTTP 解析速度提升。
- 启动速度大幅提升。
- 更好的诊断报告和堆分析工具。
- ESM 模块更新。
LTS
Node 维护了着两条发布流程线:奇数版本每年的 10 月份发布,偶数版本第二年的 4 月份发布。当一个奇数版本发布后,最近的一个偶数版本会立即进入 LTS 维护计划,一直持续 18 个月(LTS Start)。再之后会有 12 个月的延长维护期(Maintenance Start)。
这两个期间可以支持的变更是不一样的:
- LTS 期间支持的变更:bug fix,安全问题 fix, 文档更新和与未来新特性兼容问题的更新。
- Maintenanece 期间支持的变更:严重的 bug fix,严重的安全问题 fix 或者文档更新。当一个偶数版本发布时,奇数版本只有 2 个月的维护期,再只能乖乖升级。
就目前而言,Node.js 6.x 和 8.x 将在 2019 年末结束 LTS 的支持,大家尽快升级到 10.x 吧。
ESM
自从 ES6 中的标准化以来,import/ exportsyntax 已成为 JavaScript 开发人员的首选模块语法,而 Node 团队一直在努力实现本机化。实验性支持从第 8 阶段的 Node 8.0 开始,并在最新的 Node 版本上迈出了重要的一步。所有主流浏览器都支持 ECMAScript 模块<script type="module">
,因此这是 Node 的一个巨大更新。
// default exports
import module from 'module'
// named exports
import {namedExport} from 'module'
// namespace exports
import * as module from 'module'
V8 引擎更新到 7.4
本次版本更新,也带几个不错的特性:
- 异步堆栈跟踪
- 参数调用不匹配时的调用速度优化
- 更快的 JavaScript 解析速度
- 更快的 await
ECMAScript 新特性支持
随着 V8 的更新,很多 ES 的新规范也落地了,比如支持类的私有变量。
class Greet {
#name = 'World';
get name() {return this.#name;}
set name(name) {this.#name = name;}
sayHello() {console.log(`Hello, ${this.#name}`);
}
}
在类的外部或去 #name
变量会抛出异常
const greet = new Greet()
greet.#name = 'NewName';
// -> SyntaxError
console.log(greet.#name)
// -> SyntaxError
改善了启动性能
Node 将在构建时间之前为内置库构建代码缓存并将其嵌入为二进制文件。主线程能够使用此代码缓存,将启动时间缩短 30%。
HTTP 解析速度提升
默认的 HTTP 解析器切换为 llhttp,性能提升显著
TLS 和安全
Node 12 现在支持 TLS 1.3,它提供更高的安全性和更短的延迟。TLS 1.3 已经成为协议的一个重大更新,并且正在积极地在 Web 上集成。通过实施 TLS 1.3,Node 应用程序将增加最终用户隐私,同时通过减少 HTTPS 握手所需的时间来提高请求性能。此外,默认情况下已禁用 TLS 1.0 和 1.1,并且 crypto 库已删除已弃用的函数。
堆大小分配策略
以前使用默认的 V8 堆大小,相当于 700MB(32 位系统)或 1400MB(64 位系统)。Node 现在将根据可用内存确定堆大小,这将确保它不会使用超过允许的资源。
堆转储功能
Node 12 提供了生成堆转储的功能,从而可以更轻松地调查内存问题。
其他值得关注的更新
- 工作线程不再需要标志
- http 已将其默认解析器更新为 llhttp
- assert 验证所需的参数并调整松散的断言
- buffer 改进使其更稳定和安全
- async_hooks 删除已弃用的功能
本文首发于公众号「前端新视界」,分享前端资讯、技术干货、编码人生,欢迎关注。