Node.js 9 新特性整理

简介:

Node.js 每年进行两次大的发布,2017年10月,Node.js发布了 9.0 版本,与此同时, Node.js 8.9.0 成为了最新的 LTS 版本。这意味着对 8.9.0 的支持将会维持到2019年底,此后的一个LTS版本将会是 Node.js 10

39394c7fcb2220763e3ff55f1bf52f823acd03ea

查看 Node.js 发布历史

Node.js 9 有什么新特性?

http/2

Node 8.4 首次支持了http/2



const http2 = require('http2');
const server = http2.createServer();
server.on('stream', (stream, requestHeaders) => {
  stream.respond({ ':status': 200, 'content-type': 'text/plain' });
  stream.write('hello ');
  stream.end('world');
});
server.listen(8000);


但由于仍处于实验性阶段,运行时需要加上—expose-http2 参数

$ node --expose-http2 h2server.js

而在node 9中去除了这一参数,可以直接使用

$ node h2server.js

当然由于现在主流浏览器只有在HTTPS时才启用HTTP2,我们要启动一个https的服务器,可以参考如何在本地搭建https服务器

其他关于http/2的变化还包括:

  1. 新增对 ALTSVC(HTTP Alternative Services) 的支持
  2. 新增 maxSessionMemory ,限制单个http2线程允许使用的内存上限,一旦超过这个值,http2请求将被拒绝
  3. 收集并报告有关 Http2Session 和 Http2Stream 实例的基本计时信息。
  4. 改进了Http2StreamHttp2Session的关闭方式,Http2Stream.prototype.rstStream() 方法被移动至 Http2Stream.prototype.close() 中
  5. Http2Session上引入了新的属性来确定会话是否安全

关于http/2:

Node.js HTTP/2 documentation

Introduction to HTTP/2

util

  1. 新增方法util.isDeepStrictEqual(value1, value2),可进行两个值的深度比较,返回一个布尔值。此前我们常用assert.deepStrictEqual()进行比较,后者在两个值不相等时会抛出异常。


 const { isDeepStrictEqual } = require('util');
   const isEqual = isDeepStrictEqual({	a: '1' }, { a: 1 });
   console.log(isEqual);	//false
 
   const { deepStrictEqual } = require('assert')
   const isEqual = deepStrictEqual({	a: '1' }, { a: 1 });
   // throw new errors.AssertionError
  1. 新增方法util.callbackify,可以将 Promise 转化为callback形式的函数,适用于解决一些兼容性问题的场景:


 const { callbackify } = require('util')
   async function promiseDemo () {
     await Promise.resolve()
   }
   callbackify(promiseDemo)(function (err) {
     if (err) {
       return console.error(err)
     }
     console.log('finished without an error')
   })


  1. 允许在 debuglog() 中使用通配符,通过 NODE_DEBUG=foo* 环境运行

const util = require('util');
  const debuglog = util.debuglog('foo-bar');
 
  debuglog('hi there, it\'s foo-bar [%d]', 2333);


HTTP/1

0dac20bb000dc7dc631c1b6d14e64499b2ecf4e6

  1. 当传入的请求无法成功解析时,http模块现在将返回400状态码。在过去,Node.js只会挂断socket,导致其他服务器(如nginx)误以为Node.js服务器关闭。
  2. 在此前的版本中,一旦套接字被分配给请求,request.setTimeout()就会调用socket.setTimeout()。 这使得即使底层的套接字永不连接,也会在请求上发出超时事件。在 Node.js 9 中,socket.setTimeout()仅在底层套接字成功连接时被调用。
  3. 新增103状态码:103 Early Hints 该状态码允许服务器在主报头之前先发送部分报头,以达到预加载文件的目的。

更严谨的错误码

Node.js核心代码库正在慢慢迁移到一个新的错误系统,Node.js 9 中采用了更严谨的错误码

在Node.js 9 之前,你可能会这样处理错误:


if (err.message === 'Console expects a writable stream instance') {
  //do something with the error
}

现在则应该用这种方式进行处理:


if (err.code === 'ERR_CONSOLE_WRITABLE_STREAM') {
  //do something with the error
}

这可能会导致升级中的各种问题,为了使用户平滑升级,Node.js官方给出了它们采用的错误码,可以在这里查看

