全面解析Node.js 8 重要功能和修复


Posted in Javascript onJune 02, 2017

5月30日12点,Node.js 8正式发布了,这个版本具有一系列新功能和性能改进,并且这些功能和改进将获得长期支持(LTS)。

下面就来介绍Node.js 8版本中最重要的功能和修复。

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

下载Node.js 8版本:https://nodejs.org/download/rc/v8.0.0-rc.2/

Async Hooks API 介绍

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

API发出的消息会将Node.js中所有句柄对象的生命周期告知给consumer。它试图解决类似于continuation-local-storage npm package这样的问题。

如果你正在使用continuation-local-storage,那么已经可以用称为cls-hook的async hooks来代替使用了 ? 只是目前并不是使用async hooks的最好时机,所以需要谨慎使用!

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

createHooks函数的注册功能会被每一个异步操作的不同生命周期事件调用。

const asyncHooks = require('async_hooks')
asyncHooks.createHooks({ 
 init,
 pre,
 post,
 destroy
})

了解更多Async Hooks,或查看正在进行的工作文档。这些函数将会根据处理程序对象的生命周期事件选择性触发。

N-API 介绍

N-API是用于构建原生插件的API。它独立于底层JavaScript运行时,并作为Node.js自身的一部分进行维护。这么做的目的是保证应用程序二进制接口(ABI)在不同Node.js版本之间能够保持稳定。

N-API的目的是将附加组件和基础JavaScript引擎中的更改区分开,以便原生插件在不需要重新编译情况下,就可以运行不同的Node.js版本。

了解更多N-API信息。

Node.js 8 中的缓冲区安全性改进

在Node.js 8版本之前,使用new Buffer(Number)构造函数分配的缓冲区并未使用ZEROS初始化内存空间。结果导致新的Buffer实例可能包含敏感信息,容易导致安全问题。

虽然这是一个用于提高创建新Buffer性能的决定,但是对大多数人来说,并不打算这么使用。因此从Node.js 8开始,使用new Buffer(Number)或Buffer(Number)分配的Buffers会被ZEROS自动填充。

将 V8 升级到 5.8:TurboFan & Ingnition

使用Node.js 8版本,底层的V8 JavaScript引擎也会更新。

对于Node.js用户来说,最大的变化就是引入TurboFan和Ignition。Ignition是V8的解释器,TurboFan是优化编译器。

“Ignition和TurboFan的联合使用已经开发了近3½年,它代表了V8团队集体认识的最终结果,是V8团队收集了JavaScript的实测性能并仔细分析了Full-codegen的缺点和Crankshaft的结果。这也是能够在未来几年内继续优化JavaScript语言体系的基础。“ - Daniel Clifford和V8团队

目前V8的编译管道如下图所示。

全面解析Node.js 8 重要功能和修复

这个管道的最大问题是,新的语言功能必须在管道的不同部分实现,这就增加了大量额外的开发工作。

下面是简化的管道,没有了FullCode Generator和Crankshaft:

全面解析Node.js 8 重要功能和修复

新管道大大降低了V8团队的技术负担,并实现了很多之前无法实现的改进。

了解更多TurboFan and Ignition 和 TurboFan 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校验

Node.js 8 版本中的其它显著改变

Buffer

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

Child Process

  • Argument和Kill信号验证得到改善
  • Child Process方法接受Uint8Array作为输入

Console

使用控制台方法时,错误事件发送现在受到了抑制

Domains

Native Promise实例现在是域感知的

文件系统

  • 实用程序类fs.SyncWriteStream已被弃用
  • 已弃用的fs.read( )字符串接口已被删除

HTTP

溢出的Cookie headers会被连接成一个字符串

该httpResponse.writeHeader( )方法已被弃用

Stream

Stream现在支持destroy( )和_destroy( ) API

TLS

该rejectUnauthorized选项现在默认为true

URL

WHATWG URL的实现,现在是Node.js API完全支持的

Node.js 8 下一步要做什么

Node.js 8版本令我们兴奋,因为它包含了很多有趣的提升,例如Async Hooks API,这些API在当前的文档状态是很难掌握的。我们将尽快开始使用新版本,并尽快提供给用户新功能的更详细说明。

