import { createRoot } from "react-dom/client"; import { HelmetProvider } from "react-helmet-async"; import App from "./App.tsx"; import "./index.css"; import "./i18n"; // Performance monitoring in development if (process.env.NODE_ENV === 'development') { import('./utils/performanceMonitor').then(({ performanceMonitor, analyzeBundleSize }) => { // Analyze bundle in development setTimeout(analyzeBundleSize, 2000); }); } // Enhanced Service Worker registration with update handling if ('serviceWorker' in navigator) { window.addEventListener('load', () => { navigator.serviceWorker.register('/sw.js', { scope: '/', updateViaCache: 'none' // Always check for updates }) .then((registration) => { console.log('✅ SW registered successfully:', registration.scope); // Handle service worker updates registration.addEventListener('updatefound', () => { const newWorker = registration.installing; if (newWorker) { newWorker.addEventListener('statechange', () => { if (newWorker.state === 'installed' && navigator.serviceWorker.controller) { // New version available, show update notification if (confirm('新しいバージョンが利用可能です。ページを更新しますか?')) { newWorker.postMessage({ type: 'SKIP_WAITING' }); window.location.reload(); } } }); } }); }) .catch((error) => { console.error('❌ SW registration failed:', error); }); // Listen for service worker messages navigator.serviceWorker.addEventListener('message', (event) => { if (event.data && event.data.type === 'SW_UPDATED') { window.location.reload(); } }); }); } // Resource hints for better performance const addResourceHints = () => { const hints = [ { rel: 'dns-prefetch', href: '//fonts.googleapis.com' }, { rel: 'dns-prefetch', href: '//fonts.gstatic.com' }, { rel: 'dns-prefetch', href: '//www.google-analytics.com' }, { rel: 'preconnect', href: 'https://api.reus.hu' } ]; hints.forEach(hint => { const link = document.createElement('link'); link.rel = hint.rel; link.href = hint.href; if (hint.rel === 'preconnect') { link.crossOrigin = 'anonymous'; } document.head.appendChild(link); }); }; // Add resource hints immediately addResourceHints(); // Enhanced error boundary for better UX window.addEventListener('error', (event) => { console.error('Global error:', event.error); // Could send to error tracking service here }); window.addEventListener('unhandledrejection', (event) => { console.error('Unhandled promise rejection:', event.reason); // Could send to error tracking service here }); createRoot(document.getElementById("root")!).render( );