Heim >Web-Frontend >js-Tutorial >Node.js 19 ist offiziell veröffentlicht, lassen Sie uns über seine 6 Hauptfunktionen sprechen!

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

青灯夜游
青灯夜游nach vorne
2022-11-16 20:34:481692Durchsuche

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

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
    }
  • 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
    }
  • 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);

})();

首先生成 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

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

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

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

Intl.NumberFormat(locales, options)
./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));

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

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
🎜Ü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")
);
% 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 教程

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:juejin.cn. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen