这两个新运行时的出现, 自 2009 年发布以来,Node.js 一直是一种流行的 JavaScript 运行时。但是Deno 和 Bun 为它们相对于 Node 所呈现的新功能带来了很多炒作。
从远处看,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 中提供的一些功能。
在 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 具有所运行测试的描述消息。
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构建一个二进制文件。 有关此功能如何工作的更多详细信息,请参阅 本教程 。
Node.js 构建在 V8 引擎之上,由 Google 创建并为 Chromium 维护以执行 JavaScript。 每个版本都会引入新功能和一些性能改进,最终体现在 Node.js 中。
Google发布了V8 10.1,引入了一些新的数组方法,例如 findLast()和 findLastIndex(), 也 Intl.supportedValuesOf(code)。 V8发动机还添加了新的方法 Intl.LocaleAPI ,并优化了 类字段和私有方法 。
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。
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 中默认情况下。
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 的支持将于明年结束。 如果您想更深入地了解这些功能,请参阅 文档页面 。