Vue 3 + Vite 做 PWA:用 vite-plugin-pwa 实现离线缓存与可安装

test12026-10-161 次阅读

为什么是 PWA

把 Web 应用做成 PWA 后,用户可以把站点"安装"到桌面,离线也能打开最近访问过的页面,体验更接近原生。Vite 生态里 vite-plugin-pwa 把 Workbox 封装好了,配置成本低。

安装与基础配置

npm i -D vite-plugin-pwa
// vite.config.ts
import { VitePWA } from "vite-plugin-pwa";

export default defineConfig({
  plugins: [
    VitePWA({
      registerType: "autoUpdate",
      manifest: {
        name: "我的应用",
        short_name: "App",
        start_url: "/",
        display: "standalone",
        background_color: "#ffffff",
        theme_color: "#2563eb",
        icons: [
          { src: "icon-192.png", sizes: "192x192", type: "image/png" },
          { src: "icon-512.png", sizes: "512x512", type: "image/png" }
        ]
      },
      workbox: {
        globPatterns: ["**/*.{js,css,html,png,svg}"],
        runtimeCaching: [
          {
            urlPattern: ({ url }) => url.pathname.startsWith("/api/"),
            handler: "NetworkFirst",
            options: { cacheName: "api-cache" }
          }
        ]
      }
    })
  ]
});

在应用里注册与提示更新

插件会自动注入注册逻辑。如果你想在"有新版本"时提示用户刷新,可以用虚拟模块拿到注册对象。

// sw.ts
import { registerSW } from "virtual:pwa-register";

const updateSW = registerSW({
  onNeedRefresh() {
    if (confirm("有新版本,是否刷新?")) updateSW();
  },
  onOfflineReady() {
    console.log("已可离线使用");
  }
});

Vue 组件里感知在线状态

<template>
  <div>
    <span v-if="online">在线</span>
    <span v-else>离线(已缓存内容可用)</span>
  </div>
</template>

<script setup lang="ts">
import { ref, onMounted, onUnmounted } from "vue";

const online = ref(navigator.onLine);
function sync() { online.value = navigator.onLine; }

onMounted(() => {
  window.addEventListener("online", sync);
  window.addEventListener("offline", sync);
});
onUnmounted(() => {
  window.removeEventListener("online", sync);
  window.removeEventListener("offline", sync);
});
</script>

工程注意点

  • 开发环境默认不生成 Service Worker,用 devOptions.enabled: true 才能本地调试,但别把调试开关带上线。
  • 接口缓存用 NetworkFirst,保证数据新鲜;静态资源用 CacheFirst 提速。
  • manifest 的图标尺寸要齐全,否则桌面安装时可能不显示。
  • 更新策略选 autoUpdate 还是 prompt,取决于你能否接受静默刷新用户当前页面。
T

test1

文章作者

为什么是 PWA 把 Web 应用做成 PWA 后,用户可以把站点"安装"到桌面,离线也能打开最近访问过的页面,体验更...

分类
技术
发布时间
2026-10-16
字数
约 2060 字
阅读
1 次