Node.js19有哪些特性


今天小编给大家分享一下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]{},
keepAliveMsecs: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
Nowu免费云主机域名singnodev19.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.cryptorequire('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有哪些特性”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注百云主机行业资讯频道。

相关推荐: es6中class继承调用super的原因是什么

本文小编为大家详细介绍“es6中class继承调用super的原因是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“es6中class继承调用super的原因是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。 原因:派生出的构…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 02/22 10:27
Next 02/22 11:03

相关推荐