Files
play-life/play-life-web/vite.config.js
2026-02-08 17:01:36 +03:00

187 lines
6.0 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { defineConfig, loadEnv } from 'vite'
import react from '@vitejs/plugin-react'
import { VitePWA } from 'vite-plugin-pwa'
import { resolve } from 'path'
export default defineConfig(({ mode }) => {
// Загружаем переменные окружения из корня проекта
// Сначала пробуем корневой .env, затем локальный
const rootEnv = loadEnv(mode, resolve(process.cwd(), '..'), '')
const localEnv = loadEnv(mode, process.cwd(), '')
// Объединяем переменные (локальные имеют приоритет)
const env = { ...rootEnv, ...localEnv, ...process.env }
return {
plugins: [
react(),
VitePWA({
registerType: 'autoUpdate',
includeAssets: ['favicon-new.ico?v=3.18.1', 'apple-touch-icon.png?v=3.18.1', 'favicon.svg?v=3.18.1'],
manifest: {
name: 'PlayLife - Статистика и задачи',
short_name: 'PlayLife',
description: 'Трекер продуктивности и изучения слов',
theme_color: '#4f46e5',
background_color: '#f3f4f6',
display: 'standalone',
orientation: 'portrait',
start_url: '/',
scope: '/',
icons: [
{
src: 'pwa-192x192.png?v=3.18.1',
sizes: '192x192',
type: 'image/png'
},
{
src: 'pwa-512x512.png?v=3.18.1',
sizes: '512x512',
type: 'image/png'
},
{
src: 'pwa-maskable-192x192.png?v=3.18.1',
sizes: '192x192',
type: 'image/png',
purpose: 'maskable'
},
{
src: 'pwa-maskable-512x512.png?v=3.18.1',
sizes: '512x512',
type: 'image/png',
purpose: 'maskable'
}
]
},
workbox: {
// Кэширование статики
globPatterns: ['**/*.{js,css,html,ico,png,svg,woff,woff2}'],
// Исключаем /admin из навигационного fallback (чтобы Service Worker не перехватывал)
navigateFallbackDenylist: [/^\/admin/],
// Стратегии для API
runtimeCaching: [
{
// Кэширование данных текущей недели
urlPattern: /\/playlife-feed$/,
handler: 'NetworkFirst',
options: {
cacheName: 'api-current-week',
expiration: {
maxEntries: 1,
maxAgeSeconds: 60 * 60 // 1 час
},
networkTimeoutSeconds: 10
}
},
{
// Кэширование полной статистики
urlPattern: /\/d2dc349a-0d13-49b2-a8f0-1ab094bfba9b$/,
handler: 'NetworkFirst',
options: {
cacheName: 'api-full-statistics',
expiration: {
maxEntries: 1,
maxAgeSeconds: 60 * 60 // 1 час
},
networkTimeoutSeconds: 10
}
},
{
// Кэширование списка задач
urlPattern: /\/api\/tasks$/,
handler: 'NetworkFirst',
options: {
cacheName: 'api-tasks',
expiration: {
maxEntries: 1,
maxAgeSeconds: 60 * 60 // 1 час
},
networkTimeoutSeconds: 10
}
},
{
// Остальные API запросы - только сеть (не кэшировать)
urlPattern: /\/api\/.*/,
handler: 'NetworkOnly'
},
{
// Кэширование статических файлов с ограничением срока жизни
urlPattern: /\.(?:js|css|html|ico|png|svg|woff|woff2)$/,
handler: 'CacheFirst',
options: {
cacheName: 'static-assets',
expiration: {
maxAgeSeconds: 60 * 60 // 1 час
}
}
}
]
}
})
],
server: {
host: '0.0.0.0',
port: parseInt(env.VITE_PORT || '3000', 10),
proxy: {
// Proxy API requests to backend
'/api': {
target: 'http://localhost:8080',
changeOrigin: true,
secure: false,
},
// Proxy other API endpoints
'/playlife-feed': {
target: 'http://localhost:8080',
changeOrigin: true,
secure: false,
},
'/d2dc349a-0d13-49b2-a8f0-1ab094bfba9b': {
target: 'http://localhost:8080',
changeOrigin: true,
secure: false,
},
'/projects': {
target: 'http://localhost:8080',
changeOrigin: true,
secure: false,
},
'/project': {
target: 'http://localhost:8080',
changeOrigin: true,
secure: false,
},
// Proxy admin panel to backend
'/admin': {
target: 'http://localhost:8080',
changeOrigin: true,
secure: false,
},
'/admin.html': {
target: 'http://localhost:8080',
changeOrigin: true,
secure: false,
},
// Proxy admin API endpoints
'/message/post': {
target: 'http://localhost:8080',
changeOrigin: true,
secure: false,
},
'/weekly_goals/setup': {
target: 'http://localhost:8080',
changeOrigin: true,
secure: false,
},
'/daily-report/trigger': {
target: 'http://localhost:8080',
changeOrigin: true,
secure: false,
},
}
}
}
})