外观
完整搜索索引序列化后的构建对象生命周期
恢复事实与范围
main为8a0cab79,工作树干净,中断a02五轮限定E4已过、28/66;网站交付仍partial,磁盘未开始。上一轮实际产生新归因证据,属于进展;未出现需要重跑手机的变化。旧候选e88e40a4只作审计,不合并该分支。前七次新失败全部保留,尤其768MiB新图OOM,停止堆参数路线。
私有部分client产物的完整索引11,735,321B、7695节、167121词项。a09保留采样中MiniSearch.add的Map97,005,496B和set21,218,184B;不是准确总堆或最终全页数字(本批新文档会增加索引)。锁定VitePress1.6.4源码将indexByLocales放在localSearchPlugin闭包内,load/configureServer/handleHotUpdate等闭包随插件保留到构建结束;旧资产适配仍持有original load,因而序列化后也未释放索引Map。Rollup锁定源码runHook按plugin当前属性取函数。索引Map在生成完成后已不再参与生产浏览器查询,但仍与后续压缩/SSR阶段重叠。
定稿方案
仅复用经逐文件审查的两个旧候选:锁定11.17.2 Mermaid完整浏览器分发本地提供(减少重新打包其图),以及完整搜索索引静态JSON资产化;不复用无完整收益证据的Git预取。新修复针对搜索插件生命周期:build配置解析完成后,将开发服务器专用与已消费的配置钩子替换成不捕获原闭包的空函数,resolve/load改为小型生产钩子。根索引只生成一次;取得全locale原始完整字符串、emitFile完成后,在finally将最后一个original load引用置空。只保留根模块Promise和已输出资产,不保留MiniSearch或原钩子。失败显式拒绝,无静默回退;开发server继续原实现。
搜索索引原始内容、分词、字段、权重与HTTP消费合同保持;不删页、不缩section、不改归档/公式。Mermaid原初始化/渲染语义保持,全部ESM相对引用和许可证照旧。依赖锁及node_modules不改。源码/锁SHA前后固定,实际全页验收不以旧7695/167121代替新规模。
轻量与速度预算
索引生成原路径O(全部页面字节+词项数),生命周期处理O(locale数),资产包装O(索引字节),locale≤32、单份≤32MiB/总≤64MiB。根Promise共享,原生成最多一次,不加worker/驻留服务;预计释放上述约118MB采样路径所代表的一部分保留对象,实际节省须以新真实构建证明,不能当保证值。新增包装预计≤0.2秒;完整站点仍180秒/聚合1536MiB/后代≤32、Node24.19.0/old-space1024MiB。恢复已定1024MiB,不试其他堆档、不扩大聚合门。首响应按根load完成时间、长任务按总build wall记录;CPU/RSS/进程与I/O可取得项分别记录,未知项不虚构。
验证与停止条件
先用纯控制验证多次根请求只读一次、完整locale数据逐字节一致、引用在成功和失败后释放;通过独立受控WeakRef/显式GC验证测试夹具闭包不再被生产钩子保留(显式GC仅测试用,不进入构建)。保留已有格式/HTTP失败/容量反控。再一次新独占常规npm run build(包含父npm进程,源稳定),0错误/0死链、完整输出和资源门全过才算E2完整构建通过;失败立即保留partial、不继续同路试参数。
构建成功后再浏览器验证搜索命中新旧结果及知识页、Mermaid代表性真实渲染与本地依赖请求。完成结果/归档/门禁联动,窄提交双推,最终生产干净同SHA发布验证;缺认证则保留partial,不以本地成功冒充上线。28/66不变,公证继续暂缓、内部ARM190不重装,不进磁盘。
Implementation Update · 2026-10-19
逐文件复用旧Mermaid分发和完整JSON资产适配,新增生产钩子工厂释放生成器闭包;未恢复Git预取,未merge审计分支。控制发现失败Error的V8惰性stack也会保留原生成函数,最初失败分支WeakRef仍存活;保留失败事实,先读取原Error.stack令其物化为原有完整字符串,再原样抛出,finally置空最后load引用。此后成功/失败两分支WeakRef释放、根Promise共享、两locale逐字节保留/HTTP失败/格式与大小门3控制全部通过(94.6ms)。首个失败断言曾输出大夹具,随后改布尔断言避免日志膨胀,未减小夹具或放松回收条件。显式GC仅控制,正式构建无GC调用。
锁定Mermaid209文件/16,613,399B,104个ESM/923相对引用闭包及逐件SHA成立;尚无浏览器可用结论。下一一次原预算新独占整站构建,所有旧失败与旧私有输出保持。
Validation Update · 2026-10-19 · 生命周期释放成立,整站仍超门
a12常规构建实际根索引1,845.270ms、11,748,725B,记录生成器引用释放;9.697秒/CPU21.835秒后聚合RSS1,619,869,696B触原门。Node构建1,437,155,328B、npm70,303,744B、esbuild112,410,624B;一次SIGTERM、无强杀,1202文件/21,133,744B源SHA稳定。client已产出后仍未完成client+server/全站。2002文件/55,738,076B部分输出不是真实通过。控制只证明闭包可回收,不保证V8在聚合RSS达到门之前回收/归还内存;该差别是本次确认的剩余问题,不称生命周期修复已完成交付。
Recovery Decision · 2026-10-19 · 仅在构建阶段边界回收
不继续试堆。依据:受控WeakRef证明生成对象可达性已解除,真实构建仍在后续阶段超门;前采样停止后的heapTotal与RSS也不等同,不能用heapUsed推算聚合RSS。本次选择在生产构建索引生成器释放后、服务端bundle配置完成前各一次显式major GC,降低阶段间短命对象重叠。不是每页或周期轮询;最多三个检查点(若服务端也请求索引),仍以完整实测判定。
npm build入口显式node --expose-gc执行原VitePress CLI,不隐藏npm父进程,不改old-space1024MiB或聚合1536MiB/180秒/32进程。开发server及浏览器无GC能力变化。插件只有在build环境启用此检查点;每次先yield一个event-loop边界后回收,记录before/after的heap/RSS与回收wall。不得把GC前后差当精确原生峰值节省。预计每次20–200ms,整体额外≤1秒目标;最差仍整体180秒守卫,若明显慢或仍超门保持partial。不清编译缓存/源数据、不移除功能。
这是对初版“正式构建无GC调用”的明确后续决策,该初版和a12失败保持原样;只在新的独占a13验证。若失败停止该路线,不重复触门。GC的环境前置缺失需明确报错,不默默跳过。新真实通过前不进入浏览器/发布或磁盘。
Phase Collection Result · 2026-10-19
a13实际两次回收:索引后24.060ms,heapUsed647,466,216→278,648,008B、RSS1,126,432,768→1,094,205,440B;server前12.996ms,heapUsed473,573,472→202,680,328B、RSS1,223,704,576→1,191,100,416B。可回收JS对象减少不等于RSS对应减少,不能继续依据heapUsed设置堆档。完整构建9.602秒/CPU21.684秒后聚合1,627,668,480B超门,一次SIGTERM无强杀,1202文件/21,136,531B稳定,2002文件部分输出保留。此路线未关闭资源门,停止同进程GC方案。下一按分阶段短进程方案处理,不扩预算或缩页面。