Aggiornamento: AppCache è stato ritirato durante l'estate 2015, quindi il seguente non è più la soluzione migliore. La nuova raccomandazione è di utilizzare Service Workers invece. Tuttavia, attualmente i Service Worker sono ancora sperimentali con supporto abbozzato (leggi: probabilmente no) in IE e Safari.
In alternativa, molti strumenti di sviluppo ora incorporano senza soluzione di continuità le tecniche di "busting" di cache-busting e file per risolvere la questione degli OP. WebPack è probabilmente l'attuale leader in questo spazio.
Questo potrebbe essere un buon caso d'uso per l'utilizzo di HTML5 AppCache
Si sarebbe probabilmente desidera automatizzare alcuni di questi passi nei vostri script di distribuzione, ma qui è un codice che potrebbe risultare utile per arrivare iniziato.
Per prima cosa, crea il file manifest dell'appcache. Ciò consentirà inoltre di memorizzare nella cache le risorse nel browser del client fino a quando non modifichi in modo esplicito la data del file manifest dell'appcache.
/app.AppCache:
CACHE MANIFEST
#v20150327.114142
CACHE:
/appcache.js
/an/image.jpg
/a/javascript/file.js
http://some.resource.com/a/css/file.css
NETWORK:
*
/
In app.appcache, il commento on line #v20150327.114142
è come indichiamo al browser che il manifesto è cambiato e le risorse dovrebbero essere ricaricata. Può essere qualsiasi cosa, davvero, purché il file risulti diverso dal browser rispetto alla versione precedente. Durante la distribuzione di un nuovo codice nell'applicazione, questa riga deve essere modificata. Potrebbe anche usare un ID di build.
In secondo luogo, su tutte le pagine che si desidera utilizzare l'AppCache, modificare il tag di intestazione in quanto tale:
<html manifest="/app.appcache"></html>
Infine, è necessario aggiungere un po 'Javascript per controllare l'AppCache per eventuali modifiche, e se ci sono, fai qualcosa al riguardo. Ecco uno Angular module. Per questa risposta, ecco un esempio di vaniglia:
appcache.js:
window.applicationCache.addEventListener('updateready', function(e) {
if (window.applicationCache.status == window.applicationCache.UPDATEREADY) {
// Browser downloaded a new app cache.
// Swap it in and reload the page to get the latest hotness.
window.applicationCache.swapCache();
if (confirm('A new version of the application is available. Would you like to load it?')) {
window.location.reload();
}
}
else {
// Manifest didn't changed. Don't do anything.
}
}, false);
In alternativa, se AppCache non funziona per la vostra situazione, una soluzione più ghetto sarebbe quella di creare un semplice endpoint API che restituisce l'ID build attuale o l'ultima data-ora di implementazione. L'applicazione Angular occasionalmente colpisce questo endpoint e confronta il risultato con la sua versione interna e, se diverso, ricarica se stesso.
Oppure, si può considerare uno script live-reload (example), ma, sebbene molto utile per lo sviluppo, non sono sicuro di quanto sia buona idea utilizzare la ricarica live/sul posto delle risorse in produzione.
Wow! AppCache. Penso che potrebbe essere un po 'troppo per quello che sto cercando ... specialmente perché vedo che IE9 non sembra essere supportato e Firefox sembra richiedere il consenso dell'utente. Mi piace molto l'idea della soluzione 'ghetto', tuttavia: controllare un endpoint API a un intervallo impostato e chiamare window.location.reload() se necessario.In realtà sembra bello e semplice per me ... anche se sono sicuro che qualcuno mi dirà che posso fare la stessa cosa con la stessa facilità con socket.io .... – Andrew
sì; puoi farlo con socket.io .. ma questo è un sovraccarico solo per gli aggiornamenti del codice "in tempo reale". Il ping del server su un timeout sembra sufficiente (e meno costoso in termini di risorse: non devi preoccuparti di un sacco di connessioni socket aperte o preoccuparti del bilanciamento del carico mentre aumenti di livello ..) A meno che, ovviamente, la tua app non sia già utilizzata socket.io. Quindi ha più senso. –
Sì, sto pensando la stessa cosa ... troppo in alto. Probabilmente aggiungeremo socket.io nei prossimi mesi, ma penso che andremo con l'approccio ping API fino a quando non lo faremo. Grazie per la tua risposta! – Andrew