皇上,还记得我吗?我就是1999年那个Linux伊甸园啊-----24小时滚动更新开源资讯,全年无休!

Node 20.6.0 发布

Node 20.6.0 发布

显著变化
内置 .env 文件支持
从 Node.js v20.6.0 开始,Node.js 支持用于配置环境变量的 .env 文件。

您的配置文件应遵循 INI 文件格式,每一行都包含一个环境变量的键值对。要使用预定义配置初始化 Node.js 应用程序,请使用以下 CLI 命令:node –env-file=config.env index.js。

例如,您可以在应用程序初始化时使用 process.env.PASSWORD 访问以下环境变量:

PASSWORD=nodejs
除环境变量外,这一更改还可让您直接在 .env 文件中定义 NODE_OPTIONS,而无需将其包含在 package.json 中。

此功能由 Yagiz Nizipli 在 #48890 中贡献。

import.meta.resolve 取消标记
在 ES 模块中,import.meta.resolve(specifier) 可用于获取 specifier 解析的绝对 URL 字符串,类似于 CommonJS 中的 require.resolve。这使 Node.js 与浏览器和其他服务器端运行时保持一致。

此功能由 Guy Bedford 在 https://github.com/nodejs/node/pull/49028 中贡献

用于模块定制钩子的新 node:module API 注册;新初始化钩子
node:module 上有一个新的 API 注册器,可用于指定导出模块自定义钩子的文件、向钩子传递数据以及与钩子建立通信通道。以前,”定义带有钩子的文件 “部分是由 –experimental-loader 标志处理的,但当钩子在 20.0.0 中转移到一个专用线程时,需要提供一种在主(应用程序)线程和钩子线程之间进行通信的方法。现在可以通过从主线程调用 register 并传递数据(包括 MessageChannel 实例)来实现。

我们鼓励用户迁移到使用 –import 和 register 的方法,例如

node –import ./file-that-calls-register.js ./app.js
使用 –import 可确保在运行任何应用程序代码(甚至是入口点)之前注册自定义钩子。

此功能由 Izaak Schroeder 在 https://github.com/nodejs/node/pull/48842 和 https://github.com/nodejs/node/pull/48559 中贡献

模块定制加载钩子现在支持 CommonJS
模块定制钩子的作者可以在加载钩子中同时处理 ES 模块和 CommonJS 源。这适用于通过 import 或 require 引用的 CommonJS 模块,只要应用程序的主要入口点是由 ES 模块加载器处理的(例如,入口点是 ES 模块文件,或者通过了 –import 标志)。这将简化 Node.js 模块加载过程的定制,因为软件包作者可以定制更多 Node.js 而无需依赖 require.extensions 等过时的 API。

此功能由 Antoine du Hamel 在 https://github.com/nodejs/node/pull/47999 中贡献

