Nous travaillons actuellement sur un nouveau projet avec des mises à jour régulières qui est utilisé quotidiennement par l'un de nos clients. Ce projet est développé en utilisant angular 2 et nous sommes confrontés à des problèmes de cache, c'est-à-dire que nos clients ne voient pas les derniers changements sur leurs machines.
Principalement, les fichiers html / css pour les fichiers js semblent être mis à jour correctement sans trop de problèmes.
ng build
, l'ajout de la-prod
balise ajoute un hachage aux noms de fichiers générés. Cela force le rechargement de tout saufindex.html
. Ce post github contenait quelques astuces pour le recharger.Réponses:
angular-cli résout ce problème en fournissant un
--output-hashing
indicateur pour la commande build (versions 6/7, pour les versions ultérieures, voir ici ). Exemple d'utilisation:Bundling & Tree-Shaking fournit des détails et un contexte. En cours d'exécution
ng help build
, documente le drapeau:Bien que cela ne s'applique qu'aux utilisateurs d' angular-cli , il fonctionne à merveille et ne nécessite aucun changement de code ou d'outillage supplémentaire.
Mettre à jour
Un certain nombre de commentaires ont souligné utilement et correctement que cette réponse ajoute un hachage aux
.js
fichiers mais ne fait rien pourindex.html
. Il est donc tout à fait possible que leindex.html
cache reste en cache après que leng build
cache ait détruit les.js
fichiers.À ce stade, je m'en remettrai à Comment contrôlons-nous la mise en cache des pages Web, sur tous les navigateurs?
la source
Vous avez trouvé un moyen de le faire, ajoutez simplement une chaîne de requête pour charger vos composants, comme ceci:
Cela devrait forcer le client à charger la copie du modèle du serveur au lieu de celle du navigateur. Si vous souhaitez qu'il ne s'actualise qu'après un certain temps, vous pouvez utiliser cet ISOString à la place:
Et sous-chaîne de certains caractères pour qu'elle ne change qu'au bout d'une heure par exemple:
J'espère que cela t'aides
la source
templateUrl: './app/shared/menu/menu.html?v=' + Math.random()
Dans chaque modèle html, j'ajoute simplement les balises meta suivantes en haut:
Dans ma compréhension, chaque modèle est autonome, il n'hérite donc pas de la configuration des règles de mise en cache meta no dans le fichier index.html.
la source
Une combinaison de la réponse de @ Jack et de la réponse de @ ranierbit devrait faire l'affaire.
Définissez l'indicateur de construction ng pour --output-hashing ainsi:
Ajoutez ensuite cette classe soit dans un service, soit dans votre application.
Ajoutez ensuite ceci à vos fournisseurs dans votre app.module:
Cela devrait éviter les problèmes de mise en cache sur les sites en direct pour les ordinateurs clients
la source
J'ai eu un problème similaire avec l'index.html mis en cache par le navigateur ou plus délicat par le cdn / proxies du milieu (F5 ne vous aidera pas).
J'ai cherché une solution qui vérifie à 100% que le client a la dernière version d'index.html, heureusement j'ai trouvé cette solution par Henrik Peinar:
https://blog.nodeswat.com/automagic-reload-for-clients-after-deploy-with-angular-4-8440c9fdd96c
La solution résout également le cas où le client reste avec le navigateur ouvert pendant des jours, le client vérifie les mises à jour à intervalles réguliers et recharge si une version plus récente est déployée.
La solution est un peu délicate mais fonctionne comme un charme:
ng cli -- prod
produit des fichiers hachés avec l'un d'eux appelé main. [hash] .jsPuisque la solution Henrik Peinar était pour angular 4, il y a eu des changements mineurs, je place également les scripts fixes ici:
VersionCheckService:
passer à AppComponent principal:
Le script post-build qui rend la magie, post-build.js:
placez simplement le script dans le (nouveau) dossier de construction exécutez le script en utilisant
node ./build/post-build.js
après la construction du dossier dist en utilisantng build --prod
la source
Vous pouvez contrôler le cache client avec des en-têtes HTTP. Cela fonctionne dans n'importe quel framework Web.
Vous pouvez définir les directives de ces en-têtes pour avoir un contrôle précis sur comment et quand activer | désactiver le cache:
Cache-Control
Surrogate-Control
Expires
ETag
(très bon)Pragma
(si vous souhaitez prendre en charge les anciens navigateurs)Une bonne mise en cache est bonne, mais très complexe, dans tous les systèmes informatiques . Jetez un coup d'œil à https://helmetjs.github.io/docs/nocache/#the-headers pour plus d'informations.
la source