2015-03-27 23 views
7

MEAN yığınını kullanıyorum (mongo, ifade, açısal ve düğüm). Üretime nispeten sık sık dağıtıyorum ... her iki günde bir. Benim endişem, istemci yan kodu ve API'yi zaman zaman değiştirdiğimden ve API'nın istemci kodunun önceki sürümleriyle geriye dönük uyumluluğundan emin olmak istemem.İstemci dağıtımdan sonra nasıl yeniden yüklenir?

Böyle bir senaryoda, tüm istemcilerin üretime geçtiğimde yeniden yüklenmesini sağlamanın en etkili yolu nedir? Örneğin, Evernote'un, lütfen Evernote'un en son sürümü için tarayıcınızı yeniden yüklemeniz gerektiğini lütfen unutmayın. Ben benzer bir şey yapmak istiyorum ... socket.io veya sock.js yoluna gitmem gerekiyor mu yoksa basit bir şey eksik mi ve bunu başarmanın daha basit bir yolu var mı?

cevap

7

Güncelleme: AppCache, 2015 yazında artık en iyi çözüm olmaktan çıktı. Yeni öneri, bunun yerine Service Workers kullanmaktır. Ancak, Hizmet Çalışanları hala IE ve Safari'de taslak (muhtemelen: hayır) desteği ile deneysel.

Alternatif olarak, birçok derleme aracı, OP'lerin sorusunu ele almak için önbellek bozmayı ve "sürüm oluşturma" tekniklerini sorunsuz bir şekilde birleştirir. WebPack muhtemelen bu alandaki mevcut liderdir.


Bu kullanarak için iyi bir kullanım örneği olabilir HTML5 en AppCache

Muhtemelen dağıtım komut içine bu adımların bazılarını otomatik isterdim, ama burada seni almak için yararlı bulabileceğiniz bazı koddur başladı.

Öncelikle, appcache bildirim dosyanızı oluşturun. Bu, aynı zamanda, appcache manifest dosyasının tarihini açık bir şekilde değiştirinceye kadar, istemcinin tarayıcısındaki kaynakları önbelleğe almanıza da olanak tanır.

/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: 
* 
/

app.appcacheyılında hat #v20150327.114142 üzerine açıklama biz apaçık değişti ve kaynaklar yeniden yüklenmesi gerektiğini tarayıcıya işaret nasıl. Dosya, önceki sürümden tarayıcıya farklı göründüğü sürece herhangi bir şey olabilir. Uygulamanızda yeni kodun dağıtımı sırasında, bu satır değiştirilmelidir. Bunun yerine bir yapı kimliği de kullanabilir.

<html manifest="/app.appcache"></html> 

Son olarak, herhangi bir değişiklik için uygulama önbelleğini kontrol etmek için bazı JavaScript eklemeniz gerekir ve eğer:

İkinci olarak, uygulama önbelleğini kullanmak istediğiniz sayfalarda gibi başlık etiketini değiştirmek Orada bir şeyler yap. İşte bir Angular module.

appcache.js: Bu yanıt için, burada bir vanilya örnek AppCache ise durumunuza için çalışmaz eğer,

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); 

Alternatif olarak, daha getto çözüm Basit bir API son nokta oluşturmak olacaktır geçerli yapı kimliğini veya son dağıtım tarihi zamanını döndürür. Açısal uygulamanız zaman zaman bu uç noktayı vurur ve sonucu dahili sürümüyle karşılaştırır ve farklıysa kendini yeniden yükler.

Veya, ben varlıkların canlı/yerinde-yeniden yükleme kullanmak için ne kadar bir fikrin iyi emin değilim gelişiminde çok yararlı olurken, canlı-yeniden yükleme komut dosyası (example) düşünebilirsiniz, ama üretim.

+0

Vay! AppCache ise. Sanırım peşindeyim için biraz fazla olabilir ... özellikle de IE9'un destekli görünmediğini ve Firefox'un kullanıcı izni gerektirdiğini görüyorum. Gerçekten olsa 'getto' çözümün fikir gibi - bir dizi aralıklarla bir API son nokta denetimi ve gerekirse() window.location.reload çağırarak.Aslında bana karşı güzel ve basit görünüyor ... ama eminim ki birisi bana aynı şeyi aynen socket.io ile yapabildiğimi söyleyeceğinden eminim .... – Andrew

+0

