Node.js 8 中的重要新特性


Posted in Javascript onJune 28, 2017

随着 Node.js 8.0 版本的发布(5月30日下午12点发布),我们得到了最新的 LTS 版本,具有一系列新功能和性能改进。

本文我们将介绍 Node.js 8.0 版本中重要的功能和修复。

与以前的 Node.js 版本相比,8.0.0相当强大。虽然这其中有些还正在进行,很多正在商榷。但基本上是稳定和可测试的
•James M Snell(@jasnell)2017年5月30日

新版本的代号是 Carbon。Node 8 将从2017年10月起成为现行的 LTS 版本,并将保持到2019年12月31日。这也意味着 Node.js 6.x 版本将在 2018 年 4 月进入维护模式,并在 2019 年 4 月废弃。

你可以在这里获取 8.0 release文档

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
})

这些函数将根据处理程序的生命周期事件触发。

这里阅读更多Async Hooks的信息,或者这里查看当前的进度。

N-API 简介

N-API是用于编写原生插件的 API。它独立于底层的 JavaScript 运行环境,但作为 Node.js 本身的一部分进行维护。它的目标是使应用程序二进制接口(ABI)在不同 Node.js 版本之间保持稳定。

N-API的目的是将附加组件与底层JavaScript引擎的更改分开,以便原生组件可以在不同版本的 Node 环境中运行并且不需要重新编译。

查看更多N-API的相关信息。

Node 8 中 Buffer 安全性的改进

在 Node.js 8之前,用new Buffer(Number)来创建一个Buffer,并未将内存初始化为0。因此,新的缓冲区实例可能包含敏感信息,导致安全问题。

虽然这样可以使 Buffer 的创建更快,但对于大多数情况来看,这并不可行。因为从 Node.js 8 开始,使用new Buffer(Number) 或者Buffer(Number) 的将会自动将内存置为0.

将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 团队

下面是 Node 8 版本之前的 V8 编译管道的示例图

Node.js 8 中的重要新特性

图片来源:Benedikt Meurer

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

这是简化的管道外观,没有 FullCode Generator 和 Crankshaft:

Node.js 8 中的重要新特性

图片来源:Benedikt Meurer

这一新管道大大降低了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

•优化参数和 kill 信号校验

•Child Process 方法接受 Uint8Array 作为输入

Console
•使用 console 发出的错误事件现在被限制

Domains
•Native Promise 实例现在是 Domain 敏感的

File System

•实用工具类fs.SyncWriteStream已被弃用

•fs.read()字符串接口已被删除

HTTP

•传出的 Cookie 头连接成一个字符串

•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,它目前较难掌握,文档还在不断改进状态。我们将尽快开始播放新版本,并尽快让您对这些功能的更详细的说明。

Javascript 相关文章推荐
30个最佳jQuery Lightbox效果插件分享
Apr 11 Javascript
js选取多个或单个元素的实现代码(用class)
Aug 22 Javascript
超炫的jquery仿flash导航栏特效
Nov 11 Javascript
JQuery异步获取返回值中文乱码的解决方法
Jan 29 Javascript
js实现鼠标感应向下滑动隐藏菜单的方法
Feb 20 Javascript
使用Javascript实现选择下拉菜单互移并排序
Feb 23 Javascript
jQuery 中ajax异步调用的四种方式
Jun 28 Javascript
解决bootstrap导航栏navbar在IE8上存在缺陷的方法
Jul 01 Javascript
基于HTML+CSS+JS实现增加删除修改tab导航特效代码
Aug 05 Javascript
node 命令方式启动修改端口的方法
May 12 Javascript
用Node编写RESTful API接口的示例代码
Jul 04 Javascript
修改layui的后台模板的左侧导航栏可以伸缩的方法
Sep 10 Javascript
Angular排序实例详解
Jun 28 #Javascript
基于JS对象创建常用方式及原理分析
Jun 28 #Javascript
Node.js实现文件上传的示例
Jun 28 #Javascript
iscroll-probe实现下拉刷新和下拉加载效果
Jun 28 #Javascript
JavaScript 获取元素在父节点中的下标(推荐)
Jun 28 #Javascript
JS中把函数作为另一函数的参数传递方法(总结)
Jun 28 #Javascript
js+html制作简单日历的方法
Jun 27 #Javascript
You might like
动易数据转成dedecms的php程序
2007/04/07 PHP
PHP永久登录、记住我功能实现方法和安全做法
2015/04/27 PHP
Laravel框架路由和控制器的绑定操作方法
2018/06/12 PHP
Laravel5.1框架路由分组用法实例分析
2020/01/04 PHP
YII2框架中behavior行为的理解与使用方法示例
2020/03/13 PHP
JavaScript 学习 - 提高篇
2007/02/02 Javascript
clientX,pageX,offsetX,x,layerX,screenX,offsetLeft区别分析
2010/03/12 Javascript
JavaScript计算字符串中每个字符出现次数的小例子
2013/07/02 Javascript
jquery批量控制form禁用的代码
2013/08/06 Javascript
javascript 利用arguments实现可变长参数
2016/11/21 Javascript
详解angularjs中如何实现控制器和指令之间交互
2017/05/31 Javascript
vue元素实现动画过渡效果
2017/07/01 Javascript
基于JavaScript中标识符的命名规则介绍
2018/01/06 Javascript
vue中使用gojs/jointjs的示例代码
2018/08/24 Javascript
移动端(微信等使用vConsole调试console的方法
2019/03/05 Javascript
生成无限制的微信小程序码的示例代码
2019/09/20 Javascript
vue表单中遍历表单操作按钮的显示隐藏示例
2019/10/30 Javascript
vue elementui 实现搜索栏公共组件封装的实例代码
2020/01/20 Javascript
node.js使用http模块创建服务器和客户端完整示例
2020/02/10 Javascript
Vue 使用iframe引用html页面实现vue和html页面方法的调用操作
2020/11/16 Javascript
[02:21]DOTA2英雄基础教程 蝙蝠骑士
2013/12/16 DOTA
[01:44]《为梦想出发》—联想杯DOTA2完美世界全国高校联赛
2015/09/30 DOTA
Python callable()函数用法实例分析
2018/03/17 Python
python将文本分每两行一组并保存到文件
2018/03/19 Python
安装python时MySQLdb报错的问题描述及解决方法
2018/03/20 Python
详解Python中的分组函数groupby和itertools)
2018/07/11 Python
Python中的上下文管理器相关知识详解
2019/09/19 Python
加拿大消费电子和手机购物网站:The Source
2017/01/28 全球购物
NYX Professional Makeup官方网站:专业彩妆和美容产品
2019/10/29 全球购物
Java语言程序设计测试题判断题部分
2013/01/06 面试题
预备党员政审材料
2014/02/04 职场文书
纪律教育月活动总结
2014/08/26 职场文书
推普周国旗下讲话稿
2014/09/21 职场文书
2014年班主任工作总结
2014/11/08 职场文书
高考1977观后感
2015/06/04 职场文书
MySQL复制问题的三个参数分析
2021/04/07 MySQL