为不同类型的资源设计缓存策略,需要综合考虑资源的特性、更新频率以及对用户体验的影响。以下是针对 SPA 项目中常见资源的缓存策略建议:
1. HTML 文件
特点:HTML 文件通常是单页应用的入口文件,内容可能频繁更新,需要确保用户始终获取到最新版本。
缓存策略:
- Cache-Control:设置为不缓存或短时间缓存。 Cache-Control: no-cache 或者 Cache-Control: max-age=0, must-revalidate
- 协商缓存:利用
ETag或Last-Modified,让浏览器在服务器确认资源未修改时使用缓存资源。
2. CSS 和 JS 文件
特点:通常经过打包、压缩,文件名包含哈希值(如 app.d41d8cd98f.js),内容更新时文件名会改变。
缓存策略:
- Cache-Control:设置为长时间缓存,充分利用浏览器缓存。 Cache-Control: max-age=31536000, immutable
- 文件名哈希:通过在文件名中加入内容哈希值,确保文件更新时浏览器能够获取新版本。
3. 图片、字体等静态资源
特点:更新频率低,适合长期缓存。
缓存策略:
- Cache-Control:设置为长时间缓存。 Cache-Control: max-age=31536000, immutable
- 文件名哈希:与 CSS、JS 文件类似,使用内容哈希值命名。
4. 运营图片素材
特点:可能频繁更新,如活动 banner、广告图等,需要在更新后立即生效。
缓存策略:
- Cache-Control:设置较短的缓存时间,或使用协商缓存。 Cache-Control: max-age=3600
- 版本控制:在资源 URL 中添加版本号或时间戳(如
banner.png?v=20231001),当资源更新时,修改版本号以确保浏览器请求新资源。
5. Vite 构建工具的配置
特点:现代前端构建工具如 Vite 支持模块化开发,默认支持热更新和内容哈希,提升开发体验和生产环境的性能。
缓存策略:
- 配置文件名哈希:Vite 默认在生产环境下为静态资源添加内容哈希,生成类似于
app.8d7f3.js这样的文件名。通常无需额外配置,但如果需要定制,可以在vite.config.js中进行配置:
export default {
build: {
rollupOptions: {
output: {
entryFileNames: 'assets/[name].[hash].js',
chunkFileNames: 'assets/[name].[hash].js',
assetFileNames: 'assets/[name].[hash].[ext]'
}
}
}
}
- 清理旧资源:由于文件名包含哈希值,每次构建都会生成新的文件,可以通过配置服务器或使用插件自动清理过期的资源,防止冗余文件占用空间。
6. Service Worker 缓存策略
特点:Service Worker 可以在客户端拦截网络请求,灵活控制资源的缓存策略,实现离线访问、消息推送等高级功能。
缓存策略:
- 静态资源缓存:在 Service Worker 安装阶段,预缓存必要的静态资源(如 HTML、CSS、JS、图片等),后续访问时直接从缓存中读取,提升加载速度。
- 动态缓存与更新:拦截网络请求,根据缓存策略决定是否从网络获取资源或从缓存中读取。可以针对不同的请求类型采用不同的策略,如优先网络、优先缓存、缓存更新等。
- 缓存更新策略:在 Service Worker 激活阶段,清理旧的缓存,确保应用使用最新的资源。
- 离线支持:当用户离线时,通过缓存提供基本的功能和内容,提升用户体验。
- 资源更新通知:当有新的内容发布时,可以通过推送通知或在应用中提示用户刷新页面,以加载最新的资源。
注意事项:
- 安全性:Service Worker 只能在 HTTPS 环境下使用,确保数据传输的安全性。
- 调试与更新:在开发过程中,可以使用
self.skipWaiting()立即激活新的 Service Worker,方便调试。 - 缓存策略选择:根据资源的特性和需求,选择合适的缓存策略,如网络优先、缓存优先、仅缓存、仅网络等。
综合建议
- 合理设置缓存头:根据资源类型设置合适的
Cache-Control、ETag、Last-Modified等响应头。 - 利用文件名哈希:对于静态资源,使用内容哈希确保更新时浏览器获取新资源。
- 控制缓存时间:根据资源更新频率,设置缓存的
max-age。 - 版本管理:通过版本号、时间戳等方式控制需要频繁更新的资源。
- 使用 Service Worker:充分利用 Service Worker 的能力,增强应用的离线体验和缓存控制。
- 测试验证:在实际环境中测试缓存策略的效果,使用浏览器开发者工具检查缓存命中情况。