[性能] 多插件环境下刷新页面全量重下全部 bundle(no-cache),主线程拥塞致插件延迟 10-20s;建议按 rev immutable 缓存 #2063
Replies: 3 comments
|
This is the classic "bundle URL is stable but content isn't content-hashed" failure. Likely root causeThe plugin client bundles are served from stable URLs (e.g. Fix direction (in order of leverage)
Happy to help measure this against a multi-plugin profile and prepare a cherry-pick-ready patch if maintainers want a concrete baseline (fetches, bytes, parse time) before/after. |
补充:本机已实施平台层最小补丁,附官方源码验证(供上游参考)已在本地 1. rev 机制确认(已对照官方 npm 包验证)
2. 对开发流程的影响(实施 immutable 后)
3. 收益预期修正实测全量下载 50 个 bundle / 4.9MB 仅 0.32s——immutable 缓存能省的网络开销有限;5-6s 主体是浏览器端 JS 解析执行(4.9MB 解析 + 全家桶 14 插件初始化)。缓存额外收益是激活 V8 字节码缓存(二次加载解析加速)。治本仍需:减少默认加载插件数量 / 平台懒加载与代码分割。 4. 本机参考实现(serveBundle 内 1 处)const hasRev = new URL(req.url ?? "/", "http://x").searchParams.has("rev");
res.writeHead(200, {
"content-type": isSourceMap ? "application/json; charset=utf-8" : "text/javascript; charset=utf-8",
"cache-control": hasRev ? "public, max-age=31536000, immutable" : "no-cache"
});验证:重开标签页不再全量重下;动态插件(cordis_run 等)走独立通道不受影响。 |
|
@zoahdev 感谢分析,但关于 rev 语义需要澄清——官方源码与实测都表明当前 dsh 已经是"内容哈希 + URL 携带 rev",缺的只是缓存头: dsh源码证据
两点补充
如果你愿意做多插件 profile 的前后基线测量(fetches / bytes / parse time),数据会很有说服力。 |
Uh oh!
There was an error while loading. Please reload this page.
一句话
刷新页面后所有插件 bundle 无缓存全量重下、重新执行,多插件环境(50 个 bundle / 4.9MB)下浏览器主线程拥塞,尾部落地的插件(如 whale-girl 宠物)延迟 10-20s 才显示。
复现
根因
dsh-client-modules.serveBundle对所有插件 bundle 返回cache-control: no-cache,而 bundle URL 本身带内容哈希 rev(/plugins/<id>/client.js?rev=<hash>)——rev 不变内容必不变,完全具备 immutable 长缓存的语义条件。当前每次刷新都全量重下 50 个 bundle(实测 4.9MB)并重新解析执行,主线程被占满;请求数量多、初始化重的插件(whale-girl 16 个素材请求 + 15 次逐像素扫描)排最后,被拖到 10-20s。建议
public, max-age=31536000, immutable(rev 变则 URL 变,天然失效);开发期热重载场景可仅对无 rev / 调试请求保留 no-cache验收条件
用户侧临时缓解(已本机验证)
All reactions