其他变化

  1. assert 模块的方法现在可以抛出任何类型的错误(RangeError,SyntaxError等)。在之前版本的Node.js中,这些方法只能抛出断言错误(assertion errors)。
  2. 在先前版本的Node.js中,如果定时器的延时溢出,不会提供任何溢出发生的指示,而在Node.js 9中,定时器会发出警告。
  3. NODE_OPTIONS 新增了 stack-trace-limit 属性,用于开发环境下设置堆栈上限,使用方式:NODE_OPTIONS=--stack-trace-limit=100
  4. 支持 console.debug 方法,此方法与console.log表现一致
  5. cluster.settings中允许通过cwd属性配置目标目录
  6. 在使用Electron等程序时,我们需要控制什么时候使用v8 platform,为了使Node正常工作,我们有时需要手动创建NodePlatform。Node.js 9 新增了用于创建/销毁NodePlatform的公共API
  7. stream模块中,新增了 state.ending 属性判断stream是否已调用 end() 方法
  8. async_wrap新增了两个属性值:TCPSERVERWRAP 和 PIPESERVERWRAP,从而允许我们通过连接种类区分服务器
  9. 添加了新的异步钩子,提供一个API来注册回调从而跟踪应用程序中的所有异步资源,记录其所观察到的异步操作的时间信息
  10. N-API(用于构建本地插件的API) 中,Node.js 9中为需要引用当前事件循环的插件添加了一个函数。从而使插件得以访问当前的事件循环,要注意的是这个特性目前仍是实验性的

原文发布时间:2018年02月07日

作者:代码湾

本文来源:sangle  如需转载请联系原作者

目录
相关文章
|
11天前
|
JavaScript 前端开发 编译器
掌握现代化JavaScript:ECMAScript提案与特性
【10月更文挑战第13天】本文介绍了ECMAScript(ES)的最新提案与特性,包括可选链、空值合并运算符、类字段和顶层Await等。通过跟踪TC39提案、使用Babel或TypeScript、测试兼容性以及逐步迁移,开发者可以高效地采用这些新特性,简化代码、提高开发效率并增强应用功能。文章还提供了实战技巧,帮助开发者在现代Web开发中充分利用这些现代化的特性。
|
14天前
|
JavaScript 前端开发 索引
JavaScript ES6及后续版本:新增的常用特性与亮点解析
JavaScript ES6及后续版本:新增的常用特性与亮点解析
14 4
|
2月前
|
JavaScript 前端开发 Oracle
软件工程师,学习下JavaScript ES6新特性吧
软件工程师,学习下JavaScript ES6新特性吧
41 9
|
3月前
|
Rust JavaScript 前端开发
Rust! 无VDom! 尤雨溪解析 Vue.js 2024 新特性
Rust! 无VDom! 尤雨溪解析 Vue.js 2024 新特性
|
3月前
|
Web App开发 前端开发 JavaScript
[译] JavaScript ES2021 中激动人心的特性
[译] JavaScript ES2021 中激动人心的特性
|
3月前
|
前端开发 JavaScript 开发者
翻天覆地!ES6+新特性大爆发,揭秘JavaScript代码的惊人蜕变!
【8月更文挑战第27天】自ES6标准发布以来,JavaScript新增的特性极大地提升了编程效率并简化了代码。本文重点介绍了五大特性:函数默认参数简化、模板字符串的强大功能、解构赋值的便捷性、箭头函数的简洁之美。这些特性不仅使代码更加简洁、易读,还解决了传统写法中的诸多问题。通过学习和应用这些新特性,开发者可以编写出更高效、更优雅的代码,以应对日益复杂的编程挑战。
61 2
|
3月前
|
JavaScript 前端开发 安全
JS 混淆解析:JS 压缩混淆原理、OB 混淆特性、OB 混淆JS、混淆突破实战
JS 混淆解析:JS 压缩混淆原理、OB 混淆特性、OB 混淆JS、混淆突破实战
115 2
|
3月前
|
JavaScript 前端开发 API
JavaScript特性检测
JavaScript特性检测
|
3月前
|
开发者 图形学 C#
深度解密:Unity游戏开发中的动画艺术——Mecanim状态机如何让游戏角色栩栩如生:从基础设置到高级状态切换的全面指南,助你打造流畅自然的游戏动画体验
【8月更文挑战第31天】Unity动画系统是游戏开发的关键部分,尤其适用于复杂角色动画。本文通过具体案例讲解Mecanim动画状态机的使用方法及原理。我们创建一个游戏角色并设计行走、奔跑和攻击动画,详细介绍动画状态机设置及脚本控制。首先导入动画资源并添加Animator组件,然后创建Animator Controller并设置状态间的转换条件。通过编写C#脚本(如PlayerMovement)控制动画状态切换,实现基于玩家输入的动画过渡。此方法不仅适用于游戏角色,还可用于任何需动态动画响应的对象,增强游戏的真实感与互动性。
80 0
|
3月前
|
自然语言处理 前端开发 JavaScript
前端进阶必读:JS闭包深度解析,掌握这一特性,你的代码将焕然一新!
【8月更文挑战第23天】闭包是JavaScript的一项高级功能,让函数能够访问和操作外部函数作用域中的变量。本文深入解析闭包概念、组成及应用场景。闭包由函数及其词法环境构成,通过在一个函数内定义另一个函数来创建。它有助于封装私有变量、维持状态和动态生成函数。然而,不当使用闭包可能导致内存泄漏或性能问题。掌握闭包对于实现模块化代码和成为优秀前端开发者至关重要。
38 0