quest'n'click 4.5.0 · r1

Construite pour quest'n'click 4.5.0, révision r1. Si elle est publiée, et laquelle est la courante, est dit par publication.json.

Sous-chemin, cache et service worker, déploiement incomplet, retour arrière

English · Type : explication + dépannage · Public : auteur · Contexte : dépôt du moteur, projet créé · Statut : prête · S'applique depuis : 4.2.5

Un jeu qui tourne bien sous npm run dev peut encore casser une fois en ligne : servi sous /<dépôt>/ au lieu de /, figé par un service worker, téléversé à moitié, ou ramené en arrière par-dessus des sauvegardes plus récentes. Cette page explique comment la construction traite chaque cas, et comment savoir lequel vous avez sous les yeux.

Sous-chemin : BASE_PATH

Un site à la racine de son domaine (https://play.example.org/) n'a besoin de rien. Un site sous un chemin (https://<utilisateur>.github.io/<dépôt>/) doit être construit avec ce chemin :

# dans le projet créé ou le dépôt du moteur
BASE_PATH=/my-repo/ npm run build

BASE_PATH (par défaut /) devient le base de Vite (tools/vite/plugins.ts). Il est écrit dans :

Les images, les sons et les vidéos sont adressés en relatif (assets/img/<id>.webp?v=…), résolus par rapport à l'adresse de la page : ils suivent la page où qu'elle soit servie, tant que l'adresse finit par /.

Écrivez BASE_PATH avec une barre oblique à chaque bout. Le manifeste est construit en mettant des chaînes bout à bout : BASE_PATH=/my-repo donne des icônes à /my-repoicons/….

Cache et service worker

Le service worker est produit par vite-plugin-pwa (Workbox) à partir de vite.config.ts.

Ce qu'il garde, et comment.

QuoiQuand il est mis en cacheStratégie
L'application de base : **/*.{js,css,html,ttf,webmanifest}, icons/*.pngÀ l'installation (précache)Depuis le cache ; une nouvelle construction apporte une nouvelle liste
Images, assets/img/Premier usage ou préchargementCache d'abord, jusqu'à 2 000 fichiers, 90 jours
Sons, assets/audio/Premier usage ou préchargementCache d'abord, requêtes partielles, jusqu'à 600 fichiers, 90 jours
Vidéos, assets/video/Premier usage ou préchargementCache d'abord, requêtes partielles, jusqu'à 10 fichiers
Polices complètes, fonts/La première fois qu'un caractère en a besoinCache d'abord, jusqu'à 10 fichiers
data/ (le fichier de la fin scellée)À chaque demandeRéseau d'abord, le cache après 4 s sans réponse

Hors du précache : assets/img, assets/audio, assets/video, data, assets/tools (le Studio et les outils de développement), studio-demo, fonts, et assets/reality pour un jeu qui ne déclare pas reality.

Préchargement. Dès l'écran titre puis après chaque changement de lieu, le moteur télécharge en tâche de fond le lieu courant, les lieux directement accessibles et leur audio, par lots dimensionnés par GameDef.assetBudgets. Puis, une fois par page, le reste du jeu (GameDef.offline, défaut full) : chaque image, bruitage, voix, musique et vidéo, lot par lot pendant que le navigateur est inactif, en pause quand la page est cachée. Rien n'est téléchargé en « économie de données » ou en 2G ; musiques et vidéos attendent mieux que la 3G. offline: 'nearby' garde seulement le préchargement par lieu.

Versions. Chaque adresse d'image ou de son porte ?v=<empreinte> : une seule empreinte de tous les fichiers de public/assets, si bien que tout changement d'un asset donne une nouvelle adresse à tous les assets et que les anciennes entrées du cache ne servent plus. Le fichier de la fin scellée est toujours demandé d'abord au réseau.

Ce que le joueur voit. Le préchargement finit par un statut (App.offlineStatus, offlineReady) :

StatutSens
completeChaque fichier du plan est dans le cache
partialAvec sa raison : network (et les fichiers en échec), save-data, slow, quota (le navigateur annonce moins de 64 Mo libres avant de commencer)
skippedRien n'a été tenté ; worker : le service worker n'a pas pris le contrôle de la page à temps, télécharger n'aurait rien mis en cache
offoffline: 'nearby'

Le menu pause l'affiche sur sa ligne « Offline » (ui.offlineStatus ; pas de ligne avec offline: 'nearby') : « 312/400… » pendant qu'il tourne, puis « complete », ou « 312/400 ⚠ retry » (les textes ui.offlineComplete et ui.offlineRetry ; le jeu de démo dit « jeu entier en cache » et « toucher pour réessayer » en français). Un toucher relance un préchargement partiel ou sauté ; un fichier déjà dans le Cache API n'est jamais redemandé, si bien que le préchargement reprend d'un rechargement à l'autre sans état propre. Avec offline: 'nearby', un lieu jamais visité ni préchargé peut encore demander le réseau.

Mises à jour. Le worker prend le contrôle de la page dès sa première activation (clientsClaim), pour que le préchargement de la première visite passe par lui. Une nouvelle version ne s'active jamais seule (skipWaiting: false) : quand un nouveau sw.js est trouvé, le jeu affiche « A new version is ready. » avec « Save and update » (« Une nouvelle version est prête. », « Sauvegarder et mettre à jour » dans un jeu traduit), qui sauvegarde la partie, attend que la sauvegarde soit écrite, puis active le nouveau worker et recharge. Les anciens précaches sont alors supprimés (cleanupOutdatedCaches).

npm run e2e:pwa (dépôt du moteur) exige complete, puis vérifie hors ligne chaque fichier du plan dans le cache et rend un lieu jamais visité. Il le prouve sur Chromium ; WebKit ne sait pas naviguer hors ligne sous automatisation et répond « skipped » (code 3), que seul le --allow-skip de la CI accepte.

Le repli de navigation et /docs/

S'applique depuis la 4.5.0 · fonction apparue en 4.5.0

Hors ligne, le worker répond à une navigation dans sa portée avec l'index.html en cache (navigateFallback). À partir de la 4.5.0, il ne le fait pas pour une adresse qui contient /docs/ (navigateFallbackDenylist: [/\/docs\//]) : le Pages du projet sert la documentation sous /<dépôt>/docs/, à côté du jeu, et un lecteur qui a déjà joué doit recevoir cette page, pas le jeu.

Garantie · sw-skips-docs · référencée · exécutée sur aff6caab7514 · portée vérifiée par son auteur (IA), pas relue Le service worker du jeu est configuré pour ne jamais répondre par le jeu à une adresse qui contient /docs/ : le motif reconnaît les pages de la documentation sous le chemin de base de Pages et aucune page du jeu. Le test lit la configuration et le motif ; il ne lance pas de navigateur.

Pour votre jeu, cela veut dire : ne le servez pas sous un chemin qui contient /docs/ (par exemple https://example.org/docs/my-game/). Il se joue en ligne, mais hors ligne le repli ne le couvre plus : une navigation que le précache ne garde pas sous son adresse exacte (une adresse avec des paramètres, par exemple) échoue.

Déploiement incomplet

Un déploiement est incomplet quand l'hébergeur sert le nouvel index.html (ou sw.js) alors que des fichiers qu'il nomme manquent : un téléversement arrêté en route, des fichiers copiés dans le mauvais ordre, un CDN qui a la nouvelle page et les anciens scripts.

Pour l'éviter : déployez d'un bloc (GitHub Pages et un déploiement Clever Cloud publient une construction entière d'un coup), ou téléversez index.html et sw.js en dernier ; servez index.html et sw.js avec no-cache (Autres hébergeurs statiques).

Revenir à une version précédente

Déployer la construction d'un commit précédent la remet en ligne : pour les joueurs, c'est une nouvelle version comme une autre.

Donc : revenir en arrière est sans risque quand la version récente n'a pas changé saveVersion. Sinon, préférez corriger vers l'avant.

Symptômes, causes et corrections

SymptômeCause probableDiagnosticCorrection
Marche sous npm run dev, page blanche sous /<dépôt>/Construit sans BASE_PATHOnglet réseau : 404 sur /assets/index-….js (sans /<dépôt>/)Construire avec BASE_PATH=/<dépôt>/
Icônes ou installation absentes, 404 sur /<dépôt>icons/…BASE_PATH sans sa barre finaleLes icons de manifest.webmanifestBASE_PATH=/<dépôt>/
Images absentes sous /<dépôt> (sans barre finale)L'adresse de la page ne finit pas par /Les adresses d'images résolues en /assets/img/…Lier /<dépôt>/ ; Pages redirige
L'ancienne version reste après un déploiementLe nouveau worker attend le joueurOutils de développement : un worker « en attente d'activation »Cliquer « Save and update » ; fermer tous les onglets du jeu
Aucun bandeau de mise à joursw.js gardé en cache par l'hébergeur ou un CDN ; ou le précache du nouveau worker échoueOnglet réseau sur sw.js ; la console pendant l'installationno-cache sur sw.js ; compléter le téléversement
Page blanche pour les nouveaux visiteurs seulementDéploiement incomplet404 sur les scripts à empreinteTéléverser de nouveau tout dist/
Hors ligne, un lieu demande le réseauPréchargement partial, ou offline: 'nearby'Le statut du menu pauseToucher pour réessayer en ligne ; ou offline: 'full'
« Continuer » échoue après un retour arrièreLa sauvegarde vient d'un saveVersion plus récentL'erreur de la consoleRedéployer la version récente
Hors ligne, une adresse du jeu sous un chemin /docs/… ne se charge pasLa liste d'exclusion, voulueL'adresse contient /docs/Servir le jeu sous un autre chemin

Vérifier que c'est corrigé

Cas voisins

Alternatives écartées

Compromis

Décisions et ADR


Modifier la source de cette page · Signaler une erreur