Vue项目接入PWA核心是通过Service Worker实现按需缓存,依赖Vue CLI内置Workbox支持、合理区分静态资源(CacheFirst)与API(StaleWhileRevalidate)、配置navigateFallback兜底,并通过DevTools调试及可选自定义SW实现离线可用。

Vue 项目接入 PWA,核心是通过 Service Worker 拦截网络请求并缓存关键资源,让应用在无网或弱网下仍可加载首页、静态资源甚至部分路由内容。重点不在“全量离线”,而在于合理缓存策略 + 可靠的注册与更新机制。
一、Vue CLI 已内置 PWA 支持,开箱即用
Vue CLI 3+ 项目默认集成了 workbox-webpack-plugin,只需启用即可生成生产环境可用的 Service Worker。
- 确保项目已安装
@vue/cli-plugin-pwa(Vue CLI 创建时勾选 PWA 或手动添加) - 在
vue.config.js中配置插件选项,例如指定缓存范围和导航回退策略:
module.exports = {
pwa: {
workboxOptions: {
skipWaiting: true,
clientsClaim: true,
navigateFallback: '/index.html', // SPA 路由离线兜底
runtimeCaching: [
{
urlPattern: /^https?:\/\/.*/i,
handler: 'StaleWhileRevalidate',
options: {
cacheName: 'api-cache',
expiration: { maxEntries: 50 }
}
}
]
}
}
}
构建后(npm run build),会在 dist 目录下自动生成 service-worker.js 和 manifest.json。
二、关键缓存策略:区分静态资源与动态内容
Service Worker 不会自动缓存所有请求,需明确告诉它“什么该缓存、怎么缓存、何时更新”。
Element Plus Vue3 桌面组件库。在开发 Vue 3.x 页面时调用,使用 Element Plus 组件(如 el-button、el-input、el-form、el-table 等)。
-
静态资源(HTML/CSS/JS/字体/图片):Webpack 构建时已哈希命名,适合用
CacheFirst策略——优先读缓存,仅首次或更新时走网络 -
API 接口(如 /api/user):建议用
StaleWhileRevalidate——返回旧缓存同时后台更新,兼顾速度与新鲜度 -
导航请求(如 /about、/news/123):必须配置
navigateFallback,让未命中的页面请求 fallback 到index.html,交由 Vue Router 处理
三、手动注册与调试 Service Worker
Vue CLI 会自动注入注册逻辑(位于 public/index.html 的 registerServiceWorker.js),但你需确认它被正确引入且未被注释。
- 打开浏览器 DevTools → Application → Service Workers,查看是否激活、是否有红色错误提示
- 勾选 “Update on reload” 可强制每次刷新时检查新版本
- 点击 “Skip waiting” 可立即激活待定的 SW(绕过等待阶段,适合开发调试)
- 使用 “Offline” 模式测试:Network 面板中切换为 Offline,刷新页面看是否仍能加载
四、进阶:自定义缓存逻辑(非 CLI 默认场景)
若需精细控制(如按用户登录态缓存不同数据、拦截特定请求头、实现离线表单提交队列),可关闭 CLI 自动注册,改用自定义 SW 文件:
- 新建
src/sw.js,用self.addEventListener('fetch', ...)手写拦截逻辑 - 在
main.js中显式注册:navigator.serviceWorker.register('/sw.js') - 注意:自定义 SW 无法直接访问 Vue 实例或 Vuex,需通过
postMessage与页面通信
不复杂但容易忽略:Service Worker 的作用域(scope)默认为注册路径所在目录,如注册在 /sw.js,则只能控制 / 下的请求;若放在 /assets/sw.js,就无法拦截根路径 HTML。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










