I. Engineering Highlights (What Sets This Apart)
Unified decision engine:
Resolver(rule match → retry / switch URL / give up),CircuitBreaker, andRetry/backoffshare the same semantics across Webpack, Vite, DOM Observer, and SystemJS legacy entry points — avoiding long-term divergence ("one script for Webpack, copy-paste for Vite").Full coverage of your own build outputs: Not just entry
<script>/<link>, but also Webpack chunk loader (__webpack_require__.l+ non-JS CSS chunk loaders in__webpack_require__.f), Vite dynamicimport()in output (writeBundle+es-module-lexer+MagicString+__RF__.load),vite:preloadErrorand async CSS/JS ordering, mini-css-extract style chunks, and other builder-coupled paths — a different boundary from "swap third-party library CDN" plugins.Aligned with browser quirks: Failed URL cache for
type="module"/ dynamicimport(),<script>cannot be fixed withcloneNode,getAttribute('src')vs.srcfor rule prefix/vs absolute URL — all handled explicitly at runtime (__rf=cache bust, strip timing), reducing trial-and-error for integrators.Ownership boundaries to reduce duplicate work and races: e.g. Webpack
data-webpack<script>→ adapter, Observer skips; same-attribute<link>→ Observer — avoids double-processing async JS and white-screen chains.Observability and ops switches: CustomEvents (
rf:retry/rf:fallback/rf:success/rf:error) are granular enough for monitoring; kill switch and cross-tab circuit (localStorage) complement "change paths only via release" approaches.
Previous: Dev Experience Overview · Next: Technical Challenges