尧图精选

Node.js 22.10.0 (Current) 发布解读:`module-sync` 导出条件与稳定化的 `node --run`

🕒 发布时间:2026/9/18 23:03:15 📁 来源:尧图网络
Node.js 22.10.0 (Current) 发布解读module-sync导出条件与稳定化的node --run【免费下载链接】nodejs.orgThe Node.js® Website项目地址: https://gitcode.com/GitHub_Trending/no/nodejs.orgNode.js v22.10.0 于 2024-10-16 发布是 22.x 主线上的一个 Current 版本由 Antoine du Hameladuh95主导发布。本版最核心的两项能力是为require(esm)生态引入全新的module-syncexports 条件帮助双格式dual-package作者在过渡期安全地做到 ESM-first以及将 CLI 命令node --run从实验状态转为稳定。阅读本文你将掌握module-sync的配置写法与取舍原则、node --run的用法以及本版在 crypto、http2、module、process、test_runner、worker 等模块新增的 API 全貌并了解这类发布说明在 nodejs.org 网站仓库中是如何被生成与呈现的。版本概览与仓库位置发布说明的原始文档位于本仓库的 apps/site/pages/en/blog/release/v22.10.0.md归属于release博客分类。nodejs.org 网站仓库将每个版本的发布说明作为一个 Markdown 文件存放在pages/en/blog/release/目录下该目录目前已有 804 个版本文件文件头部的 frontmatter 记录了date、category: release、title、layout: blog-post与author等元数据网站的 layouts/Post.tsx 会据此渲染文章标题、作者头像与正文。在数据侧next-data/generators/releaseData.mjs 通过getMajorNodeReleases()见 next-data/generators/majorNodeReleases.mjs拉取各主版本的发布数据为每个版本整理出version、npm、v8、modules、releaseDate、minorVersions以及statusCurrent/LTS/EOL由 releaseData.mjs 中的getNodeReleaseStatus根据 LTS 状态与 EOL 日期计算。同时 next-data/generators/releaseVersions.mjs 会汇总所有vX.Y.Z版本号用于构建版本下载页等路由数据。也就是说本文所解读的发布说明正是驱动整个网站版本发布信息体系的核心内容源。核心亮点一全新的module-syncexports 条件它解决什么问题自require(esm)在 Node.js 中可用后包作者面临一个棘手的过渡期部分活跃的 LTS 版本支持require(esm)而更老的版本不支持。若包同时提供 ESM 与 CJS 两份产物消费者通过require()或import加载时可能拿到不同副本造成经典的 dual-package hazard双重包危害即同一模块被实例化两份共享状态失效。module-sync正是为此设计的同步 ESM 特性检测机制当require(esm)可用时该条件被激活Node.js 模块加载器无论收到require()还是import都能拿到同一个同步 ESM 模块。这与打包器bundler长期使用的module条件思路类似但专门面向 Node.js 原生加载器。完整的配置示例适用于同时面向 Node.js 与其他环境如浏览器打包场景的包{ type: module, exports: { node: { // On new version of Node.js, both require() and import get // the ESM version module-sync: ./index.js, // On older version of Node.js, where module-sync and require(esm) are // not supported, use the CJS version to avoid dual-package hazard. // When package authors think its time to drop support for older versions of // Node.js, they can remove the exports conditions and just use main: index.js. default: ./dist/index.cjs }, // On any other environment, use the ESM version. default: ./index.js } }若包只面向 Node.js希望老版本回退到 CJS则直接省略node层级{ type: module, exports: { // On new version of Node.js, both require() and import get the ESM version module-sync: ./index.js, // On older version of Node.js, where module-sync and require(esm) are // not supported, use the CJS version to avoid dual-package hazard. // When package authors think its time to drop support for older versions of // Node.js, they can remove the exports conditions and just use main: index.js. default: ./dist/index.cjs } }为什么不用现成的module条件发布说明给出了明确的工程决策理由生态中现有使用module条件的代码有时会假设这些 ESM 文件可以按 CJS 风格解析例如允许import ./noext、import ./directory这对打包器成立但 Node.js 原生加载器有意让 ESM 解析规则区别于 CJS并禁止上述写法。因此直接实现module条件而不实现被禁止的 ESM 解析规则反而会造成破坏。最终选择以 semver-minor 的方式新增一个独立命名的条件便于回移植到较老的 LTS 分支。该项由 Joyee Cheung 贡献PR #54648对应提交111261e245module: implement the module-sync exports condition。同版还合并了 Joyee Cheung 的c89c93496dmodule: refator ESM loader for adding future synchronous hooksPR #54769为后续增加同步钩子重构了 ESM 加载器为module-sync这类同步能力铺路。对包作者与工具作者的指导发布说明对两类受众给出了明确的实践指引对包作者module-sync只是过渡期部分活跃 LTS 支持require(esm)、部分不支持内的特性检测手段。当所有活跃 LTS 都支持require(esm)后可以提升主版本号、删除 CJS 导出、移除module-sync条件仅保留指向 ESM 的main或default过渡期内如需同时兼顾打包器与 Node.js 直接运行应同时配置module-sync与module并指向同一份 ESM 文件如果本就不打算支持不支持require(esm)的老版本则无需使用该条件。对打包器/工具作者建议避免实现这个过渡性条件——现有打包器已实现事实标准的module条件足以支持从 CJS 消费方打包 ESM 的用户。若工具确实要实现推荐让该条件指向的解析图规则与 Node.js 原生 ESM 规则保持一致避免行为分叉。核心亮点二node --run正式稳定node --run用于执行package.json中scripts对象里定义的脚本省去npm run的间接层本版将其从实验特性转为稳定提交465d05018asrc: mark node --run as stablePR #53763由 Yagiz Nizipli 贡献。例如对如下package.json{ scripts: { test: node --test-reporter junit --test ./test } }直接运行node --run test即可启动测试套件。同版还包含048a1ab350cli: ensure --run has proper pwdPR #54949确保--run在正确的当前工作目录下执行修正了工作目录相关的边界问题。其他值得关注的 SEMVER-MINOR 变更本版还包含 14 项SEMVER-MINOR级别的 API 新增覆盖以下模块模块变更内容相关提交 / PRcrypto新增KeyObject.prototype.toCryptoKeyf0b441230a#55262crypto为validTo/validFrom增加 Date 字段349d2ed07b#54159http2暴露nghttp2_option_set_stream_reset_rate_limit选项914db60159#54875lib触发事件前将 aborted 状态传播给依赖信号f7c3b03759#54826module支持以 URL 作为入口点加载32261fc98a#54933module实现flushCompileCache()06957ff355#54971moduleenableCompileCache()传入非法参数时抛错2dcf70c347#54971module编译缓存先写入临时文件再重命名落盘f9b19d7c44#54971process新增process.features.require_modulee95163b170#55241process新增process.features.typescript4050f68e5d#54295test_runnerrun()支持自定义参数86f7cb802d#55126test_runner新增test:summary事件b62f2f8259#54851test_runnerrun()支持覆盖率收集d7c708aec5#53937worker新增markAsUncloneableAPI5fda4a1498#55234其中与require(esm)主线直接相关的有两点process.features.require_module运行时特性检测字段可用于判断当前 Node.js 是否支持require(esm)与module-sync导出条件的应用场景互补——前者是代码内检测后者是包导出解析层的声明式方案。process.features.typescript与 Node.js 对 TypeScript 文件strip-types的内建支持相关同版还有6fcac73738module: wrap swc error in ERR_INVALID_TYPESCRIPT_SYNTAX#55316等配套提交releaseData.mjs 等站点数据生成逻辑也依赖这类 features 信息来呈现各版本能力。依赖与工具链更新本版同步升级了一批关键依赖见发布说明 Commits 中的deps条目npm升级到 10.9.0f703652e84undici更新到 6.20.034ca36a397OpenSSL升级到 quictls/openssl-3.0.15quic163d51c82fearchs 文件同步更新bb9f77d53aV8回移多个补丁b533a51856、2f65b3fd07、1de5512383corepack更新到 0.29.40d4536543btimezone数据更新到 2024bb0636a1e88此外sqlite 模块实验性在本版启用了默认开启外键约束67f5f46c56#54777并关闭了 DQS 默认误配置57a9d3f15e#55297。全平台安装包清单与 SHASUMS 校验支持的平台与产物v22.10.0 提供以下安装包与二进制完整列表见发布说明末尾文件名均已体现平台与架构Windowsx86 / x64 / ARM64 三档的 Installer.msi与 Binarynode.exe以及.7z/.zip归档macOS64-bit Installer.pkg、Apple Silicondarwin-arm64与 Inteldarwin-x64的.tar.gz二进制Linuxx64、PPC LEppc64le、s390x、ARMv7armv7l、ARM64arm64的.tar.gz/.tar.xz二进制AIXppc64 二进制源码包node-v22.10.0.tar.gz与.tar.xz另含-headers归档这些清单在网站仓库中并非手写而是由 scripts/release-post/downloadsTable.mjs 中的downloadOptions模板数组 resolveDownloads()按版本规则动态生成例如 16.0.0剔除 macOS Apple Silicon 项、 19.9.0剔除 Windows ARM 项、 23.0.0剔除 32 位 Windows 项、 24.0.0剔除 ARMv7 项最终通过resolveUrl()将%version%占位符替换为实际版本号。校验与签名验证发布说明末尾附带了 PGP 签名的 SHASUMS 块头部为-----BEGIN PGP SIGNED MESSAGE-----、Hash: SHA256包含每个产物的 SHA256 摘要。验证流程为下载对应平台的安装包与SHASUMS256.txt.asc签名文件使用shasum -a 256或sha256sum核对文件摘要是否与清单一致使用gpg导入 Node.js 发布团队公钥后对签名块执行gpg --verify确认签名真实有效。发布说明在网站中如何生成与呈现本仓库的 scripts/release-post/index.mjs 是专门用于生成这类发布博客的工具运行node index.mjs [version]后它会通过fetchChangelog()从 Node.js 上游 CHANGELOG 中按a id版本号锚点截取对应版本的变更段落index.mjs 中rxSection正则用fetchVersionPolicy()解析出Current/LTS等版本策略经fetchAuthor()定位发布作者再由fetchShasums()拉取签名校验和、verifyDownloads()逐一探测各下载链接是否可用最后把以上数据交给 template.hbshandlebars 模板渲染写入pages/en/blog/release/vX.md。若文件已存在且未加--force脚本会拒绝覆盖。发布后网站前端通过 util/blog.ts 的mapBlogCategoryToPreviewType()将release类别映射为发布预览类型并结合 layouts/Post.tsx 中的WithAvatarGroup、WithMetaBar、WithBlogCrossLinks等组件完成最终页面呈现。因此本文所分析的每一项 API 变更、下载产物与校验信息都是经过上述自动化工具体系产出并展示给全球开发者的正式发布记录。【免费下载链接】nodejs.orgThe Node.js® Website项目地址: https://gitcode.com/GitHub_Trending/no/nodejs.org创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联 返回资讯列表 →