Posted in

Node.js 22:服务器端 JavaScript 的未来_AI阅读总结 — 包阅AI

包阅导读总结

1. 关键词:Node.js 22、新特性、性能提升、开发体验、功能改进

2. 总结:

本文探讨了 Node.js 22 的全新特性和改进,包括 V8 引擎升级、新方法引入、对 Sets 操作的优化、同步加载 ESM 模块等,还介绍了默认启用的功能、新增函数等,同时提到了一些弃用和移除项,标志着 Node.js 平台的重要演进。

3. 主要内容:

– Node.js 22 版本发布,带来众多新特性和改进

– V8 引擎升级至 12.4 版本,引入 WebAssembly 垃圾回收

– 新增方法 `Array.fromAsync`

– 为 Sets 添加多个新方法

– 迭代器新增辅助方法

– 支持同步加载 ECMAScript 模块(ESM)

– WebSocket 客户端实现默认启用

– 新增 `–run` 标志,可从 `package.json` 执行脚本

– 监听模式稳定

– 引入用于模式匹配的函数

– 默认启用 V8 引擎的 Maglev 编译器

– Stream 的默认高水位标记增加

– 包括若干弃用和移除项

– 文中给出相关代码示例辅助说明新特性

– 强调 Node.js 22 是平台演进的重要里程碑,鼓励社区反馈和贡献

思维导图:

文章地址:https://mp.weixin.qq.com/s/CB5a5SEM3umMDF2MpugIvw

文章来源:mp.weixin.qq.com

作者:InfoQ 中文

发布时间:2024/7/30 4:51

语言:中文

总字数:2631字

预计阅读时间:11分钟

评分:83分

标签:Node.js,JavaScript,服务器端开发,V8引擎,WebAssembly


以下为原文内容

本内容来源于用户推荐转载,旨在分享知识与观点,如有侵权请联系删除 联系邮箱 media@ilingban.com

本文探讨了 Node.js 22 的全新特性和改进。

随着 Node.js 22 版本的发布,Node.js 继续突破创新,为开发者提供新的工具和增强性功能,帮助他们创建强大、高效的应用程序。本文将探讨 Node.js 22 给我们带来的一些令人兴奋的新功能和改进。

V8 引擎升级至 12.4 版本是该版本的重要更新之一。本次 V8 升级为我们带来了许多新功能和改进。以下是此次升级的内容。

该版本的亮点之一是引入了 WebAssembly 垃圾回收。这一功能增强了 WebAssembly 代码的内存管理,提高了应用程序的性能和效率。

引入了一个新方法 Array.fromAsync 。该方法允许开发者基于异步可迭代对象异步创建数组。下面是一个简单的例子:

async function* asyncIterable() {     for (let i = 0; i < 5; i++) {           await new Promise((resolve) => setTimeout(resolve, 10 * i));         yield i;     } }  const array = Array.fromAsync(asyncIterable); // [0, 1, 2, 3, 4]

为 Sets 添加了诸如 union(并集)、intersection(交集)和 difference(差集)等多个新方法。这些新增的方法不但简化了 Sets 操作,而且可以方便开发者执行一些常见的集合运算。请看下面这个例子:

const lts = new Set([18, 20, 22]);const nonLts = new Set([17, 19, 21]);
const all = lts.union(nonLts); // 并集 [18, 20, 22, 17, 19, 21]
all.intersection(nonLts); // 交集 [17, 19, 21]
all.difference(nonLts); // 差集 [18, 20, 22]

这些辅助方法包括 take、drop 和 map 等。它们使得操作和处理迭代器的值变得更加简便。以下是一些示例:

function* fibonacci() {  let current = 1;  let next = 1;  while (true) {    yield current;    [current, next] = [next, current + next];  }}
// 取 TOP 5for (const n of fibonacci().take(5)) { console.log(n);}
// 取 TOP 5,然后丢弃 TOP 2for (const n of fibonacci().take(5).drop(2)) { console.log(n);}
// 将每个数值平方for (const n of fibonacci().map((x) => x ** 2)) { console.log(n);}

同步加载 ECMAScript 模块(ESM)是 Node.js 22 中最受期待的功能之一。借助 –experimental-require-module 标志,开发者现在可以使用 require() 来同步加载 ESM 模块。这一特性解决了开发者从 CommonJS 过渡到 ESM 时的一个常见痛点。现在,包作者可以在不中断用户体验的情况下,逐步将代码中的 CommonJS 迁移到 ESM。与此同时,它还能解决因模块重复而导致的 node_modules 目录膨胀问题。下面是一个简单的例子:

导出 ESM 模块

// sum.mjsexport default function sum(a, b) { return a + b }

在 CommonJS 中使用 ESM 模块

// index.cjs const sum = require('./sum.mjs') console.log(sum(1,2)) // it works!

执行代码

node --experimental-require-module index.cjs

