Maison  >  Article  >  interface Web  >  Node.js 19 est officiellement sorti, parlons de ses 6 fonctionnalités majeures !

Node.js 19 est officiellement sorti, parlons de ses 6 fonctionnalités majeures !

青灯夜游
青灯夜游avant
2022-11-16 20:34:481460parcourir

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 19 est officiellement sorti, parlons de ses 6 fonctionnalités majeures !

Traduit de : 6 Principales fonctionnalités de Node.js 19. Détails des nouvelles fonctionnalités de Node.js 19… | par Jennifer Fu | Octobre 2022 | Une meilleure programmation


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

Node.js 19 est officiellement sorti, parlons de ses 6 fonctionnalités majeures !

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.

1. HTTP(S)/1.1 KeepAlive est par défaut true

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 :

  • V16
% 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
}

Les lignes 14, 16, 42 et 44 définissent la valeur et l'heure par défaut de keepAlive ;
  • L'activation de keepAlive peut réutiliser les connexions et améliorer le débit du réseau.
De plus, le serveur déconnectera automatiquement les clients inactifs lors de l'appel de 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.

2. API WebCrypto stable

close() 自动断开空闲的客户端,内部依靠 http(s).Server.close API 实现;

这些修改,进一步优化了体验和性能。

2. 稳定的 WebCrypto API

WebCrypto API 是一个使用密码学构建的系统接口,在 node.js v19 趋于稳定(除 Ed25519、Ed448、X25519、X448 外)。

我们可以通过调用 globalThis.cryptorequire('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
}

3. 自定义 ESM resolution 调整

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 &#39;process&#39;;

import { valueInFile } from &#39;./file&#39;;
import { valueInFolderIndex } from &#39;./folder&#39;;

console.log(valueInFile);
console.log(valueInFolderIndex);

./file 如果没有自定义加载器,不会去查找文件的扩展名,比如 ./file.js./file.mjs

L'API WebCrypto est une interface système construite à l'aide de la cryptographie, qui a tendance à être stable dans node.js v19 (sauf Ed25519, Ed448, X25519, sauf X448).

Nous pouvons y accéder en appelant globalThis.crypto ou require('node:crypto').webcrypto Ce qui suit est le cryptage subtil. function : Exemple ;

import { isBuiltin } from &#39;node:module&#39;;
import { dirname } from &#39;node:path&#39;;
import { cwd } from &#39;node:process&#39;;
import { fileURLToPath, pathToFileURL } from &#39;node:url&#39;;
import { promisify } from &#39;node:util&#39;;

import resolveCallback from &#39;resolve/async.js&#39;;

const resolveAsync = promisify(resolveCallback);

const baseURL = pathToFileURL(cwd() + &#39;/&#39;).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(&#39;file://&#39;)) {
    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&#39;t search for .mjs extensions
      // but it does search for index.mjs files within directories
      extensions: [&#39;.js&#39;, &#39;.json&#39;, &#39;.node&#39;, &#39;.mjs&#39;],
    });
    url = pathToFileURL(resolution).href;
  } catch (error) {
    if (error.code === &#39;MODULE_NOT_FOUND&#39;) {
      // Match Node&#39;s error code
      error.code = &#39;ERR_MODULE_NOT_FOUND&#39;;
    }
    throw error;
  }

  return next(url, context);
}

Générez d'abord une clé HMAC, qui peut être utilisée pour vérifier l'intégrité et l'authenticité des données du message ;

Ensuite, cryptez la chaîne J'aime les cupcakes ; , qui est une fonction de hachage cryptographique ;

Afficher dans la console : clé, message, informations de résumé
% 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

3. Personnaliser l'ajustement de la résolution ESM

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)

tels que loaders-test/commonjs-extension-resolution- loader /test/basic-fixtures/index.js Fichier :

const number = 123456.789;

console.log(new Intl.NumberFormat(&#39;de-DE&#39;, { style: &#39;currency&#39;, currency: &#39;EUR&#39; }).format(number));
console.log(new Intl.NumberFormat(&#39;ja-JP&#39;, { style: &#39;currency&#39;, currency: &#39;JPY&#39; }).format(number));
console.log(new Intl.NumberFormat(&#39;ar-SA&#39;, { style: &#39;currency&#39;, currency: &#39;EGP&#39; }).format(number));
console.log(new Intl.NumberFormat(&#39;zh-CN&#39;, { style: &#39;currency&#39;, currency: &#39;CNY&#39; }).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

Après avoir configuré un chargeur personnalisé, le problème ci-dessus peut être résolu :

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")
);

Commande de test :

% 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

L'erreur sera ne soit plus signalé, fonctionne normalement.

4. Suppression de la prise en charge de DTrace/SystemTap/ETW

Dans Node.js v19, la prise en charge de DTrace/SystemTap/ETW a été supprimée, principalement en raison de problèmes de priorité des ressources. 🎜🎜Les données montrent que peu de personnes utilisent DTrace, SystemTap ou ETW, et il ne sert à rien de les maintenir. 🎜🎜Si vous souhaitez reprendre l'utilisation, vous pouvez signaler des problèmes => 🎜github.com/nodejs/node…🎜🎜🎜🎜5. Mettez à niveau le moteur V8 vers 10.7🎜🎜🎜Node.js v19 Mettez à jour le moteur JavaScript V8 vers V8. 10.7, il contient une nouvelle fonction Intl.NumberFormat pour formater les nombres sensibles. 🎜rrreee🎜Pour différentes langues, passez dans différents paramètres régionaux : 🎜rrreee🎜🎜6. Expérimentez avec le mode de surveillance du nœud🎜🎜🎜Ajout de l'option node --watch lors de l'exécution. 🎜

在 "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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer