Heim > Web-Frontend > js-Tutorial > Hauptteil

Node.js 19 ist offiziell veröffentlicht, lassen Sie uns über seine 6 Hauptfunktionen sprechen!

青灯夜游
Freigeben: 2022-11-16 20:34:48
nach vorne
1502 Leute haben es durchsucht

Node 19 wurde offiziell veröffentlicht. Dieser Artikel gibt Ihnen eine detaillierte Erklärung der 6 Hauptfunktionen von Node.js 19. Ich hoffe, dass er für alle hilfreich sein wird!

Node.js 19 ist offiziell veröffentlicht, lassen Sie uns über seine 6 Hauptfunktionen sprechen!

Übersetzt von: 6 Hauptfunktionen von Node.js 19. Details zu Node.js 19 neuen Funktionen… |. Bessere Programmierung


Node.js 14 wird enden Nach Ablauf der Update-Wartung im April 2023 wird die Update-Wartung für Node.js 16 (LTS) voraussichtlich im September 2023 enden.

Und Node 19 wurde am 18.10.2022 veröffentlicht. [Verwandte Tutorial-Empfehlungen: nodejs-Video-Tutorial]

Wir wissen, dass es zwei Versionen von Node.js gibt: LTS und Current

Node.js 19 ist offiziell veröffentlicht, lassen Sie uns über seine 6 Hauptfunktionen sprechen!

Unter diesen wird die aktuelle Version normalerweise alle 6 Monate veröffentlicht.

Neue Versionen mit geraden Nummern werden jeden April veröffentlicht.

Neue Versionen mit ungeraden Nummern werden jedes Jahr im Oktober veröffentlicht von 6 Tolle Funktionen.

1. HTTP(S)/1.1 KeepAlive ist standardmäßig auf true eingestellt

Node.js v19 setzt den KeepAlive-Standardwert auf true, was bedeutet, dass alle ausgehenden HTTP(s)-Verbindungen HTTP 1.1 KeepAlive verwenden, Standardzeit für 5S ;

Codetest:

const http = require('node:http');
console.log(http.globalAgent);
const https = require('node:https');
console.log(https.globalAgent);
Nach dem Login kopieren

Wir können die Unterschiede in der Knotenserver-Agentenkonfiguration zwischen Version 16 und Version 19 vergleichen:

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
    }
    Nach dem Login kopieren
  • Zeilen 18 und 40, keepAlive ist standardmäßig auf false gesetzt;

V19
  • % 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
    }
    Nach dem Login kopieren
  • Die Zeilen 14, 16, 42 und 44 legen den Standardwert und die Standardzeit von keepAlive fest.

Durch die Aktivierung von keepAlive können Verbindungen wiederverwendet und der Netzwerkdurchsatz verbessert werden.

Darüber hinaus trennt der Server automatisch inaktive Clients, wenn er close() aufruft, was intern durch die Verwendung der API http(s).Server.close implementiert wird;

Diese Modifikationen optimieren das Erlebnis und die Leistung weiter. 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);

})();
Nach dem Login kopieren

首先生成 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
}
Nach dem Login kopieren

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
Nach dem Login kopieren

比如 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);
Nach dem Login kopieren

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

2. Stabile WebCrypto-API

Die WebCrypto-API ist eine mit Kryptografie erstellte Systemschnittstelle, die in node.js v19 tendenziell stabil ist (außer Ed25519, Ed448, X25519, außer X448).

Wir können darauf zugreifen, indem wir globalThis.crypto oder require('node:crypto').webcrypto aufrufen. Das Folgende ist die subtile-Verschlüsselung Funktion: Beispiel;

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);
}
Nach dem Login kopieren

Generieren Sie zuerst den HMAC-Schlüssel, und der generierte Schlüssel kann verwendet werden, um die Integrität und Authentizität der Nachrichtendaten zu überprüfen. Verschlüsseln Sie dann die Zeichenfolge I love Cupcakes;

Erstellen Sie abschließend einen Nachrichtenauszug, bei dem es sich um eine kryptografische Hash-Funktion handelt.

Anzeige in der Konsole: Schlüssel, Nachricht, Zusammenfassungsinformationen

Node.js hat --experimental-specifier-resolution entfernt und seine Funktionalität ist jetzt über einen benutzerdefinierten Loader verfügbar.

Kann in dieser Bibliothek getestet werden: nodejs/loaders-test: Beispiele zur Veranschaulichung der Node.js ECMAScript Module Loaders API

% 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
Nach dem Login kopieren

so wie loaders-test/commonjs-extension-resolution- Loader /test/basic-fixtures/index.js Datei:

Intl.NumberFormat(locales, options)
Nach dem Login kopieren
./file Wenn kein benutzerdefinierter Loader vorhanden ist, wird die Dateierweiterung nicht durchsucht, z. B. . /file.js oder ./file.mjs

Nach dem Einrichten eines benutzerdefinierten Loaders kann das obige Problem gelöst werden:

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));
Nach dem Login kopieren

Testbefehl:

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")
);
Nach dem Login kopieren
Nach dem Login kopieren

Der Fehler wird wird nicht mehr gemeldet, funktioniert normal.

4. Unterstützung für DTrace/SystemTap/ETW entfernt

In Node.js v19 wurde die Unterstützung für DTrace/SystemTap/ETW entfernt, hauptsächlich aufgrund von Problemen mit der Ressourcenpriorität. 🎜🎜Die Daten zeigen, dass nur wenige Menschen DTrace, SystemTap oder ETW verwenden und es wenig Sinn macht, sie zu pflegen. 🎜🎜Wenn Sie die Nutzung wieder aufnehmen möchten, können Sie Probleme melden => 🎜github.com/nodejs/node…🎜🎜🎜🎜5. Aktualisieren Sie die V8-Engine auf 10.7🎜🎜🎜Node.js v19 Aktualisieren Sie die V8-JavaScript-Engine auf V8 10.7, Es enthält eine neue Funktion Intl.NumberFormat zum Formatieren sensibler Zahlen. 🎜
% 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
Nach dem Login kopieren
Nach dem Login kopieren
🎜Übergeben Sie für verschiedene Sprachen unterschiedliche Gebietsschemas: 🎜rrreee🎜🎜6. Experimentieren Sie mit dem Node-Watch-Modus🎜🎜🎜Die Option node --watch wird beim Ausführen hinzugefügt. 🎜

在 "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")
);
Nach dem Login kopieren
Nach dem Login kopieren
% 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
Nach dem Login kopieren
Nach dem Login kopieren

Node.js 14 将在 2023 年 4 月结束更新维护,Node.js 16 (LTS) 预计将在 2023 年 9 月结束更新维护。

建议大家开始计划将版本按需升级到 Node.js 16(LTS)或 Node.js 18(LTS)。

更多node相关知识,请访问:nodejs 教程

Das obige ist der detaillierte Inhalt vonNode.js 19 ist offiziell veröffentlicht, lassen Sie uns über seine 6 Hauptfunktionen sprechen!. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:juejin.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!