今天小编给大家分享一下Node.js19有哪些特性的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Node.js 14 将在 2023 年 4 月结束更新维护,Node.js 16 (LTS) 预计将在 2023 年 9 月结束更新维护。而Node 19 在 2022-10-18 发布。我们知道 Node.js 版本分两种:LTS 和 Current其中,Current 版本通常每 6 个月发布一次。每年 4 月份发布新的偶数版本;每年 10 月份发布新的奇数版本;在刚过去的 10 月,发布的 V19.0.1 成为最新的 “Current” 尝鲜版,它一共带来 6 大特性。Node.js v19 设置 keepAlive 默认值为 true,这意味着所有出站的 HTTP(s) 连接都将使用 HTTP 1.1 keepAlive,默认时间为 5S;代码测试:
consthttp=require('node:http'); console.log(http.globalAgent); consthttps=require('node:https'); console.log(https.globalAgent);
我们可以对比看看 v16 和 v19 的 node server Agent 配置差异:
我们可以对比看看 v16 和 v19 的 node server Agent 配置差异:
V16
%nvmuse16 Nowusingnodev16.0.0(npmv7.10.0) %nodeserver Agent{ _events:[Object:nullprototype]{ free:[Function(anonymous)], newListener:[Function:maybeEnableKeylog] }, _eventsCount:2, _maxListeners:undefined, defaultPort:80, protocol:'http:', options:[Object:nullprototype]{path:null}, requests:[Object:nullprototype]{}, sockets:[Object:nullprototype]{}, freeSockets:[Object:nullprototype]{}, keepAliveMsec免费云主机、域名s:1000, keepAlive:false, maxSockets:Infinity, maxFreeSockets:256, scheduling:'lifo', maxTotalSockets:Infinity, totalSocketCount:0, [Symbol(kCapture)]:false } Agent{ _events:[Object:nullprototype]{ free:[Function(anonymous)], newListener:[Function:maybeEnableKeylog] }, _eventsCount:2, _maxListeners:undefined, defaultPort:443, protocol:'https:', options:[Object:nullprototype]{path:null}, requests:[Object:nullprototype]{}, sockets:[Object:nullprototype]{}, freeSockets:[Object:nullprototype]{}, keepAliveMsecs:1000, keepAlive:false, maxSockets:Infinity, maxFreeSockets:256, scheduling:'lifo', maxTotalSockets:Infinity, totalSocketCount:0, maxCachedSessions:100, _sessionCache:{map:{},list:[]}, [Symbol(kCapture)]:false }
第 18、40 行,keepAlive 默认设置为 false;
第 18、40 行,keepAlive 默认设置为 false;
V19
%nvmuse19 Nowusingnodev19.0.0(npmv8.19.2) %nodeserver Agent{ _events:[Object:nullprototype]{ free:[Function(anonymous)], newListener:[Function:maybeEnableKeylog] }, _eventsCount:2, _maxListeners:undefined, defaultPort:80, protocol:'http:', options:[Object:nullprototype]{ keepAlive:true, scheduling:'lifo', timeout:5000, noDelay:true, path:null }, requests:[Object:nullprototype]{}, sockets:[Object:nullprototype]{}, freeSockets:[Object:nullprototype]{}, keepAliveMsecs:1000, keepAlive:true, maxSockets:Infinity, maxFreeSockets:256, scheduling:'lifo', maxTotalSockets:Infinity, totalSocketCount:0, [Symbol(kCapture)]:false } Agent{ _events:[Object:nullprototype]{ free:[Function(anonymous)], newListener:[Function:maybeEnableKeylog] }, _eventsCount:2, _maxListeners:undefined, defaultPort:443, protocol:'https:', options:[Object:nullprototype]{ keepAlive:true, scheduling:'lifo', timeout:5000, noDelay:true, path:null }, requests:[Object:nullprototype]{}, sockets:[Object:nullprototype]{}, freeSockets:[Object:nullprototype]{}, keepAliveMsecs:1000, keepAlive:true, maxSockets:Infinity, maxFreeSockets:256, scheduling:'lifo', maxTotalSockets:Infinity, totalSocketCount:0, maxCachedSessions:100, _sessionCache:{map:{},list:[]}, [Symbol(kCapture)]:false }
第 14、16、42、44 行设置 keepAlive 默认值及时间;
第 14、16、42、44 行设置 keepAlive 默认值及时间;
启用 keepAlive 能使连接重用,提高网络的吞吐量。另外,服务器将在调用 close()
自动断开空闲的客户端,内部依靠 http(s).Server.close
API 实现;这些修改,进一步优化了体验和性能。WebCrypto API 是一个使用密码学构建的系统接口,在 node.js v19 趋于稳定(除 Ed25519、Ed448、X25519、X448 外)。我们可以通过调用 globalThis.crypto
或 require('node:crypto').webcrypto
来访问,下面以 subtle
加密函数为例;
const{subtle}=globalThis.crypto; (asyncfunction(){ constkey=awaitsubtle.generateKey({ name:'HMAC', hash:'SHA-256', length:256 },true,['sign','verify']); console.log('key=',key); constenc=newTextEncoder(); constmessage=enc.encode('Ilovecupcakes'); console.log('message=',message); constdigest=awaitsubtle.sign({ name:'HMAC' },key,message); console.log('digest=',digest); })();
首先生成 HMAC 密钥,生成的密钥可同时用于验证消息数据完整性和真实性;
首先生成 HMAC 密钥,生成的密钥可同时用于验证消息数据完整性和真实性;
然后,对字符串 I love cupcakes
加密;最后创建 消息摘要,它是一种加密散列函数;在控制台显示:key 、message 、digest 信息
%nodeserver key=CryptoKey{ type:'secret', extractable:true, algorithm:{name:'HMAC',length:256,hash:[Object]}, usages:['sign','verify'] } message=Uint8Array(15)[73,32,108,111,118,101,32,99,117,112,99,97,107,101,115] digest=ArrayBuffer{ [Uint8Contents]:, byteLength:32 }
Node.js 已经删除 --experimental-specifier-resolution
,其功能现在可以通过自定义加载器实现。可以在这个库中测试:nodejs/loaders-test: Examples demonstrating the Node.js ECMAScript Modules Loaders API
gitclonehttps://github.com/nodejs/loaders-test.git %cdloaders-test/commonjs-extension-resolution-loader %yarninstall
比如 loaders-test/commonjs-extension-resolution-loader/test/basic-fixtures/index.js
文件:
import{version}from'process'; import{valueInFile}from'./file'; import{valueInFolderIndex}from'./folder'; console.log(valueInFile); console.log(valueInFolderIndex);
./file
如果没有自定义加载器,不会去查找文件的扩展名,比如 ./file.js
或 ./file.mjs
设置自定义加载器后,则可解决上述问题:
import{isBuiltin}from'node:module'; import{dirname}from'node:path'; import{cwd}from'node:process'; import{fileURLToPath,pathToFileURL}from'node:url'; import{promisify}from'node:util'; importresolveCallbackfrom'resolve/async.js'; constresolveAsync=promisify(resolveCallback); constbaseURL=pathToFileURL(cwd()+'/').href; exportasyncfunctionresolve(specifier,context,next){ const{parentURL=baseURL}=context; if(isBuiltin(specifier)){ returnnext(specifier,context); } //`resolveAsync`workswithpaths,notURLs if(specifier.startsWith('file://')){ specifier=fileURLToPath(specifier); } constparentPath=fileURLToPath(parentURL); leturl; try{ constresolution=awaitresolveAsync(specifier,{ basedir:dirname(parentPath), //Forwhateverreason,--experimental-specifier-resolution=nodedoesn'tsearchfor.mjsextensions //butitdoessearchforindex.mjsfileswithindirectories extensions:['.js','.json','.node','.mjs'], }); url=pathToFileURL(resolution).href; }catch(error){ if(error.code==='MODULE_NOT_FOUND'){ //MatchNode'serrorcode error.code='ERR_MODULE_NOT_FOUND'; } throwerror; } returnnext(url,context); }
测试命令:
%node--loader=./loader.jstest/basic-fixtures/index (node:56149)ExperimentalWarning:CustomESMLoadersisanexperimentalfeature.Thisfeaturecouldchangeatanytime (Use`node--trace-warnings...`toshowwherethewarningwascreated) hellofromfile.js
将不会再报错,正常运行。在 Node.js v19中,移除了对 DTrace/SystemTap/ETW 的支持,主要是因为资源的优先级问题。数据表明很少人用到 DTrace、SystemTap 或 ETW,维护它们没有多大的意义。如果你想恢复使用,可提 issues => github.com/nodejs/node…Node.js v19 将 V8 JavaScript 引擎更新至 V8 10.7,其中包含一个新函数 Intl.NumberFormat,用于格式化敏感数字。
Intl.NumberFormat(locales,options)
对于不同的语言,传入不同的 locales:
constnumber=123456.789; console.log(newIntl.NumberFormat('de-DE',{style:'currency',currency:'EUR'}).format(number)); console.log(newIntl.NumberFormat('ja-JP',{style:'currency',currency:'JPY'}).format(number)); console.log(newIntl.NumberFormat('ar-SA',{style:'currency',currency:'EGP'}).format(number)); console.log(newIntl.NumberFormat('zh-CN',{style:'currency',currency:'CNY'}).format(number));
运行时增加了 node –watch 选项。在 “watch” 模式下运行,当导入的文件被改变时,会重新启动进程。比如:
constexpress=require("express"); constpath=require("path"); constapp=express(); app.use(express.static(path.join(__dirname,"../build"))); app.listen(8080,()=> console.log("Expressserverisrunningonlocalhost:8080") );
%node--watchserver (node:67643)ExperimentalWarning:Watchmodeisanexperimentalfeature.Thisfeaturecouldchangeatanytime (Use`node--trace-warnings...`toshowwherethewarningwascreated) Expressserverisrunningonlocalhost:8080
以上就是“Node.js19有哪些特性”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注云技术行业资讯频道。
这篇文章主要讲解了“如何使用nodejs生成二维码”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用nodejs生成二维码”吧!生成二维码:constqrCode=require(‘qrcode’) cla…