Node.js 每年进行两次大的发布,2017年10月,Node.js发布了 9.0 版本,与此同时, Node.js 8.9.0 成为了最新的 LTS 版本。这意味着对 8.9.0 的支持将会维持到2019年底,此后的一个LTS版本将会是 Node.js 10
查看 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的变化还包括:
- 新增对 ALTSVC( HTTP Alternative Services ) 的支持
- 新增
,限制单个http2线程允许使用的内存上限,一旦超过这个值,http2请求将被拒绝maxSessionMemory
- 收集并报告有关
和Http2Session
实例的基本计时信息。Http2Stream
- 改进了
和Http2Stream
的关闭方式,Http2Session
方法被移动至Http2Stream.prototype.rstStream()
中Http2Stream.prototype.close()
- 在
上引入了新的属性来确定会话是否安全Http2Session
关于http/2:
Node.js HTTP/2 documentation Introduction to HTTP/2util
- 新增方法
,可进行两个值的深度比较,返回一个布尔值。此前我们常用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
-
,可以将 Promise 转化为callback形式的函数,适用于解决一些兼容性问题的场景:util.callbackify
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')
})
- 允许在
中使用通配符,通过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
- 当传入的请求无法成功解析时,http模块现在将返回400状态码。在过去,Node.js只会挂断socket,导致其他服务器(如nginx)误以为Node.js服务器关闭。
- 在此前的版本中,一旦套接字被分配给请求,
就会调用request.setTimeout()
。 这使得即使底层的套接字永不连接,也会在请求上发出超时事件。在 Node.js 9 中,socket.setTimeout()
仅在底层套接字成功连接时被调用。socket.setTimeout()
- 新增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官方给出了它们采用的错误码,可以在
这里查看
其他变化
- assert 模块的方法现在可以抛出任何类型的错误(RangeError,SyntaxError等)。在之前版本的Node.js中,这些方法只能抛出断言错误(assertion errors)。
- 在先前版本的Node.js中,如果定时器的延时溢出,不会提供任何溢出发生的指示,而在Node.js 9中,定时器会发出警告。
-
新增了NODE_OPTIONS
属性,用于开发环境下设置堆栈上限,使用方式:stack-trace-limit
NODE_OPTIONS=--stack-trace-limit=100
- 支持
方法,此方法与console.debug
表现一致console.log
-
中允许通过cluster.settings
属性配置目标目录cwd
- 在使用Electron等程序时,我们需要控制什么时候使用v8 platform,为了使Node正常工作,我们有时需要手动创建NodePlatform。Node.js 9 新增了用于创建/销毁NodePlatform的公共API
- stream模块中,新增了
属性判断stream是否已调用state.ending
方法end()
-
新增了两个属性值:async_wrap
TCPSERVERWRAP
,从而允许我们通过连接种类区分服务器PIPESERVERWRAP
- 添加了新的异步钩子,提供一个API来注册回调从而跟踪应用程序中的所有异步资源,记录其所观察到的异步操作的时间信息
- N-API(用于构建本地插件的API ) 中,Node.js 9中为需要引用当前事件循环的插件添加了一个函数。从而使插件得以访问当前的事件循环,要注意的是这个特性目前仍是实验性的
原文发布时间:2018年02月07日
作者:
代码湾本文来源:
sangle如需转载请联系原作者