当前位置: 首页 > 后端技术 > Node.js

Node.js15正式版发布

时间:2023-04-03 18:24:11 Node.js

前两天,Node.js正式发布了Node.js15正式版,Node.js15将取代Node.js14成为当前的稳定发布版本,后者将在本月晚些时候升级到LTS(长期支持)版本。如果你想体验Node.js15的最新特性,可以到官网下载。那么Node.js15带来了哪些新的功能和特性呢?主要体现在以下几个方面:AbortControllerN-APIversion7npm7unhandledrejectionsthrowsQUICV8default8.6AbortControllerAbortController接口代表一个controller对象,允许开发者根据需要中止一个或多个web请求,Node.js15增加了一个AbortControllerExperimental实现。AbortController是一个全局实用程序类,它根据AbortControllerWebAPI在选定的基于Promise的API中发出已取消请求的信号,如下所示。constac=newAbortController();ac.signal.addEventListener('abort',()=>console.log('Aborted!'),{once:true});ac.abort();console.log(ac.signal.aborted);//PrintsTrue在上面的例子中,abortController.abort()方法被调用时会发送abort事件,AbortController只会触发一次abort事件。此外,附加到AbortSignal的事件侦听器应使用{once:true}参数选项(或等效于EventEmitterAPI的once())以确保在处理中止事件后删除事件侦听器。AbortController的Node.jsAPI文档请参考:AbortController。N-API7N-API是一种用于构建原生插件的API,它独立于底层JavaScript运行时环境(例如V8),并且作为Node.js本身的一部分出现。该API将作为跨Node.js版本编译的应用程序二进制接口(ABI)的稳定版本。它旨在将Addons与底层JavaScript引擎的更改隔离开来,并允许在一个版本中编译的模块无需重新编译即可在更高版本的Node.js上运行。N-API是一种C语言API,可确保Node.js版本和不同编译器级别之间的应用程序编程接口(ABI)稳定性。C++API可能更易于使用。为了支持C++的使用,Node.js使用了一个名为node-addon-api的C++包装器模块,它提供了一个可内联的C++API。使用node-addon-api构建的二进制文件将依赖于基于Node.js导出的C函数符号的N-API接口。node-addon-api是一种更高效的编写代码的方式来编写和调用N-API。Node.js的N-API请参考:C/C++addonswithN-API下面是一个使用node-addon-api的例子。Objectobj=Object::New(env);obj["foo"]=String::New(env,"bar");napi_statusstatus;napi_valueobject,string;status=napi_create_object(env,&object);if(status!=napi_ok){napi_throw_error(env,...);返回;}status=napi_create_string_utf8(env,"bar",NAPI_AUTO_LENGTH,&string);if(status!=napi_ok){napi_throw_error(env,...);返回;}status=napi_set_named_property(env,object,"foo",string);if(status!=napi_ok){napi_throw_error(env,...);return;}更新后的N-API7是上一个大版本以来的第一个新版本,带来了ArrayBuffers的相关内容。npm7Node.js15附带npm7,这是npm的新主要版本。npm7有许多新功能,包括npm工作区和新的package-lock.json格式。npm7还包括yarn.lock文件支持。npm7的一大变化是默认安装了对等依赖项。未处理的拒绝默认抛出从Node.js15开始,unhandledRejection的默认模式已更改为抛出(以前是警告)。在抛出模式下,如果未设置unhandledRejection挂钩,unhandledRejection将引发未捕获的异常。拥有unhandledRejection挂钩的用户应该看不到任何行为变化,并且仍然可以使用--unhandled-rejections=mode进程标志切换模式。之前的几个Node.js版本会默认发出UnhandledPromiseRejectionWarning,根据《Node.js 用户见解:Unhandled Promise Rejections》调查的结果,Node.jsTSC同意将模式切换为抛出。QUICQUIC是Google开发的基于UDP的低延迟互联网传输层协议,是HTTP/3的基础传输协议。而且,2016年11月,国际互联网工程任务组(IETF)召开了第一次QUIC工作组会议,受到了业界的广泛关注,这意味着QUIC在成为新一代传输层协议的道路上迈出了关键一步。.同时,QUIC内置了TLS1.3安全、流量控制、纠错、连接迁移和多路复用。Node.js15附带了对QUIC的实验性支持,通过使用--experimental-quic配置标志编译Node.js启用。例如,核心net模块公开了一个Node.jsQUIC实现,编码如下。const{createQuicSocket}=require('net');'usestrict';constkey=getTLSKeySomehow();constcert=getTLSCertSomehow();const{createQuicSocket}=require('net');//创建QUICUDPIPv4套接字绑定到本地IP端口1234constsocket=createQuicSocket({endpoint:{port:1234}});socket.on('session',async(session)=>{//一个新的服务器端会话已经创建!//peer打开了一个新的流!session.on('stream',(stream)=>{//Let'ssayhellostream.end('HelloWorld');//让我们看看peer要说什么...stream.setEncoding('utf8');stream.on('data',console.log);stream.on('end',()=>console.log('streamended'));});constuni=awaitsession.openStream({halfOpen:true});uni.write('hi');uni.end('fromtheserver!');});//告诉套接字使用给定的/作为服务器运行/用于保护新连接的密钥和证书,使用//虚构的“hello”应用程序协议。(asyncfunction(){awaitsocket.listen({key,cert,alpn:'hello'});console.log('套接字正在监听会话!');})();关于QUIC的更多信息,您可以参考以下文档:QUICV88.6V8JavaScript引擎已经更新到V88.6(V88.4是Node.js14的最新版本)。除了性能调整和改进之外,V8更新还带来了以下语言功能:Promise.any()-MDNPromise.any()接受一个可迭代的Promise并返回成功的那个,只要其中一个promise成功promise.如果iterable中的承诺都没有成功(即所有承诺失败/拒绝),则返回一个失败的承诺和一个AggregateError类型的实例,它是用于将单个错误聚合在一起的Error的子类。Promise.any()的参考文档如下:Promise.any()AggregateError——MDNAggregateError主要用于运行报告抛出多个错误的场景。语法格式如下:newAggregateError(errors[,message])捕获一个AggregateError的示例代码如下:Promise.any([Promise.reject(newError("someerror")),]).catch(e=>{console.log(einstanceofAggregateError);//trueconsole.log(e.message);//"AllPromisesrejected"console.log(e.name);//"AggregateError"console.log(e.errors);//[错误:“一些错误”]});创建一个AggregateError的示例代码如下://真console.log(e.message);//“你好”console.log(e.name);//“聚合错误”console.log(e.errors);//[Error:"someerror"]}详细参考文档:AggregateErrorString.prototype.replaceAll()——MDNreplaceAll()方法返回一个新的字符串,新字符串中所有满足pattern的部分都被替换掉了。pattern可以是字符串或RegExp,replacement可以是字符串或每次匹配时调用的函数。constp='敏捷的棕色狐狸跳过懒惰的狗。如果狗有反应,它真的很懒惰吗?const正则表达式=/dog/gi;安慰。log(p.replaceAll(regex,'ferret'));//预期输出:“敏捷的棕色狐狸跳过了懒惰的雪貂。如果雪貂做出反应,它真的很懒惰吗?”console.log(p.replaceAll('dog','monkey'));//预期输出:“敏捷的棕色狐狸跳过懒惰的猴子。如果猴子有反应,它真的很懒惰吗?”详情请参考:String.prototype.replaceAll()安利升级另外,随着Node.js15新版本的发布!官方希望开发者尽快升级,并将遇到的问题反馈给官方。当然,开发人员也可以使用Node.js15测试您的应用程序和模块,以确保您的项目兼容最新的Node.js功能和更改。而且,Node.js官方也已经开始计划升级到Node.js14,下周会升级到LTS,支持会持续到2023年4月。另请注意,Node.js10将在2021年4月结束生命周期.因此,如果你还在使用Node.js10,我们建议你开始计划升级。