2013-02-28 32 views
2

如果我有一個使用PJAX或Turbolinks的應用程序,那麼在將新代碼部署到服務器時會出現問題 - 比如說Heroku。問題在於正在訪問應用程序的用戶將繼續使用應用程序以前版本的Javascript(因爲它已經加載到瀏覽器中),但會從新版本中獲取HTML頁面。有時候,新的HTML代碼會假設新的Javascript已加載,因此無法正常工作。整潔部署PJAX或Turbolinks應用程序

有沒有人注意到這個問題?你對此做了什麼?這似乎是單頁Javascript應用程序(如基於Backbone和Ember的應用程序)的常見問題。流星至少可以無縫地升級客戶端中的代碼,以此來處理這個問題。

回答

1

https://github.com/rails/turbolinks/#asset-change-detection看起來像答案。在你的腳本標記中,放入data-turbolinks-track。然後我假設當turbolink加載一個頁面時,它會查找該腳本標記,並且如果URL已更改(如果使用資產管道,它將自動更改),那麼它會爲您重新加載整個頁面。

+0

是的,在turbolinks源: 如果assetsChanged DOC document.location.reload() – fabspro 2013-03-01 06:37:33

+0

https://github.com/rails/turbolinks/blob/master/lib/資產/ Java腳本/ turbolinks.js.coffee#L34 – fabspro 2013-03-01 06:38:01

0

以pivotaltracker爲例,他們檢查客戶端連接並強制用戶在新版本到達時重新加載客戶端。

只要您不在應用程序內提供向後兼容性,就沒有其他任何事情可以做。

0

如果您使用Pjax,您可以添加

<meta http-equiv="x-pjax-version" content="v123"> 

到你的頭。您可以爲內容屬性使用服務器定義的值,然後在部署之前,確保更新值。一旦部署完成,後續的Pjax請求將會看到這個頭文件已經被更新,取消它的Ajax請求,並且下載一個完整的頁面重新加載。

對於Turbolinks 5,您可以將data-turbolinks-track="reload"添加到標題中的腳本和樣式錶鏈接。 Turbolinks將會在每個請求中觀察這些文件的變化。然後在部署時,就像Pjax一樣,它會請求整頁重新加載。

經典Turbolinks只需要屬性data-turbolinks-track來代替。

您可以閱讀更多內容並查看Pjax的GitHub頁面上的其他功能:https://github.com/defunkt/jquery-pjax或Turbolinks:https://github.com/turbolinks/turbolinks

對於Turbolinks經典:https://github.com/turbolinks/turbolinks-classic