但需要注意的是,虽然同步加载 ESM 模块有显著的优势,但仍然存在一些需要考虑的边缘情况和功能之间的相互影响。例如,与其他实验性功能之间的相互影响或涉及循环依赖的场景,可能需要进一步完善。尽管如此,Node.js 22 中这一实验性功能的初步实现为未来的改进和迭代奠定了基础。

在 Node.js 22 中,WebSocket 客户端实现(源自 Undici)现已默认启用,无需再依赖外部库。这一内置的 WebSocket 支持不仅简化了开发流程,还确保了与现代 Web 标准的兼容性。以下是示例代码:

// 创建 WebSocket 连接const socket = new WebSocket("ws://localhost:8080");  // 连接打开socket.addEventListener("open", (event) => {     socket.send("Hello Server!"); });

通过新增的 –run 标志,开发者现在可以直接从 package.json 执行脚本。这一实验性功能简化了在项目 package.json 中定义的公共任务和工作流程的执行过程,从而改善了开发体验。

开发者现在可以使用 –run 标志直接执行 package.json 中 ‘scripts’ 属性定义的命令。如果未提供具体命令,则会列出所有可用的脚本。

当使用 –run 标志时,Node.js 会将当前工作目录下的 ./node_modules/.bin 路径预先添加到 PATH 中。这样就可以执行依赖项中的二进制文件了。

要在当前文件夹中执行 package.json 中的 test 脚本,只需运行如下命令:

需要注意的是,node –run 的目的不在于复制 npm run 的行为或其他包管理器中类似的命令。相反,它因为把一些常见用例的性能表现作为优先事项而有意限制了某些功能:

  • 不会在当前文件夹之外搜索 package.json 文件。

  • 不会预先添加当前文件夹之外的 .bin 或 node_modules/.bin 路径。

  • 执行指定脚本的时候,不会一起执行 pre 或 post 脚本。

  • 不支持定义特定于包管理器的环境变量。

监听模式(Watch Mode)之前是一项实验性功能,现在已经稳定。

如果你不熟悉 Node.js 的监听模式,可以将它理解为一种功能。当该功能开启时,每当检测到被监听文件发生更改时,它会自动重启 Node.js 进程。这意味着在开发和测试过程中,不再需要手动重启或中断 Node.js 进程。要开启该功能,只需在启动 Node.js 应用程序时添加 –watch 标志即可。

默认情况下,它只会监听入口文件和任何被引用或导入的模块。不过,开发者可以通过 –watch-path 标志来自定义此行为,按需指定要监听的特定路径。

下面是个简单的示例:

然后,如果你想设置特定路径,则可以使用下面的命令:

node --watch-path=./src --watch-path=./tests index.js

需要注意的是,–watch-path 目前仅支持 macOS 和 Windows 。如果尝试在不支持该标志的平台上使用则会引发异常。

Node.js 22 引入了用于模式匹配的 glob 和 globSync 函数。开发者现在可以使用这些函数根据指定的模式来匹配文件路径。

import { glob } from 'node:fs';
glob('**/*.js', (err, matches) => { if (err) throw err; console.log(matches);});
import { globSync } from 'node:fs';
console.log(globSync('**/*.js'));

在支持的系统架构上,Node.js 22 会默认启用 V8 引擎的 Maglev 编译器,显著提升了生命周期较短的命令行程序的性能。

Maglev 是继 TurboFan 和 SparkPlug 之后,V8 引擎阵容中的第三个编译器。

TurboFan 的优点是可以生成高度优化的机器码,但其缺点是编译时间较长;SparkPlug 则优先考虑编译速度而非代码优化。而 Maglev 兼具二者之长,它所生成的代码在执行速度上要显著快于 SparkPlug,并且编译速度也远超 TurboFan。

Maglev 通过优化 CPU 使用,提高了 Node.js 应用程序的整体效率,从而缩短了执行时间并改善了资源利用率。

在 Node.js 22 中,Stream 的默认高水位标记从 16KiB 增加到 64KiB,从而显著提升了性能。虽然这一变化可能会多占用一些内存,但其带来的速度和效率上的提升远远超过了任何缺点,对于需要处理大量数据的应用程序来说尤其如此。同时,这一更新也反映了自 Node.js 创建以来,现代计算机能力的提升以及技术的不断进步和发展。

作为持续维护和改进工作的一部分,Node.js 22 还包括了若干弃用和移除项,旨在简化代码库并推广最佳实践。特别是,移除了许多不应公开的加密构造函数和旧的工具方法。建议开发者查看下弃用列表,并制定相应地规划,以确保与 Node.js 未来版本的兼容性。

Node.js 22 标志着 Node.js 平台演进过程中的又一重要里程碑,它引入了新功能,提升了性能,并改进了开发体验。

欢迎探索 Node.js 22 的最新版本,并尝试这些新功能。

一如既往,社区的反馈和贡献在塑造 Node.js 的未来方面发挥着至关重要的作用。因此,请不要犹豫,积极参与进来,分享您的想法和建议。

原文链接:

https://www.nearform.com/digital-community/node-js-22-the-future-of-server-side-javascript/

声明:本文由 InfoQ 翻译,未经许可禁止转载。