Skip to content

五、经验总结(可带走的原则)

  1. 多套加载机制共存时先划 ownership(Webpack script / Observer / SW / SystemJS);再写 retry,否则请求量按乘积涨。
  2. ESM 失败是可缓存状态:必须以 URL 变化策略显性打破,而不是仅靠「换一种 DOM API」。
  3. Vite 改动态 import 宁晚勿早:当前实现是 writeBundle 后改写 + es-module-lexer + MagicString,保住 __vitePreload / __vite__mapDeps / 异步 CSS 拓扑;experimental.renderBuiltUrl / renderDynamicImport 应明确当作早期、已否决的方案看待。
  4. Vite:vite:preloadError 必须 preventDefault(),载荷读 payload,否则 CSS 预加载失败会 throw,阻断后续 __RF__.load();当前页面实现只阻止这次 throw,不把 preload 事件直接记成一条旧 Resolver failure。
  5. Vite base 与 rule base 不一致时别开构建闸门:用 shouldRewriteUrls(两侧 ensureTrailingSlash 后再比) 一刀切掉「误入 CDN URL 拼装」的工程事故。
  6. 不要用 cloneNode 换新 script src;新建元素 + 属性白名单 + SRI 策略
  7. getAttribute(src)维系与配置前缀的一致性,避免 / vs 绝对 URL 玄学。
  8. CDN 前缀与文件名拼接用 joinAssetPrefix,避免 prod + js/x.jsprodjs
  9. Webpack:CSS chunk 除 Observer 外,须在 RuntimeModule 抑制 CSS 类 loader 的 reject,否则 import() 仍失败;遍历 __webpack_require__.f 中非 j,不限死 miniCss 键名。
  10. SystemJS 与 Observer必须登记 URL 互斥
  11. SW legacy Resolver 才保留 isFallbackurls 前缀命中的语义;页面侧当前由 RecoveryCoordinator 管理恢复,不应再把那套匹配顺序、重复 rule base 优先级或 per-rule circuit 当成公开页面语义。
  12. 页面侧 rf:error 是终态信号,不是稳定 reason 字符串协议:要判断是否真正进入回退链,优先看 rf:retry / rf:fallback;旧 Resolverno-match / rules-exhausted 讨论应限制在历史或 SW 语境。
  13. SW 默认路径必须与 scope 对齐:默认 scope: '/' 就输出 /rf-sw.js,不要把 Service-Worker-Allowed 变成默认部署负担。
  14. SW 配置不要只靠页面 postMessage:早期图片/字体/CSS 子资源可能先于消息发生,构建期应把 manifest 预置进 SW 文件。
  15. opaque response 是策略问题,不是实现细节:默认保守不当失败;若要通过 CORS 探测处理可读的跨源 HTTP 错误,显式启用 fallbackOnOpaque,但 CORS 不可用时 opaque 仍会被接受。
  16. SW 本地调试必须看 originlocalhost127.0.0.1、局域网 IP 是不同 origin;局域网 IP 的 HTTP 不是 secure context,SW 不会注册。
  17. 验证视觉资源要验真实加载:图片看 naturalWidth,字体看 document.fonts.check(),背景图结合 Network/SW 事件;toBeVisible() 只能证明 DOM 存在。
  18. 规则只用 string rule base:不再依赖 RegExp / 函数 match;SW preload 预置的是可 JSON 序列化的配置。
  19. SW 事件要按 clientId 定向:同一个 SW 控制多个 tab 时,广播会污染观测和业务 hook。
  20. SW 的最终失败应返回 Response.error():补发 rf:error 但不伪造内容响应,让资源语义仍像真实 network error。
  21. SW 内 circuit 不应共享页面 localStorage:SW 是跨客户端上下文,页面侧跨 tab 熔断状态不应反向污染 SW fetch 决策。
  22. 要全集拦截与任意资源:倾向 SW;要 Webpack+Vite+cross-browser 一致运行时语义:插件 + __RF__ + Observer更合适。

上一篇:问题案例 · 返回:开发与落地经验