[原文链接]http://feclub.cn/post/content/16619921558
Node.js 8是下一个进入长期支持(LTS)的发行版。 这将于2017年10月发生。 一旦Node.js 8转换到LTS,它的代号将变为Carbon。
- Async Hooks API 简介
- Async Hooks API 如何在 Node.js 8 中工作的?
- N-API 简介
- Node 8 中 Buffer 安全性的改进
- Pending Deprecations
- 提升对Promises的支持
- Console 的改变
- 静态错误码
- 重定向过程警告
- Stream API 改进
- Debugger 的改变
- 实验性的检查器 JavaScript API
- 将V8升级到5.8:为 TurboFan 和Ingnition 做准备
- npm 升级到 5.0.0
- WHATWG URL parser
- Node.js 8中的其他显着变化
- 异步钩子Async Hooks
- 缓冲区Buffer
- Child Process
- Console
- Dependencies
- Domains
- Errors
- File System
- HTTP
- Lib
- N-API
- Process
- REPL
- Stream
- TLS
- URL
Async Hooks API 简介
Async Hooks(以前称为 AsyncWrap )API允许您获取有关句柄对象生命周期的结构跟踪信息。
API 可以发送消息通知消费者关于 Node.js 中所有句柄对象的生命周期。它可以解决与continuation-local-storage
npm package相同的问题,只不过现在可以在 Node 核心代码中实现。
如果您曾经使用过 continuation-local-storage
,那么现在有了 async hooks ,目前有一个替代方案——cls-hooked
,但目前尚未稳定,因此谨慎使用!
Async Hooks API 如何在 Node.js 8 中工作的?
createHooks
函数可以为每一个异步操作的生命周期注册钩子函数。
const asyncHooks = require("async_hooks")
asyncHooks.createHooks({
init,
pre,
post,
destroy
})
这些函数将根据处理程序的生命周期事件触发。
N-API 简介
N-API是用于编写原生插件的 API。它独立于底层的 JavaScript 运行环境,但作为 Node.js 本身的一部分进行维护。它的目标是使应用程序二进制接口(ABI)在不同 Node.js 版本之间保持稳定。
N-API的目的是将附加组件与底层JavaScript引擎的更改分开,以便原生组件可以在不同版本的 Node 环境中运行并且不需要重新编译。
Node 8 中 Buffer 安全性的改进
在 Node.js 8之前,用new Buffer(Number)
或Buffer(Number)
来创建一个 Buffer,并未将内存初始化为0。因此,新的缓冲区实例可能包含敏感信息,导致安全问题。
虽然这样可以使 Buffer 的创建更快,但对于大多数情况来看,这并不可行。从 Node.js 8 开始,使用new Buffer(Number)
或者Buffer(Number)
的将会自动将内存置为0。如果开发人员希望分配具有未初始化内存的Buffer实例,则应转移到新的Buffer.allocUnsafe(num)
API.
Node.js 8中零值初始化和未初始化的“缓冲区”创建示例如下所示。
// 使用零值初始化Buffers
const safeBuffer1 = Buffer.alloc(10);
const safeBuffer2 = new Buffer(10);
// 未初始化Buffer
const unsafeBuffer = Buffer.allocUnsafe(10);
请注意,虽然目前没有从Node.js中删除Buffer(num)
构造函数的计划,但是已经弃用对其的后续维护。
Pending Deprecations
为了在开发时或CI测试环境中更容易地捕获应用程序中的Buffer(num)
,我们添加一个新的--pending-deprecation
命令行标志和匹配的NODE_PENDING_DEPRECATION = 1
环境变量,这会导致当使用Buffer(num)
(和其他潜在的待弃用的方法)时Node.js发出DeprecationWarning
的进程警告。 为了避免类似这种弃用影响到生产应用程序,默认情况下是停用它们的。 下面显示一个允许未决弃用的示例。
$ ./node --pending-deprecation
> Buffer(num)
<Buffer 00>
> (node:2896) [DEP0005] DeprecationWarning: The Buffer() and new Buffer() constructors are not recommended for use due to security and usability concerns. Please use the new Buffer.alloc(), Buffer.allocUnsafe(), or Buffer.from() construction methods instead.
提升对Promises的支持
Node.js 8.0.0包含一个新的util.promisify()API,它允许在一个返回Promise的函数中包装标准的Node.js回调样式API。 util.promisify()的使用示例如下。
const fs = require('fs');
const util = require('util');
const readfile = util.promisify(fs.readFile);
readfile('/some/file')
.then((data) => { /** ... **/ })
.catch((err) => { /** ... **/ });
Console 的改变
通过Node.js中的console
模块可以将console.log()
, console.error()
和其他方法将应用程序定向输出到stdout
,stderr
或者管道。 在以前,尝试将控制台输出写入到基础流时发生的错误从而导致Node.js应用程序崩溃。 从8.0.0开始,这样的错误将被忽略,从而使console.log()
和其他API更安全。 这将可能通过传递给Console
构造函数的ignoreErrors
配置来维护与错误相关的遗留行为。
静态错误码
我们已经开始为Node.js生成的所有错误分配静态错误码的过程。 然后每个错误都需要一段时间才能被分配一个错误码码,在8.0.0之内已经更新了一些错误。 即使错误类型或消息发生变化,也保证这些错误码不会改变。
错误码以两种方式显示给用户: Codes are manifest to the user in two ways:
Using the code
property on Error
object instances
Printing the [ERR_CODE]
in the stack trace of an Error
例如,调用assert(false)
会生成以下的AssertionError
:
> assert(false)
AssertionError [ERR_ASSERTION]: false == true
at repl:1:1
at ContextifyScript.Script.runInThisContext (vm.js:44:33)
at REPLServer.defaultEval (repl.js:239:29)
at bound (domain.js:301:14)
at REPLServer.runBound [as eval] (domain.js:314:12)
at REPLServer.onLine (repl.js:433:10)
at emitOne (events.js:120:20)
at REPLServer.emit (events.js:210:7)
at REPLServer.Interface._onLine (readline.js:278:10)
at REPLServer.Interface._line (readline.js:625:8)
通过引用Node.js文档,可以快速查询有关静态错误码的信息。 例如,查询有关“ERR_ASSERTION”错误码的信息的 文档
重定向过程警告
使用--redirect-warnings = {file}
命令行参数或匹配NODE_REDIRECT_WARNINGS = {file}
环境变量可以处理诸如deprecations之类的警告,可以将其重定向到一个文件。 默认情况下,不会将警告打印到stderr
,而是将警告写入指定的文件,从而我们将更清晰地分析应用程序的主要输出。
Stream API 改进
对于Stream API的用户,已添加了用于销毁和完成Stream
实例的新标准机制。 每个Stream
实例现在将继承一个destroy()
方法,通过提供_destroy()
方法的自定义实现,可以定制和扩展它们的实现。
Debugger 的改变
Node.js 8正在删除遗留的命令行调试器。 作为命令行替换,node-inspect已经直接集成到Node.js运行时。 此外,以前在Node.js 6中的一项实验功能——V8 Inspector调试器,正在升级为完全支持的功能。
实验性的检查器 JavaScript API
已经引入了用于Inspector协议的新的实验性JavaScript API,使开发人员能够利用调试协议来检查运行的Node.js进程的新方法。
const inspector = require('inspector');
const session = new inspector.Session();
session.connect();
// Listen for inspector events
session.on('inspectorNotification', (message) => { /** ... **/ });
// Send messages to the inspector
session.post(message);
session.disconnect();
请注意,检查器API是实验性的,可能会发生大改变。
将V8升级到5.8:为 TurboFan 和Ingnition 做准备
使用 Node.js 8,底层的V8 JavaScript引擎也会被更新。
它给 Node.js 用户带来的最大的变化就是可以在 V8 5.9中引入TurboFan 和 Ignition 。Ignition 是 V8 的解释器,而 TurboFan 是优化编译器。
“ Ignition 和 TurboFan 管道已经开发了近3½年。它代表了 V8 团队通过测量现实 JavaScript 性能并仔细考虑了当前语言中的缺点而获得的最终结果。这为我们能够在未来几年内继续优化 JavaScript 奠定了基础。- Daniel Clifford 和 V8 团队
npm 升级到 5.0.0
新的 Node.js 8 版本还附带了npm 5 - 最新版本的npm CLI。
npm 新版本的亮点:
一种新的标准化锁定文件的功能,用于跨套件管理器兼容性(package-lock.json),一种新的格式和 shrinkwrap 语义化(类似yarn.lock)。
--save 不再需要,默认情况下将保存所有安装
node-gyp 现在支持 Windows(node-gyp.cmd)
现在将包括sha512和sha1校验。
WHATWG URL parser
从 node 8开始,新的 URL
实现现在是Node.js中完全支持的非实验API。 下面显示了一个示例用法,更多详细信息可在官方文档中看到。
const { URL } = require('url');
const myURL = new URL('/foo', 'https://example.org/');
// https://example.org/foo
这个新的URL实现是最有意义的在于它与现代Web浏览器(如Chrome,Firefox,Edge和Safari)中的URL实现和API相匹配,允许使用URL在不同环境之间共享代码。
Node.js 8中的其他显着变化
异步钩子Async Hooks
- 在内核中已实现
async_hooks
模块
缓冲区Buffer
- 在使用
new Buffer(num)
或Buffer(num)
时,带上--pending-deprecation
将导致Node.js发出一个废弃警告。 new Buffer(num)
andBuffer(num)
会生成零值初始化新的Buffer
实例.- 现在许多
Buffer
方法接受Uint8Array
作为输入
Child Process
- Argument和kill信号验证得到改善
- Child Process方法接受Uint8Array作为输入
Console
- 使用
console
方法时,错误事件发送现在受到了抑制。
Dependencies
- npm客户端已经升级到5.0.0
- V8引擎已经升级到5.8版本并具有向前的ABI兼容性一直到6.0版本
Domains
- 原生
Promise
实例现在是Domain
敏感的
Errors
- 我们已经开始为Node.js生成的错误分配静态错误代码。 这是通过多次提交完成的,目前仍在进行中。
File System
- 实用程序类
fs.SyncWriteStream
已被弃用 - 已弃用的
fs.read()
字符串接口已被删除
HTTP
- 传出的 Cookie 头连接成一个字符串
httpResponse.writeHeader()
方法已被弃用- 改进对用户使用代理的支持
- 溢出的Cookie headers会被连接成一个字符
- 其
httpResponse.writeHeader()
方法已被弃用 - 用于访问HTTP头的新方法已添加到
OutgoingMessage
中。
Lib
- 所有弃用消息已分配静态标识符
- 遗留的
linkedlist
模块已被删除
N-API
- 添加了对新的N-API API的实验性支持
Process
- 可以使用
--redirect-warnings
命令行参数将进程警告输出重定向到文件 - 过程警告现在可能包括额外的细节
REPL
- REPL magic模式已被弃用REPL
Stream
- Stream 现在支持
destroy()
和_destroy()
API
TLS
rejectUnauthorized
选项现在默认为true
URL
WHATWG URL
实现现在是完全支持的 Node.js API