Javascript 相关文章推荐
关于在IE下的一个安全BUG --可用于跟踪用户的系统鼠标位置
Apr 17 Javascript
js与jquery获取父级元素,子级元素,兄弟元素的实现方法
Jan 09 Javascript
讲解JavaScript中for...in语句的使用方法
Jun 03 Javascript
jquery马赛克拼接翻转效果代码分享
Aug 24 Javascript
详解JavaScript中数组和字符串的lastIndexOf()方法使用
Mar 13 Javascript
浅析jQuery事件之on()方法绑定多个选择器,多个事件
Apr 27 Javascript
jQuery的中 is(':visible') 解析及用法(必看)
Feb 12 Javascript
微信小程序云开发实现数据添加、查询和分页
May 17 Javascript
layui+jquery支持IE8的表格分页方法
Sep 28 jQuery
在pycharm中开发vue的方法步骤
Mar 04 Javascript
Vue 根据条件判断van-tab的显示方式
Aug 03 Javascript
javascript局部自定义鼠标右键菜单
Dec 08 Javascript
vue 中自定义指令改变data中的值
Jun 02 #Javascript
Jquery EasyUI $.Parser
Jun 02 #jQuery
BootStrap 动态表单效果
Jun 02 #Javascript
socket.io与pm2(cluster)集群搭配的解决方案
Jun 02 #Javascript
angularjs定时任务的设置与清除示例
Jun 02 #Javascript
Node.js v8.0.0正式发布!看看带来了哪些主要新特性
Jun 02 #Javascript
详解在AngularJS的controller外部直接获取$scope
Jun 02 #Javascript
You might like
php下使用SimpleXML 处理XML 文件
2010/02/27 PHP
浅析php原型模式
2014/11/25 PHP
PHP中的switch语句的用法实例详解
2015/10/21 PHP
IE与Firefox在JavaScript上的7个不同写法小结
2009/09/14 Javascript
jQuery实现用方向键控制层的上下左右移动
2013/01/13 Javascript
一款jquery特效编写的大度宽屏焦点图切换特效的实例代码
2013/08/05 Javascript
javascript一元操作符(递增、递减)使用示例
2013/08/07 Javascript
IE网页js语法错误2行字符1、FF中正常的解决方法
2013/09/09 Javascript
jQuery实现购物车多物品数量的加减+总价计算
2014/06/06 Javascript
浅析angularJS中的ui-router和ng-grid模块
2016/05/20 Javascript
浅谈jQuery绑定事件会叠加的解决方法和心得总结
2016/10/26 Javascript
Easyui笔记2:实现datagrid多行删除的示例代码
2017/01/14 Javascript
jquery实现input框获取焦点的方法
2017/02/06 Javascript
Vue.js 中的 $watch使用方法
2017/05/25 Javascript
vue中for循环更改数据的实例代码(数据变化但页面数据未变)
2017/09/15 Javascript
javascript中undefined的本质解析
2019/07/31 Javascript
layui-table对返回的数据进行转变显示的实例
2019/09/04 Javascript
react native 仿微信聊天室实例代码
2019/09/17 Javascript
基于纯JS实现多张图片的懒加载Lazy过程解析
2019/10/14 Javascript
[01:04:49]KG vs LGD 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
tensorflow 模型权重导出实例
2020/01/24 Python
pytorch中图像的数据格式实例
2020/02/11 Python
pytorch:model.train和model.eval用法及区别详解
2020/02/20 Python
CSS3实现同时执行倾斜和旋转的动画效果
2016/10/27 HTML / CSS
HTML5+CSS3 诱人的实例:3D立方体旋转动画实例
2016/12/30 HTML / CSS
Html5上传图片 移动端、PC端通用代码
2016/06/08 HTML / CSS
什么是符号链接,什么是硬链接?符号链接与硬链接的区别是什么?
2013/05/03 面试题
留学自荐信
2013/10/10 职场文书
函授本科自我鉴定
2013/11/03 职场文书
教师研修随笔感言
2014/01/23 职场文书
教师党员承诺书
2014/03/25 职场文书
保研推荐信
2014/05/09 职场文书
机电一体化专业求职信
2014/07/22 职场文书
群教个人对照检查材料
2014/08/20 职场文书
JS如何实现基于websocket的多端桥接平台
2021/05/14 Javascript
《宝可梦》动画制作25周年到来 官方发布特别纪念视频
2022/04/01 日漫