2010-07-15 5 views
3

J'ai un problème étrange avec le fichier manifeste HTML5 sous Chrome 5.0.375.99 mais tout semble fonctionner correctement sous Safari. Lorsque vous chargez une page pour la première fois avec le fichier manifeste spécifié pour la première fois, je peux observer en utilisant Fiddler que tous les fichiers du manifeste sont chargés et qu'à mi-chemin, il semble récupérer le fichier manifeste. À ce stade, l'événement d'erreur est déclenché et l'état de l'applicationCache est UNCACHED.bizarre html5 rechargement manifeste

J'ai essayé ce qui suit

  1. reboot pc
  2. navigateur restart
  3. vérifier que la quantité de fichiers en cache ne dépasse pas 5 Mo
  4. vérifier que les fichiers dans le fichier manifeste est valide en effectuant un HEAD
  5. Essayé en utilisant un nom de fichier différent

Répondre

9

Je viens d'installer le canal de développement Chrome et le problème persiste mais maintenant la journalisation des erreurs est meilleure et j'obtiens "Evénement d'application Cache Error: Manifeste modifié lors de la mise à jour, réessayer"

Il semble que Chrome vérifie le fichier manifeste s'il a changé juste avant de télécharger la dernière entrée dans le fichier manifeste. L'erreur se produit parce que j'ai utilisé la valeur d'horodatage en cours dans le fichier manifeste généré dynamiquement.

Horodatage utilisé lors de la création de mon assemblage et de l'élimination du problème. :)

+0

J'ai le même problème, mais je ne comprends pas votre solution ... – Sucrenoir

+0

Je voudrais aussi une explication de la façon plus claire que vous avez résolu cela. J'utilise node.js et exprime et génère dynamiquement mon fichier manifeste. – mattdlockyer

+0

Cette approche d'horodatage n'est pas toujours disponible, voir ma solution ci-dessous. – mattdlockyer

1

J'ai finalement résolu cela de mon côté. Je suis fainéant et je veux que mon serveur génère dynamiquement mon cache-manifeste pour moi.

Cette exportation de module est la réponse à la demande de cache-manifeste sur mon serveur.

Merci pour le conseil sur les deux demandes, alors voici comment je l'ai fait avec le noeud:

//OFFLINE CACHE 
var cacheManifest = undefined; 

exports.cache = function(req, res){ 
    if (!cacheManifest) { 
     var fsutils = require('modules/utils/fsutils'); 
     //get the files and generate the output for cache.manifest 
     fsutils.getFiles('/public', function(files) { 
      var out = 'CACHE MANIFEST\n\ '; 
      var len = files.length; 
      for (var i = 0; i < len; ++i) { 
       out += files[i] + '\n\ '; 
      } 
      //setup for second request 
      cacheManifest = out; 
      //send output 
      res.header('Content-Type', 'text/cache-manifest'); 
      res.end(out); 
     }); 
    } else { 
     console.log('cache is cahced'); 
     res.header('Content-Type', 'text/cache-manifest'); 
     res.end(cacheManifest); 
    } 
}; 

L'astuce ici est de ne pas reconstruire votre cache-manifeste à chaque requête. Fondamentalement, l'utilisateur n'obtient le manifeste que la première fois qu'il atterrit sur votre application, s'il a été modifié, ou vous pouvez l'obliger à expirer via le code côté client ou serveur.

La première visite générera toujours le dernier manifeste alors vous pouvez faire ce que vous voulez après cela.

J'ai rencontré l'erreur parce que je produisais (moroniquement) le document cache-manifest avec chaque requête et puisque chrome faisait la seconde requête de sauvegarde, elle ne correspondait pas et échouait.

daN.m ...