2017-10-15 9 views
3

Dans une application Web pur vanilla JavaScript qui n'utilise pas de personnel de service, je souhaite explicitement mettre en cache un fichier JavaScript installé sur un serveur de fichiers AWS S3. Le script suivant serait assis dans le fichier index.html pour l'application (je l'ai modifié l'URL comme il est un projet client):Récupération du fichier JavaScript à partir du cache api non exécutable

<script> 
    caches.match('https://s3.amazonaws.com/com.myproject/myjavascript.js') 
    .then(function(response) { 
     if (response) { 
      return response; 
     } else { 
      fetch('https://s3.amazonaws.com/com.myproject/myjavascript.js') 
      .then(function(res) { 
       return caches.open('mycache') 
       .then(function(cache) { 
cache.put('https://s3.amazonaws.com/com.myproject/myjavascript.js',res.clone()); 
        console.log(res.clone()); 
        return res; 
       }); 
      }); 
     } 
    }); 
</script> 

Je crois que ce code devrait faire ce qui suit: Vérifiez si le myjavascript. Le fichier js est dans le cache. Si c'est le cas, renvoyez le fichier JavaScript qui sera ensuite exécuté par le navigateur. Si myjavascriptfile.js n'est pas trouvé dans le cache, il sera récupéré et placé dans le sous-cache 'mycache' et finalement retourné au navigateur où il serait exécuté. Après avoir exécuté ceci, je trouve l'URL du fichier dans le cache avec une réponse de "Ok", mais le code n'est pas exécuté par le navigateur et je ne vois pas le contenu du fichier dans les sources dans le navigateur Chrome outils de développement.

Pourquoi cela ne fonctionnerait-il pas? Quel est le problème avec ma pensée à ce sujet.

Un grand merci, Fred

+0

Qu'obtenez-vous dans les journaux de votre console? – Hunter

+0

Etes-vous sûr que cela ne peut pas être fait en utilisant des déclarations dans htaccess, des entêtes http, etc.? De plus, ces commandes javascript sont-elles compatibles avec tous les navigateurs actuels? En outre, il pourrait y avoir une bibliothèque js qui gère cela. –

+1

Merci pour votre commentaire Eyal. Fetch a un très bon support de navigateur (79% globalement en ce moment: http://www.caniuse.com/#search=fetch). C'est une exigence technique que j'ai utilisé Vanilla JavaScript pour cela et oui JQuery peut gérer cela. – Fred

Répondre

1

fetch par lui-même ne sera pas exécuter JavaScript. Il fait simplement une demande pour le contenu spécifié et le rend disponible pour le code à accéder. Si vous voulez vraiment continuer avec cette approche, il est possible de prendre le texte et de l'évaluer.

const url = 'https://unpkg.com/[email protected]/underscore-min.js'; 
caches.match(url) 
    .then(function(response) { 
    if (response) { 
     return response; 
    } else { 
     return fetch(url) 
     .then(function(res) { 
      return caches.open('mycache') 
      .then(function(cache) { 
       cache.put(url,res.clone()); 
       console.log(res.clone()); 
       return res; 
      }); 
     }); 
    } 
    }) 
    .then(function(response) { 
    console.log(response); 
    response.text().then(function(text) { 
     eval(text); 
     console.log(_); 
    }); 
    }); 

Note: Why is using the JavaScript eval function a bad idea?

L'exemple de code que vous avez est un modèle couramment dans les travailleurs des services. La raison pour laquelle cela fonctionne dans ce contexte est la demande initiale est de <script> étiquettes et non l'invocation de direction de fetch. En raison de l'étiquette <script>, le navigateur gère automatiquement l'exécution du contenu renvoyé.

<script src="https://unpkg.com/[email protected]/underscore-min.js"></script> 
+1

Merci Abraham pour votre excellente et claire explication. Cependant, quand il s'exécute la première fois et qu'il essaie d'accéder à response.text() dans la clause finale, alors j'obtiens le message d'erreur "Can not read property 'text" de undefined ". La deuxième fois que je l'exécute, il extrait le script du cache et je suis capable de faire un journal de la console pour voir ce code, mais le code n'est pas en cours d'exécution. Le script s'exécute correctement lorsque je mets simplement