// Service Worker Registration for caching if ('serviceWorker' in navigator) { window.addEventListener('load', function() { navigator.serviceWorker.register('/sw.js') .then(function(registration) { console.log('ServiceWorker registration successful'); }) .catch(function(err) { console.log('ServiceWorker registration failed'); }); }); } // Image optimization and lazy loading function optimizeImages() { const images = document.querySelectorAll('img[loading="lazy"]'); // WebP support detection const webpSupported = checkWebPSupport(); if ('IntersectionObserver' in window) { const imageObserver = new IntersectionObserver((entries, observer) => { entries.forEach(entry => { if (entry.isIntersecting) { const img = entry.target; const picture = img.closest('picture'); // Load appropriate image format if (picture && webpSupported) { const webpSource = picture.querySelector('source[type="image/webp"]'); if (webpSource) { img.src = webpSource.srcset; } } // Remove skeleton and show image img.classList.remove('skeleton'); img.classList.add('loaded'); // Preload next images preloadNextImages(img); imageObserver.unobserve(img); } }); }, { rootMargin: '50px 0px', threshold: 0.1 }); images.forEach(img => { if (!img.complete) { img.classList.add('skeleton'); } imageObserver.observe(img); }); } // Optimize critical images optimizeCriticalImages(); } // Check WebP support function checkWebPSupport() { return new Promise((resolve) => { const webP = new Image(); webP.onload = webP.onerror = function () { resolve(webP.height === 2); }; webP.src = 'data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdASoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA'; }); } // Preload next images for better UX function preloadNextImages(currentImg) { const nextImages = currentImg.parentElement.parentElement.nextElementSibling; if (nextImages) { const nextImg = nextImages.querySelector('img[loading="lazy"]'); if (nextImg && !nextImg.src) { const link = document.createElement('link'); link.rel = 'preload'; link.as = 'image'; link.href = nextImg.dataset.src || nextImg.src; document.head.appendChild(link); } } } // Optimize critical images function optimizeCriticalImages() { const criticalImages = document.querySelectorAll('img[fetchpriority="high"]'); criticalImages.forEach(img => { if (img.complete) { img.classList.add('loaded'); } else { img.addEventListener('load', () => { img.classList.add('loaded'); }); } }); } // Preload critical images function preloadImage(src) { const img = new Image(); img.src = src; } // Preload critical resources if ('requestIdleCallback' in window) { requestIdleCallback(() => { // Preload non-critical resources when browser is idle const link = document.createElement('link'); link.rel = 'prefetch'; link.href = 'https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js'; document.head.appendChild(link); // Preload jQuery const jqueryLink = document.createElement('link'); jqueryLink.rel = 'prefetch'; jqueryLink.href = 'https://code.jquery.com/jquery-3.6.0.min.js'; document.head.appendChild(jqueryLink); }); } // Performance monitoring function logPerformanceMetrics() { if ('performance' in window) { const navigation = performance.getEntriesByType('navigation')[0]; if (navigation) { console.log('Page Load Time:', Math.round(navigation.loadEventEnd - navigation.loadEventStart), 'ms'); console.log('DOM Content Loaded:', Math.round(navigation.domContentLoadedEventEnd - navigation.domContentLoadedEventStart), 'ms'); } } } // Initialize optimizations when DOM is ready if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', optimizeImages); } else { optimizeImages(); } // Log performance metrics on load window.addEventListener('load', logPerformanceMetrics); // Advanced image optimization function advancedImageOptimization() { // Monitor image loading performance const imageLoadTimes = new Map(); document.addEventListener('load', function(e) { if (e.target.tagName === 'IMG') { const img = e.target; const loadTime = performance.now() - performance.timing.navigationStart; imageLoadTimes.set(img.src, loadTime); // Log slow loading images if (loadTime > 3000) { console.warn('Slow image load:', img.src, 'Time:', Math.round(loadTime), 'ms'); } } }, true); // Preload critical images preloadCriticalImages(); // Optimize image formats based on browser support optimizeImageFormats(); } // Preload critical images function preloadCriticalImages() { const criticalImages = [ '/assets/images/logo/logo-main.png', '/assets/images/logo/logo-sub.png' ]; criticalImages.forEach(src => { const link = document.createElement('link'); link.rel = 'preload'; link.as = 'image'; link.href = src; link.fetchPriority = 'high'; document.head.appendChild(link); }); } // Optimize image formats function optimizeImageFormats() { // Check for AVIF support const avifSupported = checkAVIFSupport(); if (avifSupported) { // Add AVIF sources for supported browsers addAVIFSources(); } } // Check AVIF support function checkAVIFSupport() { return new Promise((resolve) => { const avif = new Image(); avif.onload = avif.onerror = function () { resolve(avif.height === 1); }; avif.src = 'data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAAB0AAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdmlmCgAAAAgCAAAAE2F1ZGEAAAAA'; }); } // Add AVIF sources function addAVIFSources() { const images = document.querySelectorAll('img[src*=".jpg"], img[src*=".png"]'); images.forEach(img => { const picture = img.closest('picture'); if (picture && !picture.querySelector('source[type="image/avif"]')) { const avifSource = document.createElement('source'); avifSource.type = 'image/avif'; avifSource.srcset = img.src.replace(/\.(jpg|png)$/, '.avif'); picture.insertBefore(avifSource, picture.firstChild); } }); } // Log performance metrics on load window.addEventListener('load', function() { logPerformanceMetrics(); advancedImageOptimization(); // Log image performance summary const totalImages = document.querySelectorAll('img').length; const loadedImages = Array.from(document.querySelectorAll('img')).filter(img => img.complete).length; console.log(`Image Performance: ${loadedImages}/${totalImages} images loaded`); });
Henüz yorum yapılmamış.