Lors de la création de pages Web, le client/navigateur décide s'il met à jour un fichier comme une image ou .css ou .js ou s'il le prend dans le cache.ASP.NET: Comment appliquer un rechargement d'un fichier Web statique
Dans le cas d'une page .aspx, c'est le serveur qui décide. Bien sûr, au niveau IIS ou en utilisant des techniques HttpModule, je peux changer les en-têtes des requêtes pour dire au client si et combien de temps un fichier doit être mis en cache.
Maintenant, j'ai un site Web où le .aspx va de pair avec un .js correspondant. Donc, j'ai peut-être du code jQuery dans le fichier .js qui accède à un élément dans le fichier .aspx. Si je supprime cet élément du .aspx, j'adapterais aussi le .js. Si l'utilisateur accède à ma page, il obtiendra le nouveau .aspx mais il pourrait tout de même avoir l'ancien .js, entraînant des effets amusants.
Mon site utilise beaucoup de scripts et beaucoup d'images. Pour des raisons de performances, j'ai configuré dans IIS que ces fichiers n'expirent jamais.
Maintenant, de temps en temps un fichier change et je veux m'assurer que les utilisateurs obtiennent les fichiers de mise à jour.
Au début, je me suis aidé en renommant les fichiers. Donc, j'ai eu SkriptV1.js et SkriptV2.js et ainsi de suite. C'est à peu près la pire option puisque l'historique du dépôt est cassé et j'ai besoin d'adapter à la fois les références et le nom du fichier.
Maintenant, je me suis amélioré ici et ne changez que les références en utilisant Skript.js? V = 1 ou Skript.js? V = 2. Cela force le client à actualiser les fichiers. Cela fonctionne bien, mais je dois encore adapter les références.
Maintenant, il y a une amélioration ici comme ceci:
<script type='text/javascript' src='../scripts/<%# GetScriptLastModified("MyScript.js") %>'></script>
Ainsi, le "GetScriptLastModified" ajoutera le v = paramètre comme ceci:
protected string GetScriptLastModified(string FileName)
{
string File4Info = System.Threading.Thread.GetDomain().BaseDirectory + @"scripts\" + FileName;
System.IO.FileInfo fileInfo = new System.IO.FileInfo(File4Info);
return FileName + "?v=" + fileInfo.LastWriteTime.GetHashCode().ToString();
}
Ainsi, dégraissés. js-Link ressemblerait à ceci au client:
<script type='text/javascript' src='/scripts/GamesCharts.js?v=1377815076'></script>
Le lien changera à chaque fois, quand je uplo ad une nouvelle version et je peux être sûr que l'utilisateur obtienne immédiatement un nouveau script ou une image quand je le change.
Maintenant, deux questions: a) Existe-t-il un moyen plus élégant d'y parvenir? b) Si ce n'est pas le cas: Quelqu'un peut-il deviner quelle serait la surcharge de performance sur le serveur? Il peut y avoir facilement 50 éléments versionnés sur une page, donc pour un .aspx le GetScriptLastModified sera invoqué 50 fois.
Dans l'attente d'une discussion :)