Cómo funciona la descarga de juegos, la caché PWA y el service worker (sw.js).
Permitir que el hub cargue como PWA y que cada juego pueda descargarse individualmente para jugarse sin conexión. El service worker sirve los archivos cacheados cuando no hay red.
- Al instalar la PWA: precache del hub (
index.html,games.json, shell del engine). - Al pulsar el botón de descarga en una tarjeta de juego:
main.jsguarda ese juego y todas sus dependencias en la misma caché. - Al navegar offline:
sw.jsresponde desde caché si la red falla.
games.json ← manifest con cache.hubPrecache + extraCacheFiles por juego
↓
sw.js ← estrategias fetch + migración de caché
main.js ← botón descargar / eliminar / actualizar
scan-games.js ← genera games.json y detecta deps desde index.html
Nombre de caché activa: js-games-v4 (definido en games.json → cache.name).
Equilibrar actualizaciones rápidas online con juego offline fiable.
| Estrategia | Recursos | Comportamiento |
|---|---|---|
| Network-First | .html, .js, .css, .json, /games/*, /dist/assets/* |
Red primero; si falla, caché. Online siempre recibe la versión nueva. |
| Cache-First | Imágenes SVG del hub, assets binarios | Caché primero; si no existe, red y guardar. |
| Bypass | URLs con ?_nocache |
Siempre red (comprobación de actualizaciones). |
Ver sw.js:
install→ leegames.jsony precacheacache.hubPrecache.activate→ migra entradas dejs-games-v1/js-games-v2/js-games-v3ajs-games-v4y borra cachés legacy.fetch→ enruta según tipo de recurso.
Guardar un juego concreto y todas sus dependencias para jugarlo sin internet (el hub online puede seguir mostrando juegos no descargados).
Cuando el usuario pulsa el icono de descarga en la tarjeta del juego. No descarga automáticamente todos los juegos del catálogo.
Por cada juego, main.js construye la lista con buildGameCacheUrls():
- Base del juego:
index.html,style.css,script.js, imagen de tarjeta. - Shell compartido:
engine/game-shell.css(siempre). - Dependencias auto-detectadas: scripts y CSS del engine referenciados en el
index.htmldel juego (extraCacheFilesengames.json). - Assets extra: definidos manualmente en
scripts/scan-games.js(p. ej.words.js, sprites, imágenes del ahorcado).
Ejemplo de dependencias (detectadas por scan-games.js de los <script> tags en index.html):
engine/game-shell.css
engine/pixi.min.js (si se usa PIXI)
engine/littlejs.min.js (si se usa LittleJS)
engine/sprite-processor.js (si se usa)
Los módulos ESM del motor (src/) son empaquetados por Vite en dist/assets/ y no necesan entrada manual en la caché.
Si script.js cambió en el servidor, el botón pasa a estado actualizar (icono azul). Un clic borra la caché antigua del juego y vuelve a descargar la lista completa.
Fuente única de verdad para el hub, la PWA y la caché offline.
Tras añadir un juego, cambiar scripts del engine en index.html, o modificar assets extra:
node scripts/scan-games.js{
"cache": {
"name": "js-games-v4",
"hubPrecache": ["./index.html", "./engine/game-shell.css", "..."],
"gameBaseFiles": ["index.html", "style.css", "script.js"],
"alwaysInclude": ["engine/game-shell.css"],
"legacyCaches": ["js-games-v1", "js-games-v2", "js-games-v3"]
},
"games": [
{
"id": "snake",
"path": "games/snake/",
"extraCacheFiles": ["engine/game-shell.css", "..."]
}
]
}extraCacheFiles se construye desde scan-games.js, que analiza el index.html del juego en busca de <script> y <link> tags. Los módulos ESM del motor son empaquetados por Vite y no requieren entrada manual.
La caché v4 actualizó el nombre a js-games-v4 para reflejar cambios en la estructura del engine y migración desde v1/v2/v3.
- Copia todas las entradas de
js-games-v1,js-games-v2yjs-games-v3ajs-games-v4. - Elimina las cachés legacy (
js-games-v1,js-games-v2,js-games-v3). - Los juegos ya descargados siguen funcionando; conviene re-descargar cada juego para incluir los nuevos módulos del engine.
- CDN externo (Font Awesome): no se cachea; iconos pueden no verse offline.
- Multijugador online: PeerJS requiere red; el modo offline solo aplica a juegos locales.
- Primer visitante offline: solo tiene lo precacheado del hub, no juegos no descargados.
- API y utilidades - módulos del engine cacheados
- README del repo - visión general PWA