探索 Node.js v18 和 v19 中的竞争功能

这两个新运行时的出现, 自 2009 年发布以来,Node.js 一直是一种流行的 JavaScript 运行时。但是Deno 和 Bun 为它们相对于 Node 所呈现的新功能带来了很多炒作。探索 Node.js v18 和 v19 中的竞争功能_第1张图片

从远处看,Node.js 似乎停滞不前,没有什么令人兴奋的事情发生——但事实并非如此。 最近的两个 Node.js 版本 v18 和 v19 带来了许多重要的功能:Node.js v18 功能

Node.js v18 于 2022 年 4 月 19 日发布,并在 2022 年 10 月 Node.js v19 发布之前成为当前版本。 当前版本意味着该版本从 Node.js 的新版本中获得了不间断的功能。

Node.js v18 获得了 watchmode 功能,该功能在 Node v19 发布时向后移植到 Node v18 中。 2022 年 10 月 25 日,Node.js v18 升级为 LTS(长期支持),并将继续获得支持直至 2025 年。

以下是 Node.js v18 中提供的一些功能。

内置获取 API

在 Node.js v18 之前,您无法使用 Node.js 中的 Fetch API 从 API 请求数据。 您必须安装 node-fetch 、 Axios 或其他第三方软件包。使用 Node.js v18,由于 v18 的实验性 Fetch API(全球可用),您不再需要安装任何一个软件包。

让我们看看如何在 Node.js v18 中如何在 Android 设备上使用 Spotify Connect使用 Fetch API。 首先,创建一个 getData.js文件并添加以下向 API 发送请求的函数:

async function fetchData() {
  const response = await fetch(
    "https://random-data-api.com/api/name/random_name"
  );
  if (response.ok) {
    const data = await response.json();
    console.log(data);
  }
}
​
fetchData();

保存文件内容,然后使用以下命令运行该文件 node命令:

node getData.js

该命令运行时,输出将如下所示:

(node:29835) ExperimentalWarning: The Fetch API is an experimental feature. This feature could change at any time
(Use `node --trace-warnings ...` to show where the warning was created)
{
  id: 6638,
  uid: '75026571-e272-4298-b2c0-c3e9e6363437',
  name: 'Candy Kane',
  ...
  prefix: 'Rep.',
  initials: 'LBS'
}

在输出中,Node.js 记录一条警告,如何修复“ERR_CERT_AUTHORITY_INVALID”Chrome 错误指出 Fetch API 处于实验阶段。 警告之后,我们可以看到 API 返回的 JSON 数据。

内置 测试运行模块

开发人员通常使用单元测试来测试软件组件。 从 Node.js 的早期版本开始,我们可以使用以下命令编写简单的测试 assert图书馆 。 但随着我们的测试规模越来越大,我们组织测试和编写描述性消息的需求也随之增加。

等测试运行器 作为一种解决方案, Jest 、 Jasmine 和 Mocha 应运而生,并且已成为单元测试的首选工具。

随着 Node.js v18 的发布,Node.js 中现已包含测试运行程序,可以通过以下方式访问:

import test from 'node:test';

请注意,我们正在使用 node:导入模块的方案。趣知笔记 - 分享有价值的教程! 您还可以使用 CommonJS:

const test = require('node:test')

让我们学习如何使用它。 如何修复睡眠模式在 Windows 11 上不起作用的问题(9 种方法)首先,使用以下命令初始化 npm:

npm init -y

在你的 package.json文件,启用 ES 模块:

{
  ...
  "license": "ISC"
  "type": "module",
}

接下来,创建一个 math.js文件并添加一个返回两个数字相加结果的函数:

const sum = (a, b) => {
  return a + b;
};
​
export default sum;

要使用 Node.js 测试运行程序测试该函数,如何修复 Windows 10/11 中的“注册表值无效”错误请创建一个 test.js文件包含以下内容:

import test from "node:test";
import assert from "assert/strict";
import sum from "./math.js";

test("Sum function", async (t) => {
  await t.test("It should add two numbers", () => {
    assert.equal(sum(2, 2), 4);
  });
  await t.test("It should not subtract numbers", () => {
    assert.notEqual(sum(3, 2), 1);
  });
});

在第一行中,我们导入测试运行程序。 在第二行中,我们导入 assert图书馆,以及随后的 sum()中的功能 math.js文件。

之后,Bing AI 图像生成器:免费生成 AI 图像 (2023)我们创建一个包含两个子测试的测试用例,测试是否 sum()功能正常。

现在,运行测试:

node test.js

您的输出将如下所示:

TAP version 13
# Subtest: Sum function
    # Subtest: It should add two numbers
    ok 1 - It should add two numbers
      ---
      duration_ms: 1.171389
      ...
    # Subtest: It should not subtract numbers
    ok 2 - It should not subtract numbers
      ---
      duration_ms: 0.279246
      ...
    1..2
ok 1 - Sum function
  ---
  duration_ms: 5.522232
  ...
1..1
# tests 1
# pass 1
# fail 0
# cancelled 0
# skipped 0
# todo 0

在输出中,我们可以看到 Node.js 具有所运行测试的描述消息。

网络流 API 支持

Web Streams API 是 Node.js 中的一项实验性功能,可让您将大文件(例如视频或文本文件)分解为可逐渐使用的较小块。 这有助于避免内存问题。 在旧版本的 Node.js 中,您可以使用 Node.js 流 来使用大文件。 但此功能不适用于浏览器中的 JavaScript 应用程序。 后来, WHATWG 定义了 Web Streams API,该 API 现在已成为 JavaScript 应用程序中流数据的标准。

