Node.js22发布,require(esm)终于圆梦了!

前有科技后进阶 2024-04-30 06:12:15

大家好,很高兴又见面了,我是"高级前端‬进阶‬",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力。

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

0 阅读:1

前有科技后进阶

简介:感谢大家的关注