Node 19 est officiellement sorti. Cet article vous donnera une explication détaillée des 6 fonctionnalités majeures de Node.js 19. J'espère qu'il sera utile à tout le monde !
Node.js 14 prendra fin de maintenance des mises à jour en avril 2023, Node.js 16 (LTS) devrait mettre fin à la maintenance des mises à jour en septembre 2023.
Et Node 19 est sorti le 18/10/2022. [Recommandations de didacticiel associées : Tutoriel vidéo Nodejs]
Nous savons qu'il existe deux versions de Node.js : LTS et Current
Parmi elles, la version actuelle est généralement publiée tous les 6 mois.
De nouvelles versions paires sont publiées chaque mois d'avril ;
De nouvelles versions impaires sont publiées chaque mois d'octobre
Au cours du mois d'octobre dernier, la version V19.0.1 est devenue la dernière version « actuelle » des premiers utilisateurs, ce qui a apporté un total ; sur 6 Excellentes fonctionnalités.
Node.js v19 définit la valeur par défaut de keepAlive sur true, ce qui signifie que toutes les connexions HTTP sortantes utiliseront HTTP 1.1 keepAlive, temps par défaut pendant 5S.
Test de code :
const http = require('node:http'); console.log(http.globalAgent); const https = require('node:https'); console.log(https.globalAgent);
Nous pouvons comparer les différences de configuration de l'agent du serveur de nœud entre la v16 et la v19 :
% nvm use 16 Now using node v16.0.0 (npm v7.10.0) % node server Agent { _events: [Object: null prototype] { free: [Function (anonymous)], newListener: [Function: maybeEnableKeylog] }, _eventsCount: 2, _maxListeners: undefined, defaultPort: 80, protocol: 'http:', options: [Object: null prototype] { path: null }, requests: [Object: null prototype] {}, sockets: [Object: null prototype] {}, freeSockets: [Object: null prototype] {}, keepAliveMsecs: 1000, keepAlive : false, maxSockets: Infinity, maxFreeSockets: 256, scheduling: 'lifo', maxTotalSockets: Infinity, totalSocketCount: 0, [Symbol(kCapture)]: false } Agent { _events: [Object: null prototype] { free: [Function (anonymous)], newListener: [Function: maybeEnableKeylog] }, _eventsCount: 2, _maxListeners: undefined, defaultPort: 443, protocol: 'https:', options: [Object: null prototype] { path: null }, requests: [Object: null prototype] {}, sockets: [Object: null prototype] {}, freeSockets: [Object: null prototype] {}, keepAliveMsecs: 1000, keepAlive: false, maxSockets: Infinity, maxFreeSockets: 256, scheduling: 'lifo', maxTotalSockets: Infinity, totalSocketCount: 0, maxCachedSessions: 100, _sessionCache: { map: {}, list: [] }, [Symbol(kCapture)]: false }
Lignes 18 et 40, keepAlive est défini sur false par défaut ;
% nvm use 19 Now using node v19.0.0 (npm v8.19.2) % node server Agent { _events: [Object: null prototype] { free: [Function (anonymous)], newListener: [Function: maybeEnableKeylog] }, _eventsCount: 2, _maxListeners: undefined, defaultPort: 80, protocol: 'http:', options: [Object: null prototype] { keepAlive: true, scheduling: 'lifo', timeout: 5000, noDelay: true, path: null }, requests: [Object: null prototype] {}, sockets: [Object: null prototype] {}, freeSockets: [Object: null prototype] {}, keepAliveMsecs: 1000, keepAlive: true, maxSockets: Infinity, maxFreeSockets: 256, scheduling: 'lifo', maxTotalSockets: Infinity, totalSocketCount: 0, [Symbol(kCapture)]: false } Agent { _events: [Object: null prototype] { free: [Function (anonymous)], newListener: [Function: maybeEnableKeylog] }, _eventsCount: 2, _maxListeners: undefined, defaultPort: 443, protocol: 'https:', options: [Object: null prototype] { keepAlive: true, scheduling: 'lifo', timeout: 5000, noDelay: true, path: null }, requests: [Object: null prototype] {}, sockets: [Object: null prototype] {}, freeSockets: [Object: null prototype] {}, keepAliveMsecs: 1000, keepAlive: true, maxSockets: Infinity, maxFreeSockets: 256, scheduling: 'lifo', maxTotalSockets: Infinity, totalSocketCount: 0, maxCachedSessions: 100, _sessionCache: { map: {}, list: [] }, [Symbol(kCapture)]: false }
close()
, qui est implémenté en interne en s'appuyant sur l'API http(s).Server.close
; Ces modifications optimisent davantage l'expérience et les performances. 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; (async function() { const key = await subtle.generateKey({ name: 'HMAC', hash: 'SHA-256', length: 256 }, true, ['sign', 'verify']); console.log('key =', key); const enc = new TextEncoder(); const message = enc.encode('I love cupcakes'); console.log('message =', message); const digest = await subtle.sign({ name: 'HMAC' }, key, message); console.log('digest =', digest); })();
首先生成 HMAC 密钥,生成的密钥可同时用于验证消息数据完整性和真实性;
然后,对字符串 I love cupcakes
加密;
最后创建 消息摘要,它是一种加密散列函数;
在控制台显示:key 、message 、digest 信息
% node server 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]: <30 01 7a 5c d9 e2 82 55 6b 55 90 4f 1d de 36 d7 89 dd fb fb 1a 9e a0 cc 5d d8 49 13 38 2f d1 bc>, byteLength: 32 }
Node.js 已经删除 --experimental-specifier-resolution
,其功能现在可以通过自定义加载器实现。
可以在这个库中测试:nodejs/loaders-test: Examples demonstrating the Node.js ECMAScript Modules Loaders API
git clone https://github.com/nodejs/loaders-test.git % cd loaders-test/commonjs-extension-resolution-loader % yarn install
比如 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
globalThis.crypto
ou require('node:crypto').webcrypto
Ce qui suit est le cryptage subtil
. function : Exemple ; 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'; import resolveCallback from 'resolve/async.js'; const resolveAsync = promisify(resolveCallback); const baseURL = pathToFileURL(cwd() + '/').href; export async function resolve(specifier, context, next) { const { parentURL = baseURL } = context; if (isBuiltin(specifier)) { return next(specifier, context); } // `resolveAsync` works with paths, not URLs if (specifier.startsWith('file://')) { specifier = fileURLToPath(specifier); } const parentPath = fileURLToPath(parentURL); let url; try { const resolution = await resolveAsync(specifier, { basedir: dirname(parentPath), // For whatever reason, --experimental-specifier-resolution=node doesn't search for .mjs extensions // but it does search for index.mjs files within directories extensions: ['.js', '.json', '.node', '.mjs'], }); url = pathToFileURL(resolution).href; } catch (error) { if (error.code === 'MODULE_NOT_FOUND') { // Match Node's error code error.code = 'ERR_MODULE_NOT_FOUND'; } throw error; } return next(url, context); }
J'aime les cupcakes
; , qui est une fonction de hachage cryptographique ; % node --loader=./loader.js test/basic-fixtures/index (node:56149) ExperimentalWarning: Custom ESM Loaders is an experimental feature. This feature could change at any time (Use `node --trace-warnings ...` to show where the warning was created) hello from file.js
Node.js a été supprimé. --experimental-specifier-resolution
et ses fonctionnalités sont désormais disponibles via un chargeur personnalisé.
Peut être testé dans cette bibliothèque : nodejs/loaders-test : Exemples illustrant l'API de chargeurs de modules ECMAScript Node.js
Intl.NumberFormat(locales, options)
loaders-test/commonjs-extension-resolution- loader /test/basic-fixtures/index.js
Fichier : const number = 123456.789; console.log(new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR' }).format(number)); console.log(new Intl.NumberFormat('ja-JP', { style: 'currency', currency: 'JPY' }).format(number)); console.log(new Intl.NumberFormat('ar-SA', { style: 'currency', currency: 'EGP' }).format(number)); console.log(new Intl.NumberFormat('zh-CN', { style: 'currency', currency: 'CNY' }).format(number));
./file
S'il n'y a pas de chargeur personnalisé, l'extension du fichier ne sera pas recherchée, telle que . /file.js
ou ./file.mjs
const express = require("express"); const path = require("path"); const app = express(); app.use(express.static(path.join(__dirname, "../build"))); app.listen(8080, () => console.log("Express server is running on localhost:8080") );
% node --watch server (node:67643) ExperimentalWarning: Watch mode is an experimental feature. This feature could change at any time (Use `node --trace-warnings ...` to show where the warning was created) Express server is running on localhost:8080
在 "watch" 模式下运行,当导入的文件被改变时,会重新启动进程。
比如:
const express = require("express"); const path = require("path"); const app = express(); app.use(express.static(path.join(__dirname, "../build"))); app.listen(8080, () => console.log("Express server is running on localhost:8080") );
% node --watch server (node:67643) ExperimentalWarning: Watch mode is an experimental feature. This feature could change at any time (Use `node --trace-warnings ...` to show where the warning was created) Express server is running on localhost:8080
Node.js 14 将在 2023 年 4 月结束更新维护,Node.js 16 (LTS) 预计将在 2023 年 9 月结束更新维护。
建议大家开始计划将版本按需升级到 Node.js 16(LTS)或 Node.js 18(LTS)。
更多node相关知识,请访问:nodejs 教程!
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!