Node.js 直到 v18 才支持此 API。 在 v18 中,所有 Streams API 对象,例如 ReadableStream, WritableStream, 和 TransformStream,可用。 要了解有关如何使用 Streams API 的更多信息,请查看 文档 。

使用快照功能构建二进制文件

另一个令人兴奋的功能是构建单个可执行 Node.js 二进制文件的能力。 在 Node.js v18 之前,构建 Node.js 二进制文件的唯一方法是使用第三方包,例如 pkg 。

但现在,您可以使用实验性快照标志 --node-snapshot-main构建一个二进制文件。 有关此功能如何工作的更多详细信息,请参阅 本教程 。

V8引擎升级至v10.1

Node.js 构建在 V8 引擎之上,由 Google 创建并为 Chromium 维护以执行 JavaScript。 每个版本都会引入新功能和一些性能改进,最终体现在 Node.js 中。

Google发布了V8 10.1,引入了一些新的数组方法,例如 findLast()和 findLastIndex(), 也 Intl.supportedValuesOf(code)。 V8发动机还添加了新的方法 Intl.LocaleAPI ,并优化了 类字段和私有方法 。

watch模式和其他 Node.js v19 功能

Node.js v19 于 2022 年 10 月 18 日发布。由于 19 是奇数,因此它永远不会升级为 LTS,但将继续获得支持,直到 2023 年 4 月发布新的偶数 Node.js 版本。

虽然与 Node.js v18 相比,Node.js v19 并未发布很多功能,但它也为过去的 Node 版本提供了最受欢迎的功能之一: watch模式。

当您在 Node.js 中创建并启动服务器,然后对文件进行更改时,Node.js 不会自动获取新的更改。 这样的工具 您需要重新启动服务器或使用像nodemon ,它会在检测到新更改时自动重新运行文件。

随着 Node.js v19 的发布,这不再是必要的。 Node v19 以及 Node ≥ v 18.11.0 现在能够在使用以下命令检测到新更改时自动重新启动进程 node --watch功能,目前处于实验阶段。

要在监视模式下运行文件,请使用 --watch旗帜:

node --watch index.js

当您编辑 index.js文件中,您将看到该进程自动重新启动并且新的更改得到反映,而无需停止服务器。

如前所述,此功能也已向后移植到 Node.js ≥ v18.11.0,这意味着如果这是您唯一需要的功能,则不必使用 Node.js v19。

HTTP(S)/1.1 KeepAlive默认情况下

Node.js 使用 http.globalAgent对于传出 HTTP 连接和 https.globalAgent用于传出 HTTPS 连接。 这些代理确保 TCP 连接持久性以及 HTTP 客户端可以为多个请求重用连接。

您可以通过设置 HTTP 1.1 将代理配置为重用连接 keepAlive选项 true; 否则,将其设置为 false以避免重复使用连接,这会使速度变慢。

对于 Node.js 版本 ≤18,HTTP/HTTPS 的传出连接具有 keepAlive选项设置为 fal``se,因此连接不会被多个请求重用,从而导致性能下降。 使用 Node.js v19, keepAlive选项现在设置为 true,这意味着您的传出连接将更快,而无需进行任何配置。

我们来验证一下。 假设您正在使用 nvm ,您可以安装 Node.js ≤ v18 并暂时切换到它:

nvm install v18.12.1
node -v
// Output
// v18.12.1

创建一个 checkHttpAlive.js文件并添加以下代码来检查 http.globalAgent:

const http = require('node:http');
console.log(http.globalAgent);

您的输出将如下所示:

// Output
Agent {
  ...
  keepAliveMsecs: 1000,
  keepAlive: false,  // this is the keepAlive option
  ...
}

在输出中,您会注意到 keepAlive被设定为 false默认情况下,在 Node v18 上。

让我们将它与 Node.js v19 进行比较。 使用 nvm 将 Node.js 版本切换到 v19:

nvm install v19.0.1
node -v
// output:
// v19.0.1

跑过 checkHttpAlive.js再次归档:

node checkHttpAlive.js

输出将匹配以下内容:

// output
Agent {
  ...
  keepAliveMsecs: 1000,
  keepAlive: true,
  ...
}

在输出中,您可以看到 keepAlive选项设置为 trueNode.js v19 中默认情况下。

V8 发动机升级至10.7

Node.js v19 的 V8 引擎已升级到版本 10.7。 它并没有附带很多功能——它只添加了 Intl.NumberFormatJavaScript API 的功能。

这 Intl.NumberFormat将数字国际化为货币。 一个例子:

> new Intl.NumberFormat('en-US', { style: 'currency', currency: 'GBP' }).format(3392.10)
'£3,392.10'     // output

结论

在本文中,我们探索了 Node.js v18 和 v19 中的炫酷功能。 首先,我们查看了 v18 中的新功能,其中包括内置的 Fetch API、新的测试运行程序和快照功能, watch模式,并支持 Web Streams API。 然后我们研究了 Node v19 中的新功能,其中包括 watch模式和 HTTP 1.1 keepAlive特征。

尽管 Node.js 的新功能令人兴奋,但其中大部分功能已经存在于 Bun 和 Deno 中。 运行时还包括有用的功能,例如本机 TypeScript 支持、Web 套接字 API,并且执行速度比 Node.js 更快。

如果您不确定使用哪个 Node.js 版本,我会推荐 v18。 它的支持将持续到 2025 年,而 Node v19 的支持将于明年结束。 如果您想更深入地了解这些功能,请参阅 文档页面 。

你可能感兴趣的:(node.js)