Question

Les fichiers CSS et Javascript ne changent pas très souvent, donc je veux qu'ils soient mis en cache par le navigateur web.Mais je veux aussi que le navigateur web pour voir les modifications apportées à ces fichiers sans exiger de l'utilisateur pour effacer le cache du navigateur.Également besoin d'une solution qui fonctionne bien avec un système de contrôle de versions comme Subversion.


Quelques solutions que j'ai vu nécessitent l'ajout d'un numéro de version à la fin du fichier sous la forme d'une chaîne de requête.

Pourrait utiliser la version SVN nombre d'automatiser ce pour vous: ASP.NET Afficher le Numéro de Révision SVN

Pouvez-vous préciser comment vous incluez l' Révision variable d'un autre fichier?C'est dans le fichier HTML, je peux inclure le numéro de Révision dans l'URL pour le CSS ou Javascript fichier.

Dans le Livre de Subversion il dit à propos de la Révision:"Ce mot-clé décrit la dernière révision dans lequel ce fichier modifié dans le référentiel".

Firefox permet appuyant sur CTRL+R pour recharger le tout sur une page en particulier.

Pour clarifier, je suis à la recherche de solutions qui ne nécessitent pas l'utilisateur de faire quelque chose de leur part.

Était-ce utile?

La solution

J'ai trouvé que si vous ajoutez l'horodatage de la dernière modification du fichier vers la fin de l'URL, le navigateur va demander les fichiers lorsqu'il est modifié.Par exemple en PHP:

function urlmtime($url) {
   $parsed_url = parse_url($url);
   $path = $parsed_url['path'];

   if ($path[0] == "/") {
       $filename = $_SERVER['DOCUMENT_ROOT'] . "/" . $path;
   } else {
       $filename = $path;
   }

   if (!file_exists($filename)) {
       // If not a file then use the current time
       $lastModified = date('YmdHis');
   } else {
       $lastModified = date('YmdHis', filemtime($filename));
   }

   if (strpos($url, '?') === false) {
       $url .= '?ts=' . $lastModified;
   } else {
       $url .= '&ts=' . $lastModified;
   }

   return $url;
}

function include_css($css_url, $media='all') {
   // According to Yahoo, using link allows for progressive 
   // rendering in IE where as @import url($css_url) does not
   echo '<link rel="stylesheet" type="text/css" media="' .
        $media . '" href="' . urlmtime($css_url) . '">'."\n";
}

function include_javascript($javascript_url) {
   echo '<script type="text/javascript" src="' . urlmtime($javascript_url) .
        '"></script>'."\n";
}

Autres conseils

Quelques solutions que j'ai vu nécessitent l'ajout d'un numéro de version à la fin du fichier sous la forme d'une chaîne de requête.

<script type="text/javascript" src="funkycode.js?v1">

Vous pouvez utiliser la version SVN nombre d'automatiser cette pour vous en incluant le mot LastChangedRevision dans votre fichier html après l'endroit où v1 apparaît ci-dessus.Vous devez également configurer votre référentiel pour ce faire.

J'espère que cela clarifie ma réponse?

Firefox permet appuyant sur CTRL + R pour recharger le tout sur une page en particulier.

À mon avis, il vaut mieux faire de la partie numéro de version du fichier lui-même par exemple myscript.1.2.3.js.Vous pouvez configurer votre serveur web pour mettre en cache ce fichier pour toujours, et il suffit d'ajouter un nouveau fichier js quand vous avez une nouvelle version.

Lors de la sortie d'une nouvelle version de votre CSS ou JS bibliothèques, causer les problèmes suivants se produisent:

  1. modifier le nom du fichier à inclure une version unique de la chaîne
  2. modifier les fichiers HTML qui font référence à la bibliothèque de point à la version du fichier

(ce qui est généralement assez simple pour un script de sortie)

Maintenant, vous pouvez définir l'Expiration de la CSS/JS à être des années dans le futur.Chaque fois que vous modifiez le contenu, si le référencement HTML de points pour un nouvel URI, les navigateurs de ne plus utiliser l'ancienne copie mise en cache.

Ce qui provoque le comportement de mise en cache que vous voulez sans exiger quoi que ce soit de l'utilisateur.

Je me demandais aussi comment le faire, quand j'ai trouvé grom réponse.Merci pour le code.

J'ai du mal à comprendre comment le code est censé être utilisé.(Je n'utilise pas un système de contrôle de version.) En résumé, vous devez inclure le timestamp (ts) lorsque vous appelez la feuille de style.Vous n'avez pas l'intention de changer la feuille de style souvent:

<?php 
    include ('grom_file.php');
    // timestamp on the filename has to be updated manually
    include_css('_stylesheets/style.css?ts=20080912162813', 'all');
?>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top