节点12的新增功能

最近,Node 12的代号为Erbium ,其长期支持(LTS)将从2019年10月持续到2022年4月。


新版本具有许多优点,并改善了运行时。 此外,考虑到在V8的支持下,该节点还将获得所有引擎改进。




import/export支持


该节点在进入ECMAScript模块的过程中进入阶段3 。 最初,此功能仅可通过--experimental-modules标志使用。 计划在Node切换到LTS时,不再需要使用此标志。


自从ES6标准化以来,在使用js开发人员的模块时,使用import/export的语法import/export变得更加可取了,而Node背后的团队则在本地支持方面勤奋工作。 从阶段0开始,此功能在Node 8.0中已通过实验提供。 当前版本是朝这个方向迈出的一大步。 大多数流行的浏览器已经通过<script type="module"> 支持此功能


从第3阶段开始,将支持ES模型中的三种import选项:


 //    import module from 'module' //   import { namedExport } from 'module' //     import * as module from 'module' 

Vanilla模块只能以默认方式导出:


 import module from 'cjs-library' 

您可以使用import()在运行时加载。 import()返回Promise并与ES模型和CommonJS库一起使用。


V8


节点12最初将在V8 7.4上运行,并将最终升级到7.6。 V8团队同意提供ABI(应用程序二进制接口)。 V8 7.4中的显着改进是可提高性能,以更快地执行JavaScript,更好的内存管理和增强的ECMAScript语法支持。



异步堆栈跟踪


让我们看一下这段代码:


 async function testAsyncStacktrace() { await killme(); return 42; } async function killme() { await Promise.resolve(); throw new Error('#Feelsbadman'); } testAsyncStacktrace().catch(error => console.log(error.stack)); 

在较旧的版本上,您将获得以下内容:


 Error: #Feelsbadman at killme (test.js:8:11) at process._tickCallback (internal/process/next_tick.js:68:7) at Function.Module.runMain (internal/modules/cjs/loader.js:721:11) at startup (internal/bootstrap/node.js:228:19) at bootstrapNodeJSCore (internal/bootstrap/node.js:576:3) 

如您所见,该消息在testAsyncStacktrace都没有提及testAsyncStacktrace 。 现在默认情况下启用了--async-stack-traces标志,日志将如下所示:


 Error: #Feelsbadman at killme (test.js:8:11) at async testAsyncStacktrace (test.js:2:5) 

参数数量不匹配时的加速调用


在JavaScript中,调用带有更少/更多参数(即传递更少或更多声明的形式参数)的函数是完全可以接受的。 第一种情况是申请不足 ,第二种情况是申请过度 。 在参数数量不足的情况下,参数将是undefined ,而在参数数量众多的情况下,它们将被忽略。


但是,JavaScript函数仍然可以使用argumentsrest参数对象,甚至在草率模式的函数中使用非标准化的Function.prototype.arguments来获取实际参数。 因此,JavaScript引擎应提供一种获取实际参数的方法。 在V8中,这是使用参数自适应技术完成的 。 不幸的是,这样的方法会影响性能。


在某些情况下,V8完全跳过了参数调整 ,从而将调用开销减少了多达60%。



详细信息可以在文档中找到。


加速解析


在Chrome浏览器中,加载过程中会在工作线程中解析足够大的脚本。 V8 7.4解决了UTF-8解码性能的问题,该问题导致8%的加速。



图中的每一滴代表流分析器中性能的改进之一。


改善await


现在默认情况下与--async-stack-traces标志一起使用--async-stack-traces --harmony-await-optimization标志。 详细信息在这里


私人班级领域


V8中使用私有字段的功能已迁移到该节点。 此类字段在课程外不可用。 要创建这些,您需要在变量前指定#


 class HelloThere { #hidden = 'Hidden'; get hidden() { return this.#hidden; } set hidden(txt) { this.#hidden = txt; } hi() { console.log(`Hello, ${this.#hidden}`); } } 

当您尝试从外部访问#hidden ,会遇到语法错误。


 const hello = new HelloThere(); hello.#hidden = 'Visible'; // -> SyntaxError console.log(hello.#hidden); // -> SyntaxError 

快速上手


节点12将在构建并嵌入为二进制文件之前将缓存用于内置库。 由于在主线程中使用了此缓存,因此启动时间将减少30%。


TLS和安全性


Noda现在支持TLS 1.3,它提供了增强的安全性并减少了延迟。 TLS 1.3极大地改变了协议,并正在积极地集成到网络中。 TLS 1.3的引入将提高用户数据的机密性,并通过减少HTTPS中的握手时间来加快请求处理。 此外,默认情况下禁用TLS 1.0和1.1,并且已从crypto中删除了不赞成使用的方法。


动态臀部尺寸


以前,使用的默认V8堆大小为700MB(32位系统)或1400MB(64位系统)。 现在,该节点将根据可用内存确定堆大小,以优化计算机的已用资源。


甩臀部的能力


节点12提供了转储堆的功能,使检测内存问题更加容易。 详细信息可以在这里这里找到。


实验诊断报告


Noda提供了更强大的工具来诊断应用程序内部的问题(性能,CPU使用率,内存,崩溃等),并提供了实验性的报告功能。


使用本机模块时的改进


节点12延续了简化N-API工作的趋势。 此版本改进了支持,尤其是在使用工作线程时。


结论


节点12有很多改进。 完整的CHANGELOG可以在Github网站上查看。

Source: https://habr.com/ru/post/zh-CN450292/


All Articles