Node.js 8 的重要特性和改进

英文原文地址:The Important Features and Fixes of Node.js Version 8 | @RisingStack
转载该翻译版请注明出处。

随着 Node.js 8的发布(5月30日下午12点发布),我们获得了最新的LTS(长期支持)版本,并具有一系列新功能和性能改进。

在这篇文章中,我们将介绍新的Node.js 8版本的最重要的功能和改进。

James M Snell 的 twitter:与以前的 Node.js 主要版本相比,8.0.0的改进相当巨大,非常多值得称道的。这个版本依然非常稳定,并且经过了良好的测试。

新版本的代号是 Carbon。 8.x 将从2017年10月起成为当前的LTS版本,并将保持到2019年12月31日。这也意味着 Node.js 6.x 将在2018年4月进入维护模式,并在2019年4月到达终身。

Async Hooks API 的介绍

Async Hooks(以前称为AsyncWrap)API允许您获取有关 handle objects 生命周期的结构跟踪信息。

API 发出消息通知消费者 Node.js 中所有 handle objects 的生命周期,它和 npm 包 continuation-local-storage 试图解决同样的问题。

如果您在使用 continuation-local-storage,则已经有使用异步钩子的插件替换,叫做 cls-hooked。但目前尚未正式发布,请谨慎使用!

Async Hooks API 在 Node.js 8 是如何工作的

createHooks 函数注册要异步操作的不同生命周期事件调用的函数。

const asyncHooks = require('async_hooks')

asyncHooks.createHooks({  
  init,
  pre,
  post,
  destroy
})

这些函数将根据处理程序对象的生命周期事件而被触发。

更多内容请看 Async Hooks,或者查看 正在完善的文档

N-API 的介绍

N-API 是用于构建 native addons 的 API。 它独立于底层 JavaScript 运行时,并作为 Node.js 本身的一部分进行维护。 该项目的目标是使应用程序二进制接口(ABI)在不同 Node.js 版本之间保持稳定。

N-API 的目的是将 add-ons 与基础 JavaScript 引擎中的更改分开,以便 native add-ons 可以在不重新编译的情况下运行在不同的 Node.js 版本上。

更多内容请看 N-API.

Buffer 安全性的提升

在 Node.js 8 之前,使用 new Buffer(Number) 构造函数分配的缓冲区没有使用初始化内存为空。 因此,新的缓冲区实例可能包含敏感信息,导致安全问题。

虽然这是一个故意的设计,以提高新的缓冲区创建的性能,对我们大多数人来说,这不是预期的行为。 因此,从 Node.js 8开始,使用 new Buffer(Number) 或 Buffer(Number) 分配的缓冲区将被自动填充为零。

更新 V8 到 5.8: TurboFan 和 Ingnition

伴随 Node.js 8,底层的 JavaScript V8 引擎也更新了。

它给 Node.js 用户带来的最大的变化是引入 TurboFan 和 Ignition。Ignition 是 V8 的解释器,而 TurboFan 是优化编译器。

Ignition 和 TurboFan pipeline 已经开发了近 3½ 年,它代表了 V8 团队从测量实际的 JavaScript 性能并仔细考虑了所有代码和 Crankshaft 的缺点所获得的共识的结果。 “这一个我们能够在未来几年内持续优化 JavaScript 语言的基础。” - 丹尼尔·克利福德和V8队

Currently (well, with V8 versions older than 5.6, so anything below Node.js version 8) this is how the V8 compilation pipeline looks

目前的 V8 编译流水线看起来的样子(V8 版本号低于 5.6,也就是任何 Node.js 8 以下的版本所使用的)

图片来源: Benedikt Meurer

这个流水线最大问题是,新的语言功能必须在流水线的不同部分都实现一遍,增加了额外的开发工作。

图片来源: Benedikt Meurer

这一新流水线大大降低了 V8 团队的技术负担,并且能够实现以前无法实现的改进。

更多内容请看 TurboFan and IgnitionTurboFan Inlining Heuristics

升级 npm 到 5.0.0

新的 Node.js 8 还附带了 npm 5 —— 最新版本的npm CLI 。

这个新的npm版本的亮点包括:

  • 一种新的标准化锁定文件功能,用于跨套件管理器兼容性(package-lock.json),以及用于 shrinkwrap 的新格式和语义,
  • --save 不再需要,所有的安装将默认保存,
  • node-gyp 现在支持 Windows 上使用的 node-gyp.cmd,
  • 新发布的包将包括 sha512 和 sha1 checksums。

Node.js 8 其他明显的改进

Buffer

  • Buffer 的方法现在接受 Uint8Array 作为输入

Child Process

  • 提升了参数和 kill 信号的验证
  • Child Process 的方法接受 Uint8Array 作为输入

Console

  • 使用 Console 方法时发出(emitted)的 Error event 现在被抑制

Domains

  • 原生的 Promise 事例现在能够 Domain aware

File System

  • 工具类 fs.SyncWriteStream 被弃用(deprecated)
  • 被弃用的 fs.read() string 接口被移除

HTTP

  • 传出的 Cookie 头被拼接为一个 string
  • httpResponse.writeHeader() 方法被弃用(deprecated)

Stream

  • Stream 现在支持 destroy() 和 _destroy() APIs

TLS

  • rejectUnauthorized 设置现在默认为 true

URL

  • WHATWG URL 的实现现在是一个完整的 Node.js API

Node.js 8 接下来的动作

Node.js 8 一系列有趣的改进让我们感到惊喜,包括 Async Hooks API。 我们将尽快开始使用新版本,并尽快回复这些功能的更详细的说明。

编辑于 2017-05-31

文章被以下专栏收录