您需要了解的有关新Node.js的所有内容8

null

Node.js的最新主要版本为JavaScript社区带来了许多重大改进,包括更新的JavaScript引擎,npm版本5,Google的V8,Node.js API,async_hooks,WHATWG URL解析器,更安全的缓冲区等等。在这里,我们将向您介绍这些功能以及此版本的其他最重要的方面。

Node.js 8以代号Carbon发布,现在可以从Node.js站点。在进入维护模式之前,它将继续积极工作18个月(没有新功能,只是错误修复,安全性改进和npm更新)。与以前的版本一样,在维护模式下,版本只会收到重要的安全更新和错误修复。

可以肯定地说,自从Node.js出现以来,这是运行时曾经收到的最大的更新之一 - 它改变了本地附加组件的编写方式,并且还带来了额外的安全性和性能改进。

RisingStack通过培训,咨询或开发,Node.js四年来一直在帮助公司取得成功。我们遇到的最大的困难之一是向项目添加本机依赖项。

在Node.js 8之前,如果应用程序依赖于具有本机代码的模块,那么每当主要的新Node.js版本到达时,作为应用程序维护者,您必须重新编译依赖项。如果你很幸运,他们最初工作。

这个过程是通过巨大的工作模块维护人员使他们的模块跨不兼容的Node.js版本工作而实现的,主要是在一个名为NAN(Node.js Native Abstractions)的模块的帮助下。

这个过程远非理想,因为许多公司如果无法编译就无法更新其依赖项,并且还会给模块维护者带来巨大的额外工作量。为解决此问题,引入了Node.js API(或N-API)。

01.输入Node.js API

Machine agnostic: Native modules now work with Microsoft’s Chakra as well as different Node.js versions

机器不可知:本机模块现在可以与Microsoft的Chakra以及不同的Node.js版本一起使用

Node.js API是Node.js 8最重要的改进之一。它为Node.js带来了一个定义良好的ABI(应用程序二进制接口),以使其虚拟机不可知。这意味着本机模块不仅可以使用Google的V8 JavaScript引擎使用不同的Node.js版本,还可以使用Microsoft的Chakra。

目前,N-API处于实验状态,这意味着实现和API都可能发生重大变化。有了这个说法,鼓励本机模块维护者尝试新的界面并提供反馈。

如果您是模块维护者,则可以与主模块版本并行发布模块的N-API版本。为此,官方建议将n-api标签的模块版本发布到npm。

要发布N-API版本,您必须:

  1. 正常发布非N-API版本。
  2. 发布N-API版本:
  • 通过添加破折号更新package.json文件中的版本Napi标签- 所以如果你以前有1.0.0,那就变成了1.0.0-napi
  • 使用npm Publish发布到npm--tag N-api

这样您就可以确保N-API版本不会成为最新版本,因此如果有人安装了您的模块,默认情况下他们会获得非N-API版本。

Yarn是由Facebook工程师创建的包管理器,于2016年10月发布。它试图解决官方npm客户端的一些缺点,主要是通过提高性能和确定性。大多数这些创新也在第5点也有。

02.向下午5点问好

就像Yarn一样,npm 5引入了一个锁文件机制 - 每当你为你的项目安装一个新的依赖项时,它都会自动添加,而不仅仅是的package.json,但是一个名为的新文件包lock.json同样。

你可能会问,它们之间有什么区别包lock.jsonNPM-shrinkwrap.json,因为npm-shrinkwrap永远都在npm?长话短说,它们基本相同,但是包lock.json自动创建。

他们的目的是准确描述npm必须为您的包创建的依赖树。如果你有两个,NPM-拆封将优先考虑。根据npm的推荐,你应该使用NPM-shrinkwrap.json如果你想发布它,那么你的模块消费者也会使用它。另一方面,您应该在内部使用package-lock.json - 甚至检查存储库。

但是对于npm 5的改进并没有因添加锁定文件而停止 - 使用新版本,您正在安装的所有模块也会自动保存,并且它们都会添加到您的的package.json包lock.json文件。

npm脚本的工作方式也发生了一些变化。首先,预先安装的脚本现在先于其他所有脚本运行,因此他们可以在CLI实际读取之前修改node_modules目录。除此之外,还增加了两个新脚本 - 预包装和后包装。它们都运行在npm pack和npm发布,但不在npm install上运行。

Node.js的核心是JavaScript引擎,它解释您的JavaScript代码,从中创建字节码并让您的应用程序运行。使用新的Node.js 8版本,这也得到了更新。

03.更新了JavaScript引擎

Big news: Node.js will be able to update the V8 engine without a major release

重大新闻:Node.js将能够在没有主要版本的情况下更新V8引擎

通过更新的V8引擎,引入了主要的性能改进 - 但更重要的是,它保证具有向前兼容的应用程序二进制接口。这意味着Node.js将能够在没有主要Node.js版本的情况下更新V8引擎。

这一点至关重要,因为较新版本的V8引擎将引入一个新的编译器管道,这将为Node.js带来进一步的性能改进。此更新非常重要,这是原始Node.js 8发布日期推迟的原因。

当前的管道过于复杂,引入新的语言功能通常意味着触及管道的多个部分。使用新的管道,它将变得更加简单。

