2017-06-29 120 views
2

基本設置:角1.5 SPA Apache的2.4通過REST API同樣來自於Apache 2.4的支持提供服務。刷新緩存角SPA

我已閱讀一切可以利用的技術,允許一些應用程序代碼在服務器上更改後SPA是新鮮和更新。

解決方案通過HTTP caching(HTTP報頭)來或緩存無效(版本例如文件名)技術。它們都基於網絡瀏覽器提出獲取資源的請求,並具有一些機制來了解內容是否需要更新或可以從緩存中提供。

SPA的主要問題是資源請求不是通常在初始化負載後進行的,因爲Web應用程序在瀏覽器中很快加載並且只有XHR調用後端纔會啓動以加載數據。在很多情況下,用戶在很長一段時間內沒有刷新文件很不方便,因此不會關閉該選項卡。

最難的問題是index.html文件(see this post)。這是第一次在瀏覽器中加載應用程序時才被調用,然後永遠不會被請求。只有手動瀏覽器頁面重新加載可以爲該文件啓動第二個請求。

所有的JavaScript和CSS文件是爲index.html請求後加載,然後永遠不會重新加載。只有index.html的新請求才能刷新它們。

如果在初始加載後沒有獲得index.html的請求,緩存控制標頭或緩存清除策略如何在服務器上更改時允許javascript或css文件刷新?

我這個問題,我受影響的方法有兩種:

  1. 的REST API必須與Web應用程序兼容。如果我在API中引入了重大更改並且用戶沒有重新加載頁面,則可能會導致保留數據不一致的錯誤。

  2. 由於HTML文件可以重新加載,而javascript或css文件沒有這樣做,可以提供不兼容的html文件(例如缺少CSS類定義或範圍引用)。

我發現的唯一的真正的解決方案是:

  1. this answer
  2. 在每一個XHR調用當前部署的版本檢查,並檢查它是否在瀏覽器中加載的版本diferent ,

但:

  1. 當絕大多數情況下每個人都會使用相同的版本時,保留所有版本(數據庫,API,服務器代碼,客戶端代碼)似乎有很多開銷。
  2. 這將是非常不友好的用戶,有一條消息,告訴整個應用程序將被重新加載和丟失未保存在後臺的所有數據。考慮填寫表格並在按下保存之後被強制重新輸入所有數據。

我錯過了每個人如何處理Angular緩存?

+0

你有沒有發現這一個一個解決方案,我在確切的問題運行減去我使用淘汰賽沒有棱角 –

回答

1

您可以使用URL查詢參數來幫助您。我們在應用程序中做的是在資源末尾追加查詢參數(腳本,圖像)並將其更新爲下一個主要版本。例如:

<script src="angular.js?v=1.1"/> 

而下一個主要版本後,將其更改爲

<script src="angular.js?v=1.2"/> 

這種變化迫使Web服務器請求新文件的URL是新的。

大部分大型角度應用都由require.js備份,它提供了自己的配置來處理緩存問題。例如:

require.config({ 
    baseUrl : 'resources/app', 
    urlArgs : 'v=1.2' 
}); 
+0

這不是我的問題。我知道如何破壞靜態文件,但如果index.html文件沒有重新加載,它們的url不會被這個新的參數更新,也不會對這個文件發出請求,所以它們不會被重新加載。 –

+0

您可以配置網絡服務器始終爲index.html提供新鮮內容並將no-cache標頭放入其中嗎? – Paras

+0

任何這些解決方案都需要瀏覽器啓動對「index.html」文件的請求,但是在單個頁面應用程序中,只有在網頁首次加載到瀏覽器中時纔會執行此操作。然後,只有內部路由才能更改視圖,有時會加載一些html,但不會再請求index.html或css或javascript文件。只要該選項卡未關閉或啓動手動瀏覽器重新加載,網絡就可以在瀏覽器中生活幾天,不會請求index.html文件。 –