倩妹纸好喜欢喵咪完全木抵抗力

Node v8.0.0 正式发布,一波主要新特性 | Node.js

倩妹纸好喜欢喵咪完全木抵抗力 · 2017-08-30翻译 · 2046阅读 原文链接
接下来发布的这个版本的node.js会带来一系列重大的改变和影响,有太多要点以至于我们无法在这样一篇文章中充分覆盖其特性。但这篇文章包含了其最大改变和特性的总结。

npm version 5.0.0

npm的公司近期 宣布发布了5.0.0版本客户端 我们也非常开心能够在node.js 8.0.0版本中用到这个新版本.

V8 5.8

node.js 8.0.0版本附带了v8引擎的5.8版本的,此版本对JavaScript运行时性能提升了很多,也包括在性能改进和面对开发者人员API的主要提升。对于node.js开发者来说最重大的意义莫过于v8 5.8版本保证了在今后的5.9或者即将来临的6.0版本的ABI兼容性,这也将确保Node.js原生插件系统的稳定性。在Node.js 8的有生之年,我们计划转移到v8的5.9版本或者更有甚者到6.0版本。

V8 5.8引擎同时有助于建立一个新TurboFan + Ignition编译管道的过渡,其承诺给所有node.js应用提供重大的新表现优化。虽然TurboFan and Ignition在V8先前的版本也已经存在,但它还是会在V8 5.9的第一时间默认使用。这种新的编译管道代表了如此重大的一个变化以至于Node.js核心技术委员会(CTC)选择推迟了原计划定于四月的Node.js 8版本的发布,只是为了更好地适应它。

Node.js API (N-API)

对于使用或者开发原生插件的Node.js开发者来说,这个新的实验性的Node.js API(N-API)对于现有的Native Abstractions for Node.js (nan)是一个重大的进步。 它将会允许原生插件在系统上无需重复编译并且可跨多个不同版本的Node.js使用。

通过提供一个新的虚拟机不可知应用程序接口(ABI),原生插件不仅可以在多个版本的V8 javaScript运行,也可以在微软的Chakra-Core运行将成为可能。

N-API在Node.js 8.0.0中还是实验阶段,所以我们应该期待正式的实施和API的重要改变。我们 鼓励开发者们尽快开始使用API 并且希望能够提供反馈,以确保新的API是满足这个生态圈系统的需求。

async_hooks

这个实验性的 async_hooks 模块(以前叫async_wrap)在8.0.0版本中获得重大升级。该诊断API允许开发人员使用监视Node.js事件循环的操作,通过其完整的生命周期跟踪异步请求和处理。 该新模块完整的文档仍然不完整,用户在使用这个实验性的新模块时应格外小心。

WHATWG URL parser

去年,围绕WHATWG URL Standard实施的实验性URLAPI已添加到Node.js 7.x中,自此一直处于积极的发展之中。我们很高兴地宣布,从8.0.0开始,新的URL实现现在是Node.js中完全支持的非实验API。 下面显示了一个示例用法,更多详细信息可在官方文档中看到。

const URL = require('url').URL;

const myUrl = new URL('/a/path', 'https://example.org/');

这个新的URL实现是最有意义的在于它与现代Web浏览器(如Chrome,Firefox,Edge和Safari)中的URL实现和API相匹配,允许使用URL在不同环境之间共享代码。

Buffer changes缓冲区的变化

对Node.js中的BufferAPI进行了一些重要更改。 最重要的是调用不推荐使用的 Buffer(num)构造函数(使用或不使用new关键字)将返回一个零值初始化的Buffer实例。 先前版本的Node.js将返回未初始化的内存,这可能包含潜在的敏感数据。

在Node.js 6.0.0中,一组新的 Buffer构造方法作为调用Buffer(num)构造函数的替代方法被引入,以解决一些安全性和可用性问题。 然而,现有的构造函数在Node.js生态系统中被广泛使用,使我们无法完全弃用或禁用它,而不会导致重大的破坏。

默认情况下没有零值初始化的Buffer(num)的新实例将对性能产生重大影响。 如果开发人员希望分配具有未初始化内存的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()和其他方法将应用程序定向输出到stdoutstderr或者管道。 在以前,尝试将控制台输出写入到基础流时发生的错误从而导致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”错误码的信息的URL是 https://nodejs.org/dist/latest-v7.x/docs/api/errors.html#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是实验性的,可能会发生大改变。

长期支持

Node.js 8是下一个进入长期支持(LTS)的发行版。 这将于2017年10月发生。 一旦Node.js 8转换到LTS,它的代号将变为Carbon。

Node.js Long Term Support Schedule

请注意,在引用Node.js发行版本时,我们已经在Node.js 8中删除了“v”。 以前的版本通常被称为v0.10,v0.12,v4,v6等。为了避免与JavaScript引擎V8混淆,我们删除了“v”并将其称为Node.js 8。

明显变化

  • 异步钩子Async Hooks

  • 缓冲区Buffer

    • 在使用new Buffer(num)Buffer(num)时,带上--pending-deprecation将导致Node.js发出一个废弃警告。 [d2d32ea5a2] #11968.

    • new Buffer(num) and Buffer(num) 会生成零值初始化新的Buffer实例 [7eb1b4658e] #12141.

    • 现在许多Buffer方法接受Uint8Array作为输入 [beca3244e2] #10236.

  • Child Process

  • Console

    • 使用console方法时,错误事件发送现在受到了抑制。 [f18e08d820] #9744.
  • Dependencies

  • Domains

  • Errors

    • 我们已经开始为Node.js生成的错误分配静态错误代码。 这是通过多次提交完成的,目前仍在进行中。
  • File System

  • HTTP

  • Lib

  • N-API

  • Process

    • 可以使用--redirect-warnings命令行参数将进程警告输出重定向到文件 [03e89b3ff2] #10116.

    • 过程警告现在可能包括额外的细节 [dd20e68b0f] #12725.

  • REPL

相关文章