1.
概述与目标
目标:在不托管 WeUI 源码的情况下,通过 CDN 引入并利用浏览器缓存与 Service Worker 离线缓存提升首屏与离线体验。
要点:保证跨域可缓存(CORS)、设置可靠的缓存策略、实现增量更新与回退方案。
2.
准备工作与 CDN 选择
步骤:① 确认所用 WeUI CDN 地址(如腾讯/微信官方、jsdelivr)。② 检查 CDN 支持 CORS(响应头含 Access-Control-Allow-Origin:*)。③ 如果需要 SRI,获取 integrity 值。
建议:优先使用稳定的官方 CDN,并准备本地备份文件以便离线回退。
3.
HTML 引入(示例)
示例:在页面 head 中引入:<link rel="stylesheet" href="https://res.wx.qq.com/open/libs/weui/2.5.4/weui.min.css" crossorigin="anonymous">
说明:加入 crossorigin="anonymous" 可配合 Service Worker 和 SRI 使用;若启用 integrity 属性也可提升安全性。
4.
Service Worker 注册步骤
代码:在主 JS(如 app.js)中注册:
<script> if('serviceWorker' in navigator){navigator.serviceWorker.register('/sw.js').then(()=>console.log('sw registered'));} </script>
注意:sw.js 要放在站点根或合适作用域,且为 HTTPS 环境(本地可用 localhost)。
5.
sw.js 基本实现(缓存 WeUI CDN)
核心逻辑:install 阶段预缓存 WeUI CDN 文件,fetch 阶段对 CDN 路径采用 Cache First 策略。示例关键片段:
const CACHE_NAME='weui-
cdn-v1'; const URLS=['https://res.wx.qq.com/open/libs/weui/2.5.4/weui.min.css'];
self.addEventListener('install', e=>{e.waitUntil(caches.open(CACHE_NAME).then(c=>c.addAll(URLS))); self.skipWaiting();});
self.addEventListener('fetch', e=>{ if(URLS.includes(e.request.url)){ e.respondWith(caches.match(e.request).then(r=>r||fetch(e.request).then(resp=>{caches.open(CACHE_NAME).then(c=>c.put(e.request, resp.clone()));return resp;}))); }});
6.
细化缓存策略与更新
策略:对 WeUI 资源采用 Cache First 并设置版本号(CACHE_NAME),以便发布新版本时更新缓存。
更新流程:每次发布更换 CACHE_NAME,或在 activate 钩子中删除旧缓存:caches.keys().then(keys=>Promise.all(keys.filter(k=>k!==CACHE_NAME).map(k=>caches.delete(k))));
7.
SRI 与跨域问题处理
说明:若使用 integrity,需要 CDN 支持相应哈希并开启 CORS。若无法使用 SRI,可放弃 integrity 并确保 CDN 来源可信。
调试:浏览器控制台会报错(SRI mismatch 或 CORS),按报错修正 header 或更换资源引用方式。
8.
回退与本地缓存方案
实现:在 Service Worker 中对 fetch 做泛化处理,若从网络/缓存都失败,返回本地备份 CSS 或内嵌样式作为回退。
示例:caches.match('/offline-weui.css') 作为最后兜底,确保离线下 UI 仍能基本渲染。
9.
测试与验证步骤
步骤:① 在 Chrome DevTools 的 Application -> Service Workers 检查注册情况;② 在 Cache Storage 查看 weui-cdn 缓存条目;③ 切换 Network -> Offline 验证离线加载;④ 修改 CACHE_NAME 测试更新流程。
提示:使用 Lighthouse 检查离线可用性与缓存命中率。
10.
性能优化与安全建议
优化:使用 rel="preload" 预加载关键 CSS,合理设置资源大小与最大缓存条目。
安全:保证 CDN 源可信,开启 HTTPS 并定期检查依赖版本与完整性。
11.
常见问题:如何避免缓存不更新?
问:当我更新 WeUI 版本后客户端仍使用旧样式,怎么解决?
答:通过在 sw.js 中更新 CACHE_NAME(例如 weui-cdn-v2),并在 activate 钩子删除旧缓存,结合 clients.claim() 和 skipWaiting() 强制生效;也可在 HTML 链接上加版本查询参数作为快速兜底。
12.
常见问题:离线下 CDN 资源被拒绝缓存怎么办?
问:有的 CDN 返回头不允许缓存或不支持 CORS,如何处理?
答:方案:① 将关键 WeUI 文件托管到自己服务器并设置 Cache-Control;② 使用代理(同源)将 CDN 资源转发并添加 CORS 头;③ 若必须使用 CDN,可在 Service Worker 中先尝试 fetch,再将响应 clone 到缓存(注意 CORS 限制)。
13.
常见问题:如何在生产环境平滑上线?
问:上线时怎样保证用户平滑过渡到新缓存且不出现闪烁?
答:策略:先使用 Cache First 保证快速加载,后台通过发送通知或在 next visit 激活新 sw;也可在 activate 后仅在下一次导航时替换资源,或在用户空闲时调用 clients.matchAll() 给页面发消息提示刷新。
来源:weui cdn 整合浏览器缓存与离线功能提升用户体验探索