Ignition,新的解释器和TurboFan,新的优化编译器,已经开发了近三年半。它们是构建新语言功能的基础。它们包括Google的V8团队从测量现实JavaScript应用程序中收集的经验。

04.欢迎Async Hooks

为了更好地理解Async Hooks是什么,让我们退后一步,先掌握继续本地存储。它们在线程编程中像线程本地存储一样工作,但在Node.js中它使用回调来传递上下文。

想象一下,您正在编写一个从数据库中提取产品的应用程序,然后您希望在HTML响应中将其发送出去:

const createNamespace = require('continuation-local-storage')。createNamespace const session = createNamespace('my-app-session')const db = require('。/ db.js')function onRequest(options,next){db .fetchUserById(options.id,function(error,user){if(error){return next(error)} session.set('user',user)next()})

稍后,如果要访问用户对象,您需要做的就是从本地存储中获取它:

const getNamespace = require('continuation-local-storage')。getNamespace const session = getNamespace('my session')const render = require('./ render.js')function finish(response){const user = session.get ('user')render({user:user})。pipe(response)}

应用程序性能监视提供程序(如Trace By RisingStack)广泛使用此技术来保留执行上下文并从生产系统收集监视信息。

使用Async Hooks,类似的功能被移动到Node.js核心 - 它有助于跟踪异步请求和处理程序的生命周期。该Async_hooks模块提供了一个API来注册回调,跟踪Node.js应用程序内部创建的异步资源的生命周期。

05.改善承诺支持

在Node.js 8之前,如果你想在使用Promises的应用程序中使用核心模块,你必须手动包装核心模块,以便它们可以以相同的方式使用。它看起来像这样:

const fs = require('fs')function readFilePromise(... args){return new Promise((resolve,reject)=> {fs.readFile(... args,(err,result)=> {if(err) ){return resolve(err)} resolve(result)})})} readFilePromise('。/ package.json','utf-8')。then((res)=> console.log(res))。catch ((错误)=> console.log(错误))

使用Node.js 8,一个新的辅助方法被添加到util核心模块util.promisify中。它允许将标准Node.js回调式API包装在返回Promises的函数中。

使用此功能,上面的代码片段被简化并变为:

const fs = require('fs')const promisify = require('util')。promisify readFilePromise = promisify(fs.readFile)readFilePromise('./ package.json','utf-8')。then((res) => console.log(res))。catch((err)=> console.log(err))

06.更安全的缓冲区

在Node.js版本8之前,使用新的Buffer(Number)构造函数分配的缓冲区未使用零初始化内存空间。因此,新的Buffer实例可能包含敏感信息,导致严重的安全问题 - 甚至流行的模块(如mongoose,ws或请求模块)也会受到影响。

但是我们是怎么到达那里的?当JavaScript从浏览器移动到服务器端时,需要快速简便的数据处理 - 因此添加了Buffer类。缓冲区是二进制数据的可变数组。当与要求新缓冲区大小的构造函数一起使用时,它只保留了内存空间,但没有清理它。

由于您的服务器可以同时为多个用户提供服务(与您的浏览器不同),新分配的内存空间可能包含来自其他用户的敏感信息(甚至是密码!),并且可能会暴露给攻击者。

虽然这是一个有意的决定来提升新缓冲区创建的性能,但对于我们大多数人来说,它并不是预期用途 - 即使它已被记录。因此,从Node.js 8开始,使用新的Buffer(Number)或Buffer(Number)分配的缓冲区将自动用零填充。

07.调试的变化

在Node.js 8之前,如果你想调试你的Node.js应用程序,最简单的解决方案之一是使用节点调试启动内置调试器Index.js。使用Node.js 8,它将被删除并由node-inspector替换。您仍然可以使用CLI调试器,但很快就会将其删除。

从现在开始,您应该使用节点--inspect Index.js或节点--inspect-brk Index.js如果您希望调试器在应用程序的第一行放置断点。运行后,您将收到一个WebSocket链接,谷歌浏览器可以使用该链接连接其调试器。

你应该去看看铬://检查在您的Chrome浏览器中,它会自动识别正在运行的Node.js应用程序,使您能够进行连接。连接到您的流程后,您将获得Chrome的调试器来检查正在运行的Node.js应用程序。

08.引入静态错误代码

以前,如果要检查在运行时收到的错误并采取相应措施,在大多数情况下,您必须检查错误消息。这很容易出错,因为新的Node.js版本可能会更改错误消息。

对于Node.js 8,已经为大多数错误分配了静态错误代码 - 它仍然是一个正在进行的工作,但是一旦完成,这些错误代码将不会改变,即使错误中的消息确实存在。

例如,新推出的WHATWG URL API会抛出一个ERR_INVALID_URL以下代码段中的错误,因为该参数不是有效的网址:

const URL = require('url')。URL const myURL = new URL('/ foo')

正如您所看到的,Node.js 8更新的发布为JavaScript社区带来了许多新的令人兴奋的改进。要自己开始尝试所有这些新功能,请转到Nodejs.org,下载Node.js 8二进制文件并开始使用您的新工具集!

这篇文章最初出现在网络杂志问题296。在这里购买

相关文章:



翻译字数超限