."}},{"@type":"Question","name":"¿Cómo implemento un Service Worker para caching?","acceptedAnswer":{"@type":"Answer","text":"Registra el Service Worker: if ('serviceWorker' in navigator) {\\n navigator.serviceWorker.register('/sw.js');\\n}. Cachea static assets con estrategia cache-first: const CACHE = 'static-v1';\\nconst ASSETS = ['/index.html', '/styles.css', '/app.js'];\\nself.addEventListener('install', (e) => {\\n e.waitUntil(caches.open(CACHE).then(cache => cache.addAll(ASSETS)));\\n});\\nself.addEventListener('fetch', (e) => {\\n e.respondWith(\\n caches.match(e.request).then(response => response || fetch(e.request))\\n );\\n});. Usa network-first para contenido dinámico: self.addEventListener('fetch', (e) => {\\n e.respondWith(\\n fetch(e.request).catch(() => caches.match(e.request))\\n );\\n});. Usa stale-while-revalidate para API responses: self.addEventListener('fetch', (e) => {\\n e.respondWith(\\n caches.open('api-cache').then(cache =>\\n cache.match(e.request).then(cached => {\\n const fetchPromise = fetch(e.request).then(response => {\\n cache.put(e.request, response.clone());\\n return response;\\n });\\n return cached || fetchPromise;\\n })\\n )\\n );\\n});. Limpia caches viejos: self.addEventListener('activate', (e) => {\\n e.waitUntil(\\n caches.keys().then(keys =>\\n Promise.all(keys.filter(k => k !== CACHE).map(k => caches.delete(k)))\\n )\\n );\\n});. Usa Workbox para manejo más fácil de Service Workers: import { registerRoute } from 'workbox-routing';\\nimport { CacheFirst } from 'workbox-strategies';\\nregisterRoute(/\\.(?:css|js)$/, new CacheFirst());."}},{"@type":"Question","name":"¿Cómo optimizo scripts de terceros?","acceptedAnswer":{"@type":"Answer","text":"Carga scripts de terceros asíncronamente: . Defer scripts no críticos: . Usa loading=\"lazy\" para iframes: