大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力。
2024 年 4 月 24 日 Node.js 22 如期发布,众多亮点包括:ES 模块支持 require、WebSocket 客户端支持、V8 JavaScript 引擎更新等等。
另外值得注意的是,Node.js 18 将于 2025 年 4 月终止生命周期,因此非常建议开发者升级到 Node.js 20 (LTS) 或 Node.js 22(即将成为 LTS)。
重点关注点 1:支持 require() 同步 ESM下面是 CJS、ESM 模块的代码示例:
// 下面是 CJS 模块const a = require("./a")module.exports = {a, b: 2}// 下面是 EMSimport a from "./a"export default {a, b: 2}两种模块方式互不兼容,而且迁移非常麻烦。因此,Node.js 贡献者一开始决定对 ESM 语法使用新的文件扩展名,即. mjs。
因此,在声明一个公共的库的时候,开发者通常有两种选择:
忽略 ESM 依然采用 CommonJS将 ESM 与 Babel 转译器结合使用同时支持 ESM 和 CommonJS然而,Node.js 已经提供了对 ES7 和 ES8 的全面支持,如果还需要转译代码才能通过 ESM 语法导出和导入模块确实多少有点不合时宜。
Node.js 22 版本通过 --experimental-require-module 标志添加对同步 ESM 的 require支持。如果启用了该标志,并且 require() 加载的 ECMAScript 模块满足以下要求:
在最近 package.json 或 .mjs 扩展名中使用 "type": "module" 字段显式标记为 ES 模块完全同步、不包括 top-level-await,例如:await Promise.resolve(console.log(''));require() 会将请求的模块作为 ES 模块加载并返回模块名称空间对象 (Name Space Object)。 该模式与动态 import() 非常类似,但是会同步运行(Run Synchronously )并直接返回名称空间对象。 同时,require(esm) 最终还会在不久的将来完全摒弃 flag 标记。
重点关注点 2:Node.js 22 其他重大变化除了上面说明的支持 require() 同步 ESM外,下面也是 Node.js 22 版本带来的诸多值得关注的变化。
V8 版本更新到 12.4,包括 WebAssembly 垃圾收集、Array.fromAsync、Set 方法和迭代器帮助程序等新功能。V8 的 Maglev 编译器在支持的架构上默认启用 (https://v8.dev/blog/maglev),Maglev 显著提高了 CLI 程序的性能。Node.js 22 包含一个新的实验性功能,用于使用 cli 标志 node --run <script-in-package-json> 从 package.json 执行脚本,其还支持 node --run test 在 package.json 脚本中执行测试命令。将 Stream 的默认高水位线(Stream default High Water Mark)从 16KiB 增加到 64KiB,从而带来全面的性能提升,但是鼓励内存敏感环境中的用户显式设置 setDefaultHighWaterMark。从 Node.js 22 版本开始,watch 模式基本稳定。 当处于 watch 模式时,监视文件中的更改会导致 Node.js 进程重新启动。默认情况下将启用 WebSocket 的浏览器兼容实现,为 Node.js 提供了一个 WebSocket 客户端,无需外部依赖。向 node:fsmodule 添加了用于模式匹配的 glob 和 globSync 函数。 开发人员现在可以利用这些函数根据指定模式匹配文件路径。支持 AbortSignal 性能优化参考资料https://nodejs.org/en/blog/announcements/v22-release-announce#running-packagejson-scripts
https://dev.to/emmabase/nodejs-22-is-live-49b1
https://www.codingame.com/playgrounds/5262/native-es-modules-in-node-js
https://www.youtube.com/watch?v=teDVlOjOCT0