import path from 'node:path' import { fileURLToPath } from 'node:url' import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' import { VitePWA } from 'vite-plugin-pwa' import { cloudflare } from '@cloudflare/vite-plugin' const projRoot = path.dirname(fileURLToPath(import.meta.url)) // https://vite.dev/config/ export default defineConfig({ root: path.resolve(projRoot, 'frontend'), publicDir: path.resolve(projRoot, 'public'), build: { outDir: path.resolve(projRoot, 'dist/client'), emptyOutDir: true, }, plugins: [ react(), VitePWA({ registerType: 'prompt', includeAssets: ['favicon.ico', 'logo.png', 'logo192.png', 'logo512.png'], manifest: { name: 'ModelPing', short_name: 'ModelPing', description: '大模型 API 可用性与首字延迟监控', theme_color: '#27ae60', background_color: '#dfe6eb', display: 'standalone', orientation: 'portrait-primary', start_url: '/', scope: '/', lang: 'zh-CN', icons: [ { src: 'logo192.png', sizes: '192x192', type: 'image/png', }, { src: 'logo512.png', sizes: '512x512', type: 'image/png', }, { src: 'logo512.png', sizes: '512x512', type: 'image/png', purpose: 'maskable', }, ], }, workbox: { globPatterns: ['**/*.{js,css,html,ico,png,svg,woff2}'], navigateFallback: '/index.html', cleanupOutdatedCaches: true, }, }), cloudflare(), ], })