概述
vite-plugin-pwa
是一个为 Vite 提供 PWA(Progressive Web Apps)功能的零配置插件。它结合了 Web 和原生应用的优点,为用户提供更优质的应用体验。该插件支持多种框架,包括 Vue、React、Svelte、SolidJS、Preact 等。
主要特性
- 零配置:为常见用例提供合理的默认配置
- 可扩展:暴露完整的自定义插件行为能力
- 类型安全:使用 TypeScript 编写
- 离线支持:通过 Workbox 生成支持离线的 Service Worker
- 完全可摇树优化:自动注入 Web App Manifest
- 新内容提示:内置支持 Vanilla JavaScript、Vue 3、React、Svelte、SolidJS 和 Preact
- Stale-while-revalidate:当有新内容可用时自动重新加载
安装
# npm
npm install vite-plugin-pwa -D
# yarn
yarn add vite-plugin-pwa -D
# pnpm
pnpm add vite-plugin-pwa -D
基础使用
配置 Vite
在 vite.config.js
或 vite.config.ts
文件中添加插件:
import { defineConfig } from "vite";
import { VitePWA } from "vite-plugin-pwa";
export default defineConfig({
plugins: [VitePWA()],
});
类型定义
在 tsconfig.json
中添加类型定义:
{
"compilerOptions": {
"types": ["vite/client", "vite-plugin-pwa/client"]
}
}
或在 vite-env.d.ts
文件中添加:
/// <reference types="vite-plugin-pwa/client" />
注册 Service Worker
在应用入口文件中注册 Service Worker:
import { registerSW } from "virtual:pwa-register";
registerSW({
// 每小时检查一次更新
onRegistered: (r) => r && setInterval(async () => await r.update(), 3600000),
// 注册失败时输出错误
onRegisterError: (error) => console.error(error),
});
配置选项
基础配置
VitePWA({
// 注册类型:'autoUpdate' | 'prompt'
registerType: "autoUpdate",
// 输入目录
srcDir: "./src",
// 输出目录
outDir: "./dist",
// 是否在开发模式下启用
devOptions: {
enabled: true,
},
});
Web App Manifest 配置
VitePWA({
manifest: {
name: "我的 PWA 应用",
short_name: "PWA App",
description: "一个使用 Vite Plugin PWA 构建的应用",
theme_color: "#ffffff",
background_color: "#ffffff",
display: "standalone",
orientation: "portrait",
scope: "/",
start_url: "/",
icons: [
{
src: "pwa-192x192.png",
sizes: "192x192",
type: "image/png",
},
{
src: "pwa-512x512.png",
sizes: "512x512",
type: "image/png",
},
{
src: "pwa-512x512.png",
sizes: "512x512",
type: "image/png",
purpose: "any maskable",
},
],
},
});
Workbox 配置
VitePWA({
workbox: {
// 全局模式匹配
globPatterns: ["**/*.{css,js,html,svg,png,ico,txt,woff2}"],
// 运行时缓存配置
runtimeCaching: [
{
// API 请求缓存
urlPattern: ({ url }) => url.pathname.startsWith("/api"),
handler: "CacheFirst",
options: {
cacheName: "api-cache",
expiration: {
maxEntries: 10,
maxAgeSeconds: 60 * 60 * 24, // 1天
},
cacheableResponse: {
statuses: [0, 200],
},
},
},
{
// 图片缓存
urlPattern: /\.(?:png|jpg|jpeg|svg|gif|webp)$/,
handler: "CacheFirst",
options: {
cacheName: "images-cache",
expiration: {
maxEntries: 60,
maxAgeSeconds: 60 * 60 * 24 * 30, // 30天
},
},
},
],
},
});
框架集成
Vue 3
<script setup>
import { onMounted } from "vue";
import { registerSW } from "virtual:pwa-register";
onMounted(() => {
registerSW({
onNeedRefresh() {
console.log("需要刷新");
},
onOfflineReady() {
console.log("应用已准备离线使用");
},
});
});
</script>
React
import { useEffect } from "react";
import { registerSW } from "virtual:pwa-register";
function App() {
useEffect(() => {
registerSW({
onNeedRefresh() {
console.log("需要刷新");
},
onOfflineReady() {
console.log("应用已准备离线使用");
},
});
}, []);
return <div>我的 PWA 应用</div>;
}
高级配置
自定义 Service Worker
VitePWA({
strategies: "injectManifest",
srcDir: "src",
filename: "sw.ts",
workbox: {
// 自定义配置
},
});
开发模式配置
VitePWA({
devOptions: {
enabled: true,
type: "module",
},
});
禁用 PWA 功能
VitePWA({
disable: process.env.NODE_ENV === "development",
});
最佳实践
缓存策略选择
- CacheFirst:适用于静态资源(图片、字体、CSS、JS)
- NetworkFirst:适用于 API 请求
- StaleWhileRevalidate:适用于需要实时性的内容
图标配置
确保提供多种尺寸的图标:
icons: [
{ src: "icon-192.png", sizes: "192x192", type: "image/png" },
{ src: "icon-512.png", sizes: "512x512", type: "image/png" },
];
更新策略
registerSW({
onNeedRefresh() {
// 显示更新提示
if (confirm("发现新版本,是否立即更新?")) {
updateSW(true);
}
},
});
错误处理
registerSW({
onRegisterError(error) {
console.error("SW 注册失败:", error);
},
onOfflineReady() {
console.log("应用已准备离线使用");
},
});
常见问题
Q: 如何测试 PWA 功能?
A: 使用 Chrome DevTools 的 Application 标签页,可以查看 Manifest、Service Worker 和缓存状态。
Q: 如何更新 Service Worker?
A: 插件会自动处理更新,你也可以通过 registerSW
的回调函数自定义更新逻辑。
Q: 如何禁用 PWA 功能?
A: 设置 disable: true
或使用环境变量控制。
Q: 如何处理离线状态?
A: 通过 Workbox 的 runtimeCaching
配置缓存策略,确保关键资源在离线时可用。
总结
vite-plugin-pwa
是一个功能强大且易于使用的 PWA 插件,它提供了零配置的 PWA 功能,同时保持了高度的可定制性。通过合理配置,你可以轻松构建出具有离线能力、可安装的现代 Web 应用。
PWA 的核心是提升用户体验,确保你的应用在离线状态下仍能正常工作,并提供接近原生应用的体验。
原文链接:https://code.ifrontend.net/archives/1278,转载请注明出处。
评论0