二、本工程难点(为什么不是「加个 onerror」级别)
| 维度 | 难点说明 |
|---|---|
| 语义 | 需同时满足:先走初始 URL、熔断主要约束 备选 host、未 match 的资源不得误改语义(仍会 giveup,但不同于进入回退链)。 |
| Vite | 动态 import 若在 过早 钩子改坏产物,会破坏 __vitePreload/__vite__mapDeps 与异步组件 CSS;必须在 bundle 已定稿后再做字面量动态 import 的定点替换。 |
| Webpack | 全局 error 与 __webpack_require__.l 注入脚本 同一次失败可被两条链路看见,不靠 DOM 标记切分则会 双倍重试;另:异步 CSS chunk(mini-css-extract-plugin、experiments.css 等写入 __webpack_require__.f 的非 j loader)失败时会 reject promise,若仅依赖 Observer 换 <link>,Promise.all 仍会短路,表现为 JS 已回退成功但懒加载仍抛 ChunkLoadError。 |
| ESM | 失败 module record 缓存导致「看似在回退、网络不涨」的假实现;必须与 同一 URL + query 的策略一致才能在各入口复现可控。 |
| 配置与现实 | base/publicPath 与规则的 match 不一致时,若在 Node 侧对「任意 chunk 文件名」误判匹配,会把 本应同源的异步 chunk 整块改到外域——属于 产品与工程双误判,需 shouldRewriteUrls 一类闸门。 |
| Legacy | SystemJS 与 Observer 若不 互斥登记 URL,易产生 双重回退 或遗漏。 |