Node.js C++ 加载项现在对 V8 中的 C++ 垃圾收集库 cppgc (Oilpan) 提供实验性支持。
现在,当 Node.js 启动时,它会确保有一个 v8::CppHeap 连接到 V8 隔离区。这样,用户就可以使用 V8 中的 <cppgc/*> 标头在 v8::CppHeap 中进行分配,这些标头现在也包含在附加组件可用的 Node.js 标头中。请注意,由于 Node.js 只捆绑了来自 V8 的 cppgc 库,因此目前在 semver-minor 和 -patch 更新中无法保证 cppgc 的 ABI 稳定性,但我们预计 ABI 不会经常出现问题,因为它在 Chromium 中已稳定运行多年并经过了实战检验。如果 cppgc 在内部和外部得到足够的采用,我们可能会考虑将其纳入 ABI 稳定性保证。

为了帮助插件作者创建 V8 垃圾收集器可以感知的 JavaScript 到 C++ 引用,我们在 node.h 中添加了一个辅助函数 node::SetCppgcReference(isolate,js_object,cppgc_object)。未来,V8 可能会提供一个本地替代函数,从而取代这个 Node.js 专用辅助函数。与此同时,用户可以使用该 API 来避免硬编码 JavaScript 封装对象的布局。有关如何在统一堆中创建垃圾收集的 C++ 对象并将其封装在 JavaScript 对象中的示例,请参阅 Node.js 附加组件测试。

现有的 node::ObjectWrap 助手将继续工作,而基于 cppgc 的对象管理则是一种替代方案,其优势在有关 Oilpan 的 V8 博客文章中有所提及。

该功能由 https://github.com/nodejs/node/pull/48660 和 https://github.com/nodejs/node/pull/45704 中的 Daryl Haresign 和 Joyee Cheung 提供。

其他显著变更
[d6862b085c] – 版本:V8: cherry-pick 93275031284c (Joyee Cheung) #48660
[00fc8bb8b3] – 文档:在协作者中添加 rluvaton (Raz Luvaton) #49215
[d649339abd] – doc:添加新的 TSC 成员(Michael Dawson) #48841
[67f9896247] – (SEMVER-MINOR) 检查器:打开添加 SymbolDispose (Chemi Atlow) #48765
[5aef593db3] – 模块:实现注册工具(João Lenon) #46826
提交
[771abcb5da] – 基准:为 test_runner 添加基准 (Raz Luvaton) #48931
[6b27bb0dab] – 基准:添加 pm 启动基准 (Rafael Gonzaga) #48905
[1f35c0ca55] – child_process:防止原型污染 (Livia Medeiros) #48726
[d6862b085c] – Deps:V8: cherry-pick 93275031284c (Joyee Cheung) #48660
[f71e383948] – 版本:将 simdutf 更新至 3.2.17 (Node.js GitHub Bot) #49019
[e14f0456ae] – 版本:将 googletest 更新至 7e33b6a (Node.js GitHub Bot) #49034
[bfaa0fb500] – 文件:将 zlib 更新至 1.2.13.1-motley-526382e (Node.js GitHub Bot) #49033
[b79c652c85] – 文件:更新 undici 至 5.23.0 (Node.js GitHub Bot) #49021
[6ead86145c] – 版本:将 googletest 更新至 c875c4e(Node.js GitHub Bot) #48964
[4b0e50501e] – 部署:将 ada 更新至 2.6.0(Node.js GitHub Bot) #48896
[d960ee0ba3] – 版本:将 npm 升级至 9.8.1 (npm 团队) #48838
[d92b0139ca] – 资源:将 zlib 升级至 1.2.13.1-motley-61dc0bd (Node.js GitHub Bot) #48788
[2a7835c376] – 文件:V8: cherry-pick 9f4b7699f68e (Joyee Cheung) #48830
[c8e17829ac] – Deps:V8: cherry-pick c1a54d5ffcd1 (Joyee Cheung) #48830
[318e075b6f] – 版本:将 googletest 更新为 cc36671 (Node.js GitHub Bot) #48789
[114e088267] – diagnostics_channel:修复最后一个订阅者移除问题(Gabriel Schulhof) #48933
[00fc8bb8b3] – doc:在协作者中添加 rluvaton (Raz Luvaton) #49215
[21949c45b6] – doc:为 WebStreams 中的示例添加打印结果(Jungku Lee) #49143
[032107a6fe] – doc:修正网络流中的类型符号(Deokjin Kim) #49121
[91d41e7c5a] – 文档:修复初始化()文档中的标志名称 (Antoine du Hamel) #49158
[aa4caf810e] – 文档:明确 NODE_VERSION_IS_RELEASE 的还原 (Rafael Gonzaga) #49114
[f888a1dbe3] – doc:更新 process.binding 过时文本 (Tobias Nießen) #49086
[89fa3faf92] – doc:更新最新的安全版本(Rafael Gonzaga) #49085
[3d36e7a941] – doc:为节点检查的–端口标志添加说明(Michael Bianco) #48785
[e9d9ca12a3] – doc:添加丢失的句号(Rich Trott) #49094
[7e7b554de0] – doc:在 http.md 中添加 ESM 示例 (btea) #47763
[48f8ccfd54] – doc:Ctrl-Y 和 Meta-Y 按键的详细说明 (Ray) #43529
[195885c8f8] – doc:在测试运行器事件细节中添加 “类型”(Phil Nash) #49014
[6ce25f8415] – doc:为电子 27 预留 118 (David Sanders) #49023
[9c26c0f296] – doc:澄清在 Windows 上工作线程中 process.env 的使用 (Daeyeon Jeong) #49008
[7186e02aa0] – doc:移除 v14 提及 (Rafael Gonzaga) #49005
[9641ac6c65] – doc:在秒级发布过程中删除 github 操作检查(Rafael Gonzaga) #48978
[f3d62abb19] – doc:改进 joinDuplicateHeaders 定义 (Matteo Bianchi) #48859
[0db104a08b] – doc:修正 events.addAbortListener 的第二个参数名 (Deokjin Kim) #48922
[5173c559b7] – doc:在自定义记者示例中添加新记者事件 (Chemi Atlow) #48903
[660da785e6] – doc:运行许可证生成器(github-actions[bot]) #48898
[092f9fe92a] – doc:将测试文档中的 duration 改为 duration_ms (Ardi_Nugraha) #48892
[5e4730858d] – doc:改进 requireHostHeader (Guido Penta) #48860
[045e3c549a] – doc:添加支持 Node-api 9 的 18.x 版本 (Michael Dawson) #48876
[c20d35df34] – doc:包含实验功能评估(Rafael Gonzaga) #48824
[d649339abd] – doc:添加新的 TSC 成员(Michael Dawson) #48841
[aeac327f2b] – doc:重构节点-API 支持矩阵(Michael Dawson) #48774
[388c7d9232] – doc:声明 async_hooks.executionAsyncId()示例的路径 (Deokjin Kim) #48556
[fe20528c8e] – doc:去掉结尾的.以减少混淆 (Jason) #48719
[e69c8e173f] – doc: nodejs-social over nodejs/tweet (Rafael Gonzaga) #48769
[ea547849fd] – doc: 扩展压扁和重定向以实现 PR (Chengzhong Wu) #48751
[31442b96a5] – esm:修复 globalPreload 警告 (Antoine du Hamel) #49069
[eb1215878b] – esm:取消 import.meta.resolve 的标记 (Guy Bedford) #49028
[57b24a34e6] – esm:import.meta.resolve 准确模块未找到错误应返回 (Guy Bedford) #49038
[f23b2a3066] – esm:保护ERR_UNSUPPORTED_DIR_IMPORT免受原型污染 (Antoine du Hamel) #49060

[386e826a56] – ESM:添加初始化钩子,与注册整合(Izaak Schroeder) #48842
[74a2e1e0ab] – ESM:修正 parentUrl -> parentURL 的拼写错误 (Antoine du Hamel) #48999
[0a4f7c669a] – ESM:取消标记 Module.register,允许嵌套加载器 import() (Izaak Schroeder) #48559
[a5597470ce] – ESM:添加 globalPreload 测试并修复失败的测试 (Antoine du Hamel) #48779
[d568600b42] – 事件:移除事件目标的弱监听器 (Raz Luvaton) #48952
[3d942d9842] -fs:修复 readdir 递归同步和回调 (Ethan Arrowood) #48698
[c14ff69d69] -fs:在 NUL 字符错误信息中提及 URL (LiviaMedeiros) #48828
[d634d781d7] -fs:让 mkdtemp 接受缓冲区和 URL (LiviaMedeiros) #48828
[4515a285a4] -fs:删除多余的 nullCheck (Livia Medeiros) #48826
[742597b14a] – http:在监听时开始连接检查间隔(Paolo Insogna) #48611
[67f9896247] – (SEMVER-MINOR) 检查器:打开添加符号处置(Chemi Atlow) #48765
[b66a3c1c96] – 库:修复数据 URL 中的 MIME 过度匹配问题 (André Alves) #49104
[dca8678a22] – 库:修复在 Blob.stream() 的 source.pull() 返回前添加 resolve() (bellbind) #48935
[420b85c00f] – 数据库:移除 toASCII 的无效参数 (Yagiz Nizipli) #48878
[a12ce11b09] – lib,权限:启用 pm 时放弃 repl 自动完成 (Rafael Gonzaga) #48920
[458eaf5e75] – 元:将 github/codeql-action 从 2.20.1 升级到 2.21.2 (dependabot[bot]) #48986
[4f88cb10e0] – 元:将 step-security/harden-runner 从 2.4.1 升级到 2.5.0 (dependabot[bot]) #48985
[22fc2a6ec6] – 元:将 actions/setup-node 从 3.6.0 升级至 3.7.0 (dependabot[bot]) #48984
[40103adabd] – 元:将 actions/setup-python 从 4.6.1 升级到 4.7.0 (dependabot[bot]) #48983
[84c0c6848c] – 元:为 atlowChemi (Chemi Atlow) 添加邮件地图条目 #48810
[1a6e9450b8] – 模块:使 CJS 从 ESM 加载器加载 (Antoine du Hamel) #47999
[a5322c4b4a] – 模块:确保成功导入返回相同结果(Antoine du Hamel) #46662
[5aef593db3] – 模块:实现注册工具(João Lenon) #46826
[015c4f788d] – node-api:避免宏重新定义 (Tobias Nießen) #48879
[53ee98566b] – 权限:将 PrintTree 移入未命名空间 (Tobias Nießen) #48874
[30ea480135] – 权限:修复 PrintTree 中的数据类型(Tobias Nießen) #48770
[8380800375] – readline:添加粘贴括号模式(Jakub Jankiewicz) #47150
[bc009d0c10] – sea:添加对 V8 仅字节码缓存的支持 (Darshan Sen) #48191
[f2f4ce9e29] – SRC:使用有效的 cppgc 封装 id 来推断非 cppgc id (Joyee Cheung) #48660
[bf7ff369f6] – SRC:添加内置 .env 文件支持(Yagiz Nizipli) #48890
[8d6948f8e2] – SRC:删除 GenerateSingleExecutableBlob() 中的重复代码 (Jungku Lee) #49119
[b030004cee] – 原始码:重构快照生成器中的向量写入 (Joyee Cheung) #48851
[497df8288d] – src:增加重载快速 api 函数的能力(Yagiz Nizipli) #48993
[e5b0dfa359] – 原始码:删除 uv_handle_type 的多余代码 (Jungku Lee) #49061
[f126b9e3d1] – 原始码:更新 use-equals-default (Jason) #48735
[db4370fc3e] – src:避免在 BuiltinLoader::GetBuiltinIds 中复制字符串 (Yagiz Nizipli) #48721
[9d13503c4e] – src:修复 callback_queue.h 丢失的头 (Jason) #48733
[6c389df3aa] – src:将 v8::Object::GetInternalField() 返回值转换为 v8::Value (Joyee Cheung) #48943
[7b9adff0be] – SRC:不将用户输入传递给格式字符串 (Antoine du Hamel) #48973
[e0fdb7b092] – 原始码:移除 ContextEmbedderIndex::kBindingDataStoreIndex (Joyee Cheung) #48836
[578c3d1e14] – 原始码:使用 ARES_SUCCESS 而不是 0 (Hyunjin Kim) #48834
[ed23426aac] – 原始码:在别名数组(AliasedArray)中保存性能里程碑时间原点(Joyee Cheung) #48708
[5dec186663] – SRC:支持单个可执行应用程序中的快照(Joyee Cheung) #46824
[d759d4f631] – SRC:移除不必要的临时创建(Jason) #48734
[409cc692db] – src:修复 realm 上的 nullptr 访问 (Jan Olaf Krems) #48802
[07d0fd61b1] – 原始码:移除 OnScopeLeaveImpl 的移动赋值重载(Jason) #48732
[41cc3efa23] – SRC:使用 string_view 创建 utf-8 字符串 (Yagiz Nizipli) #48722
[62a46d9335] – SRC,权限:启用 pm 时默认限制 (Rafael Gonzaga) #48907
[099159ce04] – src,工具:初始化 cppgc (Daryl Haresign) #48660
[600c08d197] – stream:提高 WebStreams 性能 (Raz Luvaton) #49089
[609b25fa99] – stream:实现 ReadableStream.from (Debadree Chatterjee) #48395
[750cca2738] – 测试:使用 tmpdir.resolve() (Livia Medeiros) #49128
[6595367649] – 测试:使用 tmpdir.resolve() (Livia Medeiros) #49127
[661b055e75] – 测试:在fs测试中使用tmpdir.resolve() (Livia Medeiros) #49126
[b3c56d206f] – 测试:在 fs 测试中使用 tmpdir.resolve() (Livia Medeiros) #49125
[3ddb155d16] – 测试:修复 test_async.c 中的断言信息 (Tobias Nießen) #49146
[1d17c1032d] – 测试:重构 test-esm-loader-hooks 以方便调试 (Antoine du Hamel) #49131
[13bd7a0293] – 测试:添加 tmpdir.resolve() (Livia Medeiros) #49079
[89b1bce56d] – 测试:文档 fixtures.fileURL() (Livia Medeiros) #49083
[2fcb855c76] – 测试:降低 test-esm-loader-hooks 的易损性 (Antoine du Hame)

[669ac03520] – 测试:添加 tmpdir.fileURL() (Livia Medeiros) #49040
[b945d7be35] – 测试:使用 spawn 和 spawnPromisified 代替 exec (Antoine du Hamel) #48991
[b3a7427583] – 测试:重构 test-node-output-errors (Antoine du Hamel) #48992
[6c3e5c4d69] – 测试:适当时使用 fixtures.fileURL (Antoine du Hamel) #48990
[9138b78bcb] – 测试:验证错误代码而非信息 (Antoine du Hamel) #48972
[b4ca4a6f80] – 测试:修复 cwd 包含空格或反斜线时的快照测试 (Antoine du Hamel) #48959
[d4398d458c] – 测试:以 ASCII 顺序排列 common.mjs (Antoine du Hamel) #48960
[b5991f5250] – 测试:修正测试中的一些假设 (Antoine du Hamel) #48958
[62e23f83f9] – 测试:提高 internal/worker/io.js 的覆盖率 (Yoshiki Kurihara) #42387
[314bd6095c] – 测试:修复 es-module/test-esm-initialization (Antoine du Hamel) #48880
[3680a66df4] – 测试:在 url.parse 中使用逗号验证主机 (Yagiz Nizipli) #48878
[24c3742372] – 测试:删除 test-net-bytes-per-incoming-chunk-overhead (Michaël Zasso) #48811
[e01cce50f5] – 测试:跳过指针压缩实验测试 (Colin Ihrig) #48738
[d5e93b1074] – 测试:修复 x86 上不稳定的 test-string-decode.js (Stefan Stojanovic) #48750
[9136667d7d] – test_runner:不要在 todo 测试中设置退出代码 (Moshe Atlow) #48929
[52c94908c0] – test_runner:修复 todo,且仅在规格报告中(Moshe Atlow) #48929
[5ccfb8d515] – test_runner:在 TAP 报告中解除错误信息 (Colin Ihrig) #48942
[fa19b0ed05] – test_runner:添加 __proto__ null (Raz Luvaton) #48663
[65d23940bf] – test_runner:修复 describe not awaited 中的异步回调 (Raz Luvaton) #48856
[4bd5e55b43] – test_runner:修复 test_runner test:fail 事件类型 (Ethan Arrowood) #48854
[41058beed8] – test_runner:测试结束时调用中止(Raz Luvaton) #48827
[821b11a59f] – TLS:修复双 TLS 的错误 (rogertyang) #48969
[4439327e73] – 工具:更新 lint-md-dependencies (Node.js GitHub Bot) #49122
[21dc844309] – 工具:在操作中使用规格报告器(Moshe Atlow) #49129
[3471758696] – 工具:在 github 操作中运行时使用 @reporters/github (Moshe Atlow) #49129
[95a6e7661e] – 工具:在工具中添加 @reporters/github (Moshe Atlow) #49129
[995cbf93eb] – tools:将 eslint 更新至 8.47.0 (Node.js GitHub Bot) #49124
[ed065bc56e] – tools:更新 lint-md-dependencies 至 rollup@3.27.2 (Node.js GitHub Bot) #49035
[a5f37178ad] – 工具:限制自动启动 CI 的数量(Antoine du Hamel) #49067
[c1bd680f89] – 工具:将 eslint 更新至 8.46.0 (Node.js GitHub Bot) #48966
[e09a6b4821] – tools: update lint-md-dependencies to rollup@3.27.0 (Node.js GitHub Bot) #48965
[0cd2393bd9] – tools: update lint-md-dependencies to rollup@3.26.3 (Node.js GitHub Bot) #48888
[41929a2906] – tools: update lint-md-dependencies to @rollup/plugin-commonjs@25.0.3 (Node.js GitHub Bot) #48791
[1761bdfbd9] – tools: update eslint to 8.45.0 (Node.js GitHub Bot) #48793
[b82f05cc4b] – 类型:更新 child_process 中 cwd 的 JSDoc (LiviaMedeiros) #49029
[be7b511255] – 类型:将 JSDoc 与实际实现同步 (Hyunjin Kim) #48853
[45c860035d] – url:重载 canParse V8 快速 api 方法 (Yagiz Nizipli) #48993
[60d614157b] – url:通过检查路径修复 isURL 检测 (Zhuo Zhang) #48928
[b12c3b5240] – url:确保 getter 访问不会更改可观察符号(Antoine du Hamel) #48897
[30fb7b7535] – url:减少 pathToFileURL cpp 调用 (Yagiz Nizipli) #48709
[c3dbd0c1e4] – util:使用 primordials.ArrayPrototypeIndexOf 代替可变方法 (DaisyDogs07) #48586
[b79b2927ca] – watch:降低去抖动率 (Moshe Atlow) #48926
[a12996298e] – 注意:使用去抖而非节流(Moshe Atlow) #48926

Windows 32-bit Installer: https://nodejs.org/dist/v20.6.0/node-v20.6.0-x86.msi
Windows 64-bit Installer: https://nodejs.org/dist/v20.6.0/node-v20.6.0-x64.msi
Windows ARM 64-bit Installer: https://nodejs.org/dist/v20.6.0/node-v20.6.0-arm64.msi
Windows 32-bit Binary: https://nodejs.org/dist/v20.6.0/win-x86/node.exe
Windows 64-bit Binary: https://nodejs.org/dist/v20.6.0/win-x64/node.exe
Windows ARM 64-bit Binary: https://nodejs.org/dist/v20.6.0/win-arm64/node.exe
macOS 64-bit Installer: https://nodejs.org/dist/v20.6.0/node-v20.6.0.pkg
macOS Apple Silicon 64-bit Binary: https://nodejs.org/dist/v20.6.0/node-v20.6.0-darwin-arm64.tar.gz
macOS Intel 64-bit Binary: https://nodejs.org/dist/v20.6.0/node-v20.6.0-darwin-x64.tar.gz
Linux 64-bit Binary: https://nodejs.org/dist/v20.6.0/node-v20.6.0-linux-x64.tar.xz
Linux PPC LE 64-bit Binary: https://nodejs.org/dist/v20.6.0/node-v20.6.0-linux-ppc64le.tar.xz
Linux s390x 64-bit Binary: https://nodejs.org/dist/v20.6.0/node-v20.6.0-linux-s390x.tar.xz
AIX 64-bit Binary: https://nodejs.org/dist/v20.6.0/node-v20.6.0-aix-ppc64.tar.gz
ARMv7 32-bit Binary: https://nodejs.org/dist/v20.6.0/node-v20.6.0-linux-armv7l.tar.xz
ARMv8 64-bit Binary: https://nodejs.org/dist/v20.6.0/node-v20.6.0-linux-arm64.tar.xz
Source Code: https://nodejs.org/dist/v20.6.0/node-v20.6.0.tar.gz
Other release files: https://nodejs.org/dist/v20.6.0/
Documentation: https://nodejs.org/docs/v20.6.0/api/

转自 Node v20.6.0 (Current) | Node.js (nodejs.org)