Node.js 11.7.0 (Current) 发布解析:Brotli 压缩落地、worker_threads 去掉实验性标志与 npm 6.5.0 升级
【免费下载链接】nodejs.orgThe Node.js® Website项目地址: https://gitcode.com/GitHub_Trending/no/nodejs.org
本文以 Node.js 官方发布于 2019-01-18 的 v11.7.0(Current 版本线)发布公告为主体,逐项拆解该版本 8 大重要变更(Notable Changes)及其背后的实现原理,并结合本仓库(nodejs.org 网站)中生成与渲染发布日志的源码,说明这份文档在官网内容流水线中的位置。读完本文,你将完整掌握 v11.7.0 的新 API 用法、行为变更影响面、下载与校验方式,以及 Node.js 官方发布博客的自动化生成机制。
版本概览:一份发布公告的元信息
v11.7.0 属于 Node.js 11.x「Current」版本线,发布日期为 2019 年 1 月 18 日,由核心维护者 Ruben Bridgewater 发布。该发布公告在仓库中的位置为 apps/site/pages/en/blog/release/v11.7.0.md,其 frontmatter 声明了类别(category: release)、标题、博客布局(layout: blog-post)与作者等信息,与 frontmatter 类型定义 中的字段一一对应。
值得说明的是,这份文档并非纯手工撰写,而是由仓库内置的发布脚本半自动生成:node index.mjs [version]会从 Node.js 官方 changelog、SHASUMS256.txt.asc 与 dist 目录拉取数据,再套用 template.hbs 渲染出完整发布帖,落盘到pages/en/blog/release/vX.md(见 scripts/release-post/index.mjs)。因此,本文讨论的「Notable Changes + Commits + 下载链接 + SHASUMS」四段式结构,正是官方发布帖的标准骨架。
Notable Changes 深度解析:v11.7.0 的 8 项重要变更
1. zlib / compression:正式加入 Brotli 压缩支持
v11.7.0 在zlib模块中引入了 Brotli 压缩算法支持(PR #24938,由 Anna Henningsen 与 Zach Vacura 实现),同时补全了相应的 benchmark、测试与文档。这是本版本最受关注的能力之一,意味着 Node.js 在 gzip/deflate 之外又多了一种高压缩比的 HTTP 内容编码选项。
典型用法如下:
const zlib = require('zlib'); // 一次性(同步)接口 const input = Buffer.from('hello nodejs brotli'); const compressed = zlib.brotliCompressSync(input); const decompressed = zlib.brotliDecompressSync(compressed); // 流式接口,可配合 HTTP 响应使用 const { createBrotliCompress } = require('zlib'); const gzip = createBrotliCompress({ params: { [zlib.constants.BROTLI_PARAM_QUALITY]: 5, // 0-11,越高压缩率越大、耗时越长 }, }); fs.createReadStream('input.txt') .pipe(gzip) .pipe(fs.createWriteStream('output.txt.br'));从源码提交看,该 PR 同时包含deps层引入 Brotli 依赖、benchmark,test增加基准与测试、doc更新文档等多个部分(提交9a627a4694、11c01a6a69、201cf97fcb、7edf8c7e74均与之一致),属于一次横跨 C++ 层、JS 层与文档的完整功能落地。
2. console:新增inspectOptions选项
此前console.log()等方法的输出格式化参数是写死的;v11.7.0 允许通过第二个参数传入inspectOptions(PR #24978,Ruben Bridgewater),将util.inspect()的配置能力透传给控制台输出:
const obj = { level: 1, nested: { level: 2, deep: { level: 3 } } }; // 限制展开深度,避免超大对象刷屏 console.log(obj, { inspectOptions: { depth: 1 } }); // 输出带颜色,便于阅读 console.log(obj, { inspectOptions: { colors: true, sorted: true } });同版本还对此选项做了校验与补强(提交272ddb1765改进inspectOptions验证),并与console模块的内部重构(拆分 global/constructor、懒加载 stderr/stdout 等,见提交4052aec321、7f5bb9d3bf、b2b0645805)一起,为后续console模块的现代化奠定了基础。
3. crypto:始终允许将私钥当作公钥使用
在密码学 API 中,RSA/ECC 等非对称密钥的KeyObject私钥对象本身包含推导公钥所需的信息。v11.7.0 起,crypto模块在需要公钥的场景(如verify()、公钥加密等)下也接受私钥KeyObject(PR #25217,Tobias Nießen):
const crypto = require('crypto'); const { generateKeyPairSync, verify } = require('crypto'); const { publicKey, privateKey } = generateKeyPairSync('rsa', { modulusLength: 2048, }); // 校验签名时,既可以直接传 publicKey,也可以传 privateKey(内含公钥部分) const ok = verify('sha256', Buffer.from('data'), privateKey, signature);该版本同时修复了同步密钥生成中的 key 对象包装问题(提交32e45b20da)与零字节分配断言失败问题(提交f3ebc391a3),并完善了密钥加密选项文档(提交b9b2ba22ec),使crypto模块的密钥处理更健壮。
4. deps:npm 升级至 6.5.0
本版本将内置的 npm 从 6.4.x 升级到 6.5.0(PR #25234,Jordan Harband)。npm 6.x 系列主打安全审计(npm audit)与依赖锁定体验,6.5.0 继续沿这条主线演进。升级随发布帖一同归档,安装 v11.7.0 后执行npm -v即可验证。提交记录为91015918d8(deps: upgrade npm to v6.5.0)。
5. fs:内部改用internalBinding('fs')取代process.binding('fs')
这是一次SEMVER-MAJOR级别的内部重构(PR #22478,Masashi Hirano)。Node.js 内部长期以来通过process.binding('fs')暴露 C++ 原生绑定,v11.7.0 起fs模块内部迁移到更受控的internalBinding('fs'),并把process.binding('fs')正式标记为内部实现。
对普通开发者而言这是透明的——fs的公开 API 没有任何变化;但从架构上看,它服务于 Node.js「收紧process.binding面」的长线工程:本版本中inspector、os等模块也在做同样的迁移(提交4794cf601e、d197105476),不过其中部分迁移因稳定性问题被暂时回滚(提交_Revert_ "inspector: move process.binding to internalBinding"与_Revert_ "os: move process.binding('os') to internalBinding"),可见官方对内部 API 收敛采取的是谨慎渐进策略。
6. http(s):支持覆盖http.globalAgent/https.globalAgent
此前开发者虽然可以给http.globalAgent赋值自定义的 Agent,但部分内部路径并未真正采用新值。v11.7.0 修复了这一点(PR #25170,Roy Sommer,SEMVER-MINOR),让全局 Agent 覆盖真正生效:
const http = require('http'); const https = require('https'); // 全局启用 keep-alive 与连接池调优 http.globalAgent = new http.Agent({ keepAlive: true, maxSockets: 100 }); https.globalAgent = new https.Agent({ keepAlive: true, maxSockets: 100 });此后通过http.request()/https.request()发起的请求都会使用这份全局配置,适合在应用入口统一管理连接池。
7. util:inspect()现在会输出 ArrayBuffer 的详细内容
util.inspect()是 Node.js 调试输出的核心工具。v11.7.0 起,当被检查对象是ArrayBuffer时,不再只显示ArrayBuffer(8)这样的外壳,而是直接展示其底层字节内容(PR #25006,Ruben Bridgewater,SEMVER-MINOR):
const { inspect } = require('util'); const buf = new ArrayBuffer(8); new Uint8Array(buf).set([1, 2, 3, 4]); console.log(inspect(buf)); // 输出类似:ArrayBuffer(8) [ 1, 2, 3, 4, 0, 0, 0, 0 ]同版本还让inspect识别 RegExp 子类与 null 原型对象(提交73f3a1c4e6),并新增了大量子类化检查测试(提交e182ca9bdc),util.inspect的调试体验在这一轮得到明显增强。
8. worker:worker_threads默认可用,移除--experimental-worker标志
这是 v11.7.0 最具标志性的变化:Worker 线程(worker_threads)正式「转正」,不再需要--experimental-worker启动标志(PR #25361,Anna Henningsen)。此前该标志经历了「部分移除」(提交65c136f3de)→「始终置为开启」(提交7bb7b9a61f)→「彻底移除」(提交243f90283c)的渐进过程,最终在 11.7.0 直接可用:
const { Worker } = require('worker_threads'); // 无需任何命令行标志 const worker = new Worker(` const { parentPort } = require('worker_threads'); parentPort.postMessage('hello from worker'); `); worker.on('message', msg => console.log(msg));该版本同时为 Worker 增加了多项配套能力:支持传输 WASM 模块(提交dd8795f4a0)、改进 JS 侧调试(提交e8a6cc8802)、在 V8 序列化 API 中启用内联 WASM(提交7f78137c37),并重构了 Worker 的 IO 与 bootstrap 代码(提交9480e1b795、655c1c9232)。可以说,Node.js 的多线程能力正是从这个版本开始真正面向所有用户开放。
Commits 逐模块解读:242+ 次提交背后还发生了什么
除上述 8 项重点变更外,v11.7.0 还包含大量常规提交。按子系统归类,值得关注的还有:
- buffer:将 Buffer 原型装配迁移到
internal/buffer.js(提交8e84ccb502、042d20ab47),inspect可查看 Buffer 的额外属性(提交68014fbc22),修复非法索引类型的崩溃(提交7dc4c3be03)。 - child_process / net / dns / os:简化参数处理(
272ddb1765);net改用公开的decodeStringsAPI(c13e5be740);修复resolveAny()对 AAAA 记录的 TTL 值(5b4fab1a40);提升networkInterfaces()性能(840ec230f1)。 - tls / http2:澄清
TLSSocket与Socket、session 与 session ID 的语义(提交453bd18969、f6b2ea8bb9等);为TLSSocket.isSessionReused()补文档(2172dbfce4);新增 http2 GOAWAY 测试用例(26f2eb8b12)。 - process / src:Joyee Cheung 在本版本做了大规模启动流程重构——拆分
LoadEnvironment()与startExecution()(6cdaf038ce)、将 per-process 全局变量收敛到node::per_process(c6adf4b44f)、把 process 相关 C++ 方法迁移到独立文件(299aefd81a、5eada9dce4等),并引入 DCHECK 宏(99a5af65df)。 - v8 / deps:从上游 V8 挑选了多个补丁(提交
e1d4f4384a、f2abe7bf76、201cf97fcb);在序列化 API 中启用内联 WASM(7f78137c37)。 - tools / test:ESLint 升级到 5.12.0(
ee4c46c72f)、开启no-buffer-constructor与no-useless-catch规则(ee43540aa7、e6b5232381);大量测试用例重构与 WPT(Web Platform Tests)接入(da34c6c575等),为编码测试引入标准化的 WPT runner。
完整的 242 条提交列表以原发布文档 v11.7.0.md 的 Commits 章节为准。
下载与安装:全平台产物清单
与所有官方发布帖一致,v11.7.0 提供 Windows、macOS、Linux、AIX、SmartOS 及多种 ARM 架构的安装包与二进制,产物统一托管在https://nodejs.org/dist/v11.7.0/:
| 平台 | 产物 |
|---|---|
| Windows 32-bit Installer | https://nodejs.org/dist/v11.7.0/node-v11.7.0-x86.msi |
| Windows 64-bit Installer | https://nodejs.org/dist/v11.7.0/node-v11.7.0-x64.msi |
| Windows 32-bit Binary | https://nodejs.org/dist/v11.7.0/win-x86/node.exe |
| Windows 64-bit Binary | https://nodejs.org/dist/v11.7.0/win-x64/node.exe |
| macOS 64-bit Installer | https://nodejs.org/dist/v11.7.0/node-v11.7.0.pkg |
| macOS 64-bit Binary | https://nodejs.org/dist/v11.7.0/node-v11.7.0-darwin-x64.tar.gz |
| Linux 64-bit Binary | https://nodejs.org/dist/v11.7.0/node-v11.7.0-linux-x64.tar.xz |
| Linux PPC LE 64-bit Binary | https://nodejs.org/dist/v11.7.0/node-v11.7.0-linux-ppc64le.tar.xz |
| Linux s390x 64-bit Binary | https://nodejs.org/dist/v11.7.0/node-v11.7.0-linux-s390x.tar.xz |
| AIX 64-bit Binary | https://nodejs.org/dist/v11.7.0/node-v11.7.0-aix-ppc64.tar.gz |
| SmartOS 64-bit Binary | https://nodejs.org/dist/v11.7.0/node-v11.7.0-sunos-x64.tar.xz |
| ARMv6 32-bit Binary | https://nodejs.org/dist/v11.7.0/node-v11.7.0-linux-armv6l.tar.xz |
| ARMv7 32-bit Binary | https://nodejs.org/dist/v11.7.0/node-v11.7.0-linux-armv7l.tar.xz |
| ARMv8 64-bit Binary | https://nodejs.org/dist/v11.7.0/node-v11.7.0-linux-arm64.tar.xz |
| Source Code | https://nodejs.org/dist/v11.7.0/node-v11.7.0.tar.gz |
从仓库源码可以印证这份下载清单的生成逻辑:发布脚本通过 downloadsTable.mjs 按版本号动态裁剪产物——例如对< 16.0.0的版本剔除 macOS Apple Silicon 产物、对< 19.9.0的版本剔除 Windows ARM 产物,再以 HEAD 请求逐个验证链接有效性(不可达则标记*Coming soon*),最终渲染进template.hbs的{{#files}}区块。
SHASUMS 校验:用 PGP 签名验证下载完整性
每个发布帖都附带 PGP 签名的 SHA-256 校验文件(SHASUMS256.txt.asc),用于验证下载文件未被篡改。v11.7.0 的校验块完整内容如下:
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 081b4c5359dbf320fd167f2b8c075a91980a49a5d95f3d4ecdd075dfb6d92132 node-v11.7.0-aix-ppc64.tar.gz 873b47e6fc97aef2f73b0e8dde641967b2a84a3b63d1697b9d8813e14fb3b01c node-v11.7.0-darwin-x64.tar.gz 0af0843eebeb574d11b94435a4162a8fc1797eea890153214770c6f0153d32ef node-v11.7.0-darwin-x64.tar.xz cd9d705ba27ba009b79652f1cbdef13ee99a916b72100ab749ea831c060b39a7 node-v11.7.0-headers.tar.gz b1372341748de7d9e8e5c764d3d4ec88bd097121ff2ae2b50f46fc43253ac5aa node-v11.7.0-headers.tar.xz cbbc6f68d74433e1b8975606d2f83f3c3fff264466db1c14082d2e16a1951abf node-v11.7.0-linux-arm64.tar.gz 82b9726c6b367a43530f868f61b1b2a05c942d3decdf9d2e18b4a9bdf353c223 node-v11.7.0-linux-arm64.tar.xz 87c956b17d4f529f703c0f1b519888f7986d8d5e81c1992e06c9f96dae27dc0b node-v11.7.0-linux-armv6l.tar.gz 20ded7f501e7375e87d345cc4248e7d40eecc963b721b929a8d8676a1ebc8226 node-v11.7.0-linux-armv6l.tar.xz 6dadf13ef470ff90bef5bc595043da2077e33ce6bbf3ef24793b96d95109a6ae node-v11.7.0-linux-armv7l.tar.gz 524e2538db9685d8a2973eeb09537d8b991bdc487346741ee82f9a21bd2690ec node-v11.7.0-linux-armv7l.tar.xz 48de0f6b42226374cfc76d912f9d569d0b9f81a5646909f847892b2be78759ed node-v11.7.0-linux-ppc64le.tar.gz aee397fedf82ead2fb8a41e42567395cde874ec63baa6c7fe50f42fb2e8883f4 node-v11.7.0-linux-ppc64le.tar.xz e42b01bce12ad893987e7d6775517f72f704dab3b7c49087d6e866e9eba886d8 node-v11.7.0-linux-s390x.tar.gz f13565ab58e8cc308fcbc941af67a17e842dbe6f6bc6d6d1799bbca904edf997 node-v11.7.0-linux-s390x.tar.xz d2ab60b497b59c415dc1d1c0ab3f64da3083a746fb15ec82d917ca7f4743028d node-v11.7.0-linux-x64.tar.gz b2a0a7dde17fe0da5f86ce5fea3da2861d652a5e702e2177ee62813ff86451c0 node-v11.7.0-linux-x64.tar.xz d4e12059afeca85a6ff8035d3ffd073b010f650a8524836864c136d226246c81 node-v11.7.0-sunos-x64.tar.gz 7067103800d94c383a97ea7ca696005849d041d59344182bcffa2635fb6ef2ef node-v11.7.0-sunos-x64.tar.xz 6008a40f944ac9daba492f2404aef82cfc4a878f36ee106d935c1a34f7bd86ea node-v11.7.0-win-x64.7z 00834d16532f24583bf56d2baab03904b0220154cc712344be95e4d05c6234dd node-v11.7.0-win-x64.zip 155ae76195bd04a4e38d1d3a95acaa700d4cc9bc295eae5e176c2a6de4a8b69e node-v11.7.0-win-x86.7z 4d861d4311e515a352fca7f5a4ec8fc5d5069d75c03950bfec45952cb1c8f26d node-v11.7.0-win-x86.zip 56644938be5d053123a4766755b7b06b5428117133b9e57bd945c6053b9c58f6 node-v11.7.0-x64.msi 901cf55bfecdd5048c3184c45087bbefc136be11a5cb224b280d65c95c0ccdbf node-v11.7.0-x86.msi a58f9331c8a944c0d3f70142ef2ea40853c058b5ef890187bd3bfa0ddb82b53b node-v11.7.0.pkg 4d95471083735c275ed3fb4d61458940887edbaae663d0c96ea5395c087ab9dc node-v11.7.0.tar.gz 07febdd8722f6e24ad0cb9360e183baa75a07cad390c14896e3d97027e0fada2 node-v11.7.0.tar.xz d1060afc554bf9c858abab68a1ea5a7845e05c6123477659cc1bebb582ae5830 win-x64/node.exe b1af21cbb79322a09d34af26bf964a5f560883fa57cabc1c987d5f861f6cf131 win-x64/node.lib 497a0983680a333e66c4a4583563f2a6807485a6e45875e1b1ab2d321f3dee8b win-x64/node_pdb.7z f7a7a52091c1ce9a7925e20cdc3c15696d3b00465b978e6824f3336834dbd721 win-x64/node_pdb.zip e908e51873a98520e7e8d54f4afdb1ad0ff4466373ddb511f9d562b7cdbd5a9c win-x86/node.exe 2eb31627eea9007d677fc04fdd69caf72daff96f41fa332a3e850f2ee9c088fd win-x86/node.lib fcc896a301b77d0862913effcaf0bd40c8f172c611a339a61d329d11da057bcc win-x86/node_pdb.7z 1cce183862133641f8ee56569343e8ec8575ea08f1557f45c6f8edd9bf79893b win-x86/node_pdb.zip -----BEGIN PGP SIGNATURE----- iQIzBAEBCAAdFiEEpIwr7mgOhBYyzU5E8HSWs+s8F2IFAlxB06cACgkQ8HSWs+s8 F2LqNQ/+PLHeygvuo7zCPmwhun+yCE2i/GiDYFOffiG22ZfDhPXc9qxfUlUrLlv7 +93Ro22hBPgveSaZuVzXvJiTqXPjEs3IN4apE1GqmWoz+1n0DzsE+5egXr/C/0TY ntOmbKArnLacGrT5TqRhG31CQCmlL+Lh2A3FQUWlPDIpTGFXq+OfjMxW8ddmYoVM 2o2WAvfVZdHezv/kq14sKIDAsfFE1uw1pMx5J+l0icOPxDv082kd0mRjgL3vdcWa kO11Zg1SFHXjHU3XuE+yuTXSDVV8xERDdA1u3ATKQEHCD8hxHpVpNTKk5ih6Jvyf s6WhVG0ygapofYy6GzZ+NNdFVRtQwm0UqZQCWFjssF1HRZVv4vIBORDQWdkXvgQc 4PaQBemSV2V8ytRELxGcmDbNtoumaUzWmKbHAgZ11VD5TCGBBSTpzuMlNjn6MXyB QCMSKvMX/Y+hBByaVZD+8Nh2ilJx9/IzI+XaL+nWdS1Qvrb2rMfI6q1EgpRY7J+k aVyzfOt2qV5qFYXR3B8BZe4dxf2BmmUW/CJxT3O1I9EhAenbuU9S6uQ+bEERDnCZ 6tm/cduAKIlKEMqoTNzewvVcq2IN4BN8+ocZhXf2Um4pXmOHaBoN3MXGz9l2Bhp4 RHk8LuyRfYaicIwu6bWsneb6F33xSJz5WdewCHveujQaV+uj2GE= =NJaJ -----END PGP SIGNATURE-----使用方式:下载产物后在本机计算 SHA-256 并比对上述值,再用 Node.js 官方发布密钥验证 PGP 签名,确保文件与官方构建一致。发布脚本通过fetchShasums(见 index.mjs)自动抓取该文件,抓取失败时以[INSERT SHASUMS HERE]占位符提示人工补齐。
从源码看发布日志的生成与渲染链路
这份 v11.7.0 发布帖不仅是历史存档,更是 nodejs.org 官网内容流水线的标准样例:
- 生成:运行
node index.mjs 11.7.0(release-post/index.mjs),脚本依次拉取对应版本 changelog 段落(fetchChangelog)、解析版本策略(fetchVersionPolicy,如Current)、获取作者信息(fetchAuthor)、抓取 SHASUMS(fetchShasums),并逐条 HEAD 校验下载链接(verifyDownloads);已存在的发布帖会被拒绝覆盖,除非加--force。 - 渲染:handlebars 模板 template.hbs 将上述数据拼装为 frontmatter + changelog + 下载清单 + SHASUMS 的标准四段结构,再用 Prettier 格式化后写入
apps/site/pages/en/blog/release/v11.7.0.md。 - 分类与展示:站点的博客数据层将
category: release归入 release 分类(util/blog.ts 中mapBlogCategoryToPreviewType对release的映射),列表页由 BlogPostCard 渲染卡片(标题、分类、作者、日期);发布信息还同步驱动下载页的版本表与 ReleaseModal(含 LTS/Current/EOL 状态提示),其数据来自 releaseData.mjs 对dist/index.json的解析。
小结
Node.js 11.7.0 是一个「承前启后」的 Current 版本:Brotli 压缩补齐了 zlib 的能力矩阵,inspectOptions让控制台调试更灵活,私钥即公钥的语义简化了加密 API 的使用,而worker_threads摘掉实验性标签则标志着 Node.js 多线程能力的正式开放。与此同时,process.binding向internalBinding的迁移与启动流程重构,透露出官方在内部架构收敛上的持续投入。如果你正在阅读历史发布记录或研究 Node.js 版本演进,本文对应的原始发布文档 apps/site/pages/en/blog/release/v11.7.0.md 中保留了完整的提交哈希与官方下载地址,可作为进一步追溯的一手资料。
【免费下载链接】nodejs.orgThe Node.js® Website项目地址: https://gitcode.com/GitHub_Trending/no/nodejs.org
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考