diff --git a/frontend/index.html b/frontend/index.html index 3247529..8361e4f 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -6,7 +6,7 @@ - + XUGOU - 轻量化监控平台 diff --git a/frontend/package.json b/frontend/package.json index 0b974d5..eee0309 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -61,6 +61,7 @@ "globals": "^13.24.0", "tw-animate-css": "^1.3.0", "typescript": "~5.1.6", - "vite": "^6.0.0" + "vite": "^6.0.0", + "vite-plugin-pwa": "^0.20.1" } } diff --git a/frontend/public/sw.js b/frontend/public/sw.js index c368da5..76f6ca0 100644 --- a/frontend/public/sw.js +++ b/frontend/public/sw.js @@ -1,11 +1,20 @@ -self.addEventListener("install", (event) => { +// 这个文件可以保留为空,或者删除。 +// vite-plugin-pwa 会在构建时自动生成新的 sw.js 文件到输出目录(dist)。 +// 开发环境中,为了避免旧的 Service Worker 缓存导致问题,我们最好确保它被正确地注销。 +// 如果您在开发时遇到缓存问题,可以取消下面代码的注释来强制注销。 + +/* +self.addEventListener('install', (e) => { self.skipWaiting(); }); -self.addEventListener("activate", (event) => { - self.clients.claim(); +self.addEventListener('activate', (e) => { + e.waitUntil( + self.registration.unregister().then(() => { + return self.clients.matchAll(); + }).then(clients => { + clients.forEach(client => client.navigate(client.url)); + }) + ); }); - -self.addEventListener("fetch", (event) => { - event.respondWith(fetch(event.request)); -}); \ No newline at end of file +*/ diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx index 2aee93d..52aa4fb 100644 --- a/frontend/src/main.tsx +++ b/frontend/src/main.tsx @@ -8,18 +8,8 @@ import "./styles/global.css"; import "./i18n/config"; import router from "./router"; -if ("serviceWorker" in navigator) { - window.addEventListener("load", () => { - navigator.serviceWorker - .register("/sw.js") - .then((registration) => { - console.log("Service Worker 注册成功:", registration); - }) - .catch((registrationError) => { - console.log("Service Worker 注册失败:", registrationError); - }); - }); -} +// 删除了手动的 Service Worker 注册代码 +// vite-plugin-pwa 会自动处理 createRoot(document.getElementById("root")!).render( diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts index faeffab..b7d75a3 100644 --- a/frontend/vite.config.ts +++ b/frontend/vite.config.ts @@ -2,10 +2,54 @@ import { defineConfig } from "vite"; import react from "@vitejs/plugin-react"; import path from "path"; import tailwindcss from "@tailwindcss/vite"; +import { VitePWA } from 'vite-plugin-pwa'; // 导入 PWA 插件 // https://vite.dev/config/ export default defineConfig({ - plugins: [react(), tailwindcss()], + plugins: [ + react(), + tailwindcss(), + // 添加 PWA 插件配置 + VitePWA({ + registerType: 'autoUpdate', // 自动更新 Service Worker + injectRegister: 'auto', // 自动注入注册 Service Worker 的代码 + workbox: { + // 配置需要缓存的文件类型 + globPatterns: ['**/*.{js,css,html,ico,png,svg,webmanifest}'] + }, + // 包含在 public 目录中的其他需要缓存的资源 + includeAssets: ['favicon.svg', 'apple-touch-icon.png'], + // PWA 应用清单配置 + manifest: { + name: 'XUGOU', + short_name: 'XUGOU', + description: 'XUGOU 是一个基于 CloudFlare 的轻量化系统监控平台,提供系统监控和状态页面功能。', + theme_color: '#4F46E5', + background_color: '#ffffff', + display: 'standalone', + scope: '/', + start_url: '/', + icons: [ + { + src: 'android-chrome-192x192.png', + sizes: '192x192', + type: 'image/png' + }, + { + src: 'android-chrome-512x512.png', + sizes: '512x512', + type: 'image/png' + }, + { + src: 'android-chrome-512x512.png', + sizes: '512x512', + type: 'image/png', + purpose: 'maskable' // 添加 'maskable' 图标, 优化 Android 上的显示效果 + } + ] + } + }) + ], resolve: { alias: { "@": path.resolve(__dirname, "./src"), // __dirname 指向 vite.config.ts 文件所在的目录