2013-06-24 20 views
4

背景:支持解散後的JavaScript部署

我有一個每天部署到生產至少一次的單個頁面的JavaScript的網站。它可以獲得合理的流量,用戶可以保持相當長的時間,直到他們結賬並且JavaScript通過XHR與後端進行交互。

問題:

部署在瀏覽器中加載的JavaScript之後可能不再與後端(滑軌在這種情況下)兼容。

可能的解決方案:

一)比較固定的間隔資產管道指紋,window.confirm具有加載請求,如果它是不一樣的。

b)發送帶有XHR請求的X-JS指紋頭,如果不相容則返回一個409衝突,JavaScript將觸發一個錯誤,並返回一個window.confirm重新加載。

c)運行兩個後端;一個立即部署新的JS和新的後端代碼(SERVER-1),另一個仍然支持舊的JavaScript XHR請求格式(SERVER-2)。像b)將發送X-JS指紋頭,但不是409,它將發送307臨時重定向到SERVER-2來完成請求。舊會話全部清除後,SERVER-2將部署並關閉,直到再次需要爲止。

我很感興趣,如果有人曾經考慮過這個問題。如果您對這個主題有任何想法,請讓我知道。

回答

2

我也遇到過這個問題。我的解決方案非常簡單,並沒有真正嘗試爲用戶避免錯誤。它類似於您的解決方案a

我保留一個版本號,就像一個指紋(所有文件都是指紋圖,CSS/JS)。部署過程會自動增加版本號。即使我只是更改了一行CSS,版本號也會增加。我不區分主要或次要版本更改,這只是語義。

應用程序每隔一段時間都會ping服務器以檢查版本。如果版本更改「請重新加載頁面」彈出窗口將出現。 (一個非侵入性的小的thingie位於頁面頂部,非常明顯且顯而易見,並且需要點擊)。 如果用戶沒有重新加載,您可能會遇到錯誤,所以如果版本不匹配,我也會禁用錯誤報告。

此解決方案只確保最終人將切換到新版本,並且在用戶切換時不會出現任何錯誤。它不會遷移舊會話或防止用戶出錯。我不會做window.confirm。意想不到的模態對話框很很煩人。如果您碰巧正在鍵入內容,並且您按了[space-bar][enter],對話框消失並且您錯過了它。

解決方案b看起來不錯,但有一個方面。您可以在早期檢測版本不匹配,但也可能意味着您的用戶會看到更多錯誤。如果只有一小部分網站受到更新的影響,則任何XHR請求都將失敗,即使它不需要失敗。這是要考慮的事情。

解決方案c對用戶來說是非常好的,但可能會使地獄升級。如果您的數據庫模型更改會怎樣舊的服務器將無法正確地處理數據,查詢將失敗等


我喜歡的解決方案一個,因爲它是非常簡單的,如果你有許多小的變化經常更新每次更新的影響非常小。

+1

您是否監控過重新加載(重新加載vs沒有重新加載的用戶)?您是否觀察過任何用戶的挫折(顯示通知後放棄等)? –

+0

我目前沒有監視任何有關此功能的信息。我所做的申請沒有數量來產生任何統計學意義。 – Halcyon

3

有一個diffable項目曾在谷歌類似的用例中創建。 它背後的基本理念是有點類似於你的變種a。唯一的區別是,當客戶端檢測到服務器更新時,它會自動更新客戶端代碼庫,並且不會加載所有資源,而是加載diff修補程序並將其應用於客戶端。這聽起來有點瘋狂,但從性能的角度來看,它確實很有意義。

還有一個後續的想法,它使用localStorage存儲客戶端代碼庫。看看https://github.com/plotnikoff/connect-diffable這是一個Node項目,但可能仍然有用,只是爲了得到這個想法。

您可以更改的方法爲你的情況下,並有類似:

  1. 存儲在localStorage的有無校驗客戶方入資產價值爲每一個版本
  2. 時不時或經常請求服務器來檢測是否有新版本推出out
  3. 如果有更新的版本,請求補丁並將其應用於localStorage中的資產,請檢查校驗和。 (在這裏,您可能想要發送新版本的校驗和以及補丁,以在應用之後進行比較)。
+0

我喜歡這種技術,我將研究在當前項目中實現的難度。謝謝。 –

+0

經過調查,我發現這裏有一些東西。實現不完全相同,因爲我加載的是整個javascript而不是deltas。這對程序方法來說效果很好,但任何初始化的對象都保留在內存中,在我的情況下幾乎是每個對象。嘗試重新初始化需要的所有內容,狀態在歷史記錄和document.location中處理是有好處的。 –