yea; socket.io ile yapabilirdiniz .. ama bu sadece "gerçek zamanlı" kod güncellemeleri için çok fazla yük. Sunucuyu zaman aşımına göre pinglemek yeterlidir (ve daha ucuz kaynaklar kullanırsınız; açık soket bağlantılarından veya endişelenirken yük dengeleme hakkında endişelenmenize gerek kalmaz). Tabii ki uygulamanız halihazırda kullanılmıyorsa socket.io. Sonra daha mantıklı. –

+0

Evet - Ben de aynı şeyi düşünüyorum ... çok fazla yük. Önümüzdeki birkaç ay içinde socket.io'yu ekleyeceğiz, ancak gerçekte yapana kadar API ping yaklaşımını kullanacağımızı düşünüyorum. Cevabınız için teşekkürler! – Andrew

0
  1. Js/dosyalarınızı zaman aşımına uğratarak daha kısa bir süre içinde, örneğin: 1 gün ile sınırlandırmaya çalışın.
  2. Ama durumda-pop dışarı ve tekrar yüklemek için kullanıcı anlatmak şey (ctrl + f5) tarayıcılarını istiyorum, sonra basitçe sadece bazı dosyaları değişirse, mark haberleri olduğunu pop-up bir script yapmak Sadece yeniden yüklemeyi/yeniden yüklemeyi söylediği ip/oturum, böylece birden çok pop-up ile rahatsız edilmeyecek.
+0

Nokta 1 adil biridir. Statik varlıklar için CDN'de sona erme süresini 7 günden itibaren 1 güne değiştirdim. – Andrew

1

Belki de istemci kodu dosya adınıza karma ekleyebilirsiniz. örneğin app-abcd23.js.
Böylece tarayıcı önbellekten almak yerine dosyayı yeniden yükleyecektir. veya hash'ı app.js?hash=abcd23 url.eg dosyasına ekleyebilirsiniz ancak bazı tarayıcılar önbelleğe alınmış sürümü kullanmaya devam edebilir.

Rayların üzerinde işlem yapmak için varlıklar-pipeline var biliyorum, ama ben MEAN stack aşina değilim. Bu amaçla npm paketinde bir paket olmalıdır.

Ayrıca, kullanıcı kodunun güncel olmadığını bildirmek istiyorsanız, socket.io'u kullanmanın gerçekten gerekli olduğunu düşünmüyorum. Sürümünüzü her iki html meta tag ve js dosyasında tanımlayabilirsiniz, eğer uyumsuzluk varsa, bir açılır pencereyi gösterin ve kullanıcının yenilenmesini söyleyin.

+0

Teşekkürler! Yine de bir SPA ... bu yüzden html meta etiketi ve js dosya sürümü yaklaşımının işe yarayacağından emin değilim. Akla yatkın kullanıcı bir hafta boyunca açık tarayıcı penceresi getirebilire geri gelip yeniden ve meta etiketi ve js dosya sürümü değişmeden olacaktır etmeden uygulamayı kullanmaya başlayın. Dosya adlandırma noktası iyi bir şey, ancak aynı sorun - yeniden yüklemede önbelleği düzeltir, ancak kullanıcı yeniden yüklemez. Sağ? – Andrew

+0

evet, dosya adına hash eklemek tarayıcı önbelleği ve cdn içindir. Yani sanırım yeni bir sürüm olup olmadığını görmek ve sonra js kullanarak sayfayı yenilemek için her saat veya gün ajax arama yapmak sizin için çalışabilir. socket.io bunun için hala çok fazla. Ve uygulamanıza gerçek zamanlı şeyler eklemek istiyorsanız, socket.io yerine firebase veya parse kullanmayı öneririm. – at15

+0

Cevabınız için çok teşekkürler! – Andrew

0

Geçenlerde aynı sorunla karşı karşıya edildi. Uygulamamın yapı numarasını js/css dosyalarıyla ekleyerek bunu düzeltdim. Bütün senaryo ve stil etiketleri dosyaları

/foo/bar/main.js?123 

gibi js/css dosyası yolu sonunda bir 'yapı numarasını' eklemek önemsiz nedenle ortak bir komut dosyası tarafından dahil alındı ​​Bu 123 bir olduğu Aynı başlık dosyasında takip ettiğim numara. İstemcinin uygulamanın tüm js dosyalarını indirmeye zorlamasını istediğimde onu artırıyorum. Bu, yeni sürümlerin ne zaman indirileceğini kontrol etmemi sağlıyor ancak yine de tarayıcının ilk talepten sonra her istek için önbellek kullanmasına izin veriyor. Bu, yapı numarasını artırarak başka bir güncelleme yapana kadar.

Bu aynı zamanda ben ancak uzun istediğim bir önbellek son kullanma başlığı olabileceği anlamına gelir.