import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' import { copyFileSync, writeFileSync } from 'fs' import { dirname, resolve } from 'path' import { fileURLToPath } from 'url' const __filename = fileURLToPath(import.meta.url) const __dirname = dirname(__filename) // Функция для генерации sitemap.xml function generateSitemap() { const baseUrl = 'https://ospab.host'; const lastmod = new Date().toISOString().split('T')[0]; const pages = [ { loc: '/', priority: '1.0', changefreq: 'weekly' }, { loc: '/about', priority: '0.9', changefreq: 'monthly' }, { loc: '/login', priority: '0.7', changefreq: 'monthly' }, { loc: '/register', priority: '0.8', changefreq: 'monthly' }, { loc: '/blog', priority: '0.85', changefreq: 'daily' }, { loc: '/tariffs', priority: '0.9', changefreq: 'weekly' }, { loc: '/s3plans', priority: '0.9', changefreq: 'weekly' }, { loc: '/terms', priority: '0.5', changefreq: 'yearly' }, { loc: '/privacy', priority: '0.5', changefreq: 'yearly' }, ]; let xml = '\n'; xml += '\n'; for (const page of pages) { // Русская версия (без префикса) xml += ' \n'; xml += ` ${baseUrl}${page.loc}\n`; xml += ` ${lastmod}\n`; xml += ` ${page.priority}\n`; xml += ` ${page.changefreq}\n`; xml += ` \n`; xml += ` \n`; xml += ' \n'; // Английская версия (с префиксом /en) xml += ' \n'; xml += ` ${baseUrl}/en${page.loc}\n`; xml += ` ${lastmod}\n`; xml += ` ${page.priority}\n`; xml += ` ${page.changefreq}\n`; xml += ` \n`; xml += ` \n`; xml += ' \n'; } xml += ''; return xml; } // https://vite.dev/config/ export default defineConfig({ plugins: [ react(), { name: 'copy-service-worker', writeBundle() { // Копируем service worker в dist при сборке try { copyFileSync( resolve(__dirname, 'public/service-worker.js'), resolve(__dirname, 'dist/service-worker.js') ) console.log('✅ Service worker скопирован в dist/') } catch (error) { console.error('❌ Ошибка копирования service worker:', error) } } }, { name: 'generate-sitemap', writeBundle() { // Генерируем sitemap.xml при сборке try { const sitemapContent = generateSitemap(); writeFileSync( resolve(__dirname, 'dist/sitemap.xml'), sitemapContent, 'utf-8' ); console.log('✅ Sitemap.xml сгенерирован в dist/'); } catch (error) { console.error('❌ Ошибка генерации sitemap:', error); } } } ], build: { target: 'es2015', // Современные браузеры, уменьшаем полифилы cssCodeSplit: true, rollupOptions: { output: { manualChunks: { // Разделяем большие зависимости 'react-vendor': ['react', 'react-dom', 'react-router-dom'], 'ui-vendor': ['react-qr-code'], } } }, minify: 'terser', terserOptions: { compress: { drop_console: true, // Убираем console.log в production drop_debugger: true, pure_funcs: ['console.log', 'console.info'] // Удаляем конкретные функции } }, chunkSizeWarningLimit: 600 // Увеличим лимит предупреждения }, server: { // Для dev сервера public файлы доступны из корня автоматически port: 3000 } })