service worker 不动态合并文件,而是通过预缓存微模块静态资源并在 fetch 事件中并行读取、组合响应实现逻辑聚合;需构建时输出独立带哈希的 chunk,由插件写入 precache 清单,sw 按路径约定匹配并返回自定义合成响应。

Service Worker 本身不“动态聚合”资源,它无法在运行时把多个 JS/CSS 文件拼成一个新文件返回。所谓“动态聚合”,实际是指在请求拦截阶段,按需组合已预缓存的微模块静态资产,并以统一响应形式交付——本质是编排而非合并。
预缓存是前提:每个子模块资产必须独立可缓存
微前端中每个子应用(如 dashboard.js、user-profile.css)需作为构建产物中的独立 chunk 输出,并被写入 precache 清单(如 precache-manifest.json)。这一步由构建工具完成,例如 Vite 插件 vite-plugin-pwa 或 Webpack 的 WorkboxWebpackPlugin。没有预缓存,后续所有“聚合”都无从谈起。
- 每个子模块的入口 JS、关键 CSS、字体、图标等静态资源,应有唯一且稳定的 URL(含内容哈希)
- 避免将子模块打包进主应用 bundle;它们必须是可被单独 fetch 的独立资源
- 预缓存失败会中断 SW 安装,因此需用 event.waitUntil() 包裹缓存逻辑,并对缺失资源做 fallback 处理
fetch 事件中实现逻辑聚合:按需组装响应
当主应用通过 import('./modules/chart.js') 加载某个子模块时,Service Worker 的 fetch 事件会被触发。此时可在 event.respondWith() 中检查该请求是否属于已知微模块路径,并从 Cache Storage 中读取多个相关资源(如 JS + 对应 CSS + locale JSON),再用 Response 构造一个合成响应。
前端设计与 UI/UX 全方位优化专家。覆盖视觉层次、排版系统、色彩理论、响应式布局、交互体验、动画动效、无障碍访问、性能优化八大维度,帮助开发者将普通页面升级为高品质产品级界面。前端设计与 UI/UX 全方位优化专家。覆盖视觉层次、排版系统、色彩理论、响应式布局、交互体验、动画动效、无障碍访问、性能优化八大维度,帮助开发者将普通页面升级为高品质产品级界面。
- 不是物理合并文件,而是用 Cache API 并行读取多个已缓存项,再用 new Response(body, options) 返回自定义结构(如 JSON 包裹的资源对象)
- 适合场景:子模块加载时需同时获取配套样式与翻译数据,但又不想发多个请求
- 注意响应头设置,尤其是 Content-Type 和 Cache-Control,避免浏览器误判
避免常见误区:什么不能做
Service Worker 运行在受限环境中,没有 DOM、不支持 eval、无法执行未缓存的远程脚本,也不能修改原始构建产物的内容。
- ❌ 不要尝试在 SW 里用 importScripts 动态加载未预缓存的子模块代码
- ❌ 不要试图在 fetch 回调中解析 JS 字符串并重写 export,这既不可靠也不安全
- ❌ 不要依赖运行时生成的 URL 路径做预缓存——SW 只认构建时确定的静态路径列表
配合主应用做轻量协调:URL 约定优于硬编码
主应用在调用 dynamic import 时,路径应遵循统一约定(如 /micro/charts/v2.1.0/main.js),Service Worker 则根据该路径规则推导出配套资源(/micro/charts/v2.1.0/style.css、/micro/charts/v2.1.0/zh-CN.json)。这种基于路径模式的映射,比在 SW 中维护大段配置更易维护。
- 建议使用正则匹配或前缀判断,而非 switch-case 罗列所有子模块
- 版本号嵌入路径,既支持灰度发布,也天然隔离不同版本缓存
- 主应用可通过自定义 header(如 X-Micro-Assets: style,locale)向 SW 传递加载意图,增强灵活性
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










