2014-09-06 90 views
0

我有YUI項目是mavenized。當我們發佈新的YUI代碼時,它不會立即反映在瀏覽器中,直到您在瀏覽器上執行SHIFT + REFRESH爲止。Yui無效javascript版本緩存與新版本

我一直在用YUI模塊的方式來加載腳本是這樣的:

YUI.GlobalConfig = { 
    modules: { 

'manual-entry-util': { 
     fullpath: 'resources/js/common.js', 
     requires: [ 'node']    
    }, 
    'user-perm-util' : { 
     fullpath: 'resources/js/userPermUtil.js', 
     requires: [ 'node', 'io-base', 'json', 'json-stringify']  
    }, 
    'file-upload-custom' : { 
     fullpath: 'resources/js/fileUploadCustom.js', 
     requires: [ 'gallery-datatable-selection','event-custom', 'node']  
    }, 
    'icsd-uploader' : { 
     fullpath: 'resources/js/icsdUploader.js', 
     requires: [ 'uploader', 'node']  
    }, 
    'ui-util' : { 
     fullpath: 'resources/js/uiUtil.js', 
     requires: [ 'node']  
    } 
    } 
}; 

我相信我們需要修改的網址有某種變量,這樣新的代碼可以通過瀏覽器拾起的。

有沒有一種方法可以通過maven或其他工具自動化這個過程。例如。它可以從.js文件的內容生成哈希值,然後將其添加到.js文件的url中?

回答

0

我們使用@blicksky答案的變體。我們將自己的組合裝載器構建爲一個servlet。

首先,我們將YUI設置爲自己的Maven項目。版本標籤反映了YUI的發佈版本,因此您的版本看起來像<version>3.17.2</version。我們有一個內部回購,所以YUI項目的任何更新都會在那裏發佈。 YUI項目只在/ src/main/resources/META-INF/resources中包含YUI的副本。在這方面,它與WebJars project採用的方法非常相似。

Combo加載程序負責連接YUI文件以實現更好的加載性能,並且還負責添加緩存破壞URL參數。在生產中,參數是Build ID,但在開發中,該參數可以是隨機數,以便每次加載資源。我們在服務器上使用Spring,因此我們使用Classpath來解析來自上述YUI Maven項目的YUI文件。基本要點是我們的Servlet實現ResourceLoaderAware,然後可以使用ResourceLoader來獲取YUI文件來提供服務。

該方法爲我們提供了很好的服務,並且使我們對如何提供文件以及提高加載時間進行了非常細緻的控制。

+0

謝謝。這看起來很詳細。我將不得不單獨消化每一步,因爲我還沒有使用組合加載器。對於緩存破壞,我修改了所有的URL。js文件在Maven構建過程中添加一個像這樣的GIT哈希(fullpath:'resources/js/32kdf23rweqeqe/userPermUtil.js')。所以我不得不要求maven在構建過程中將.js文件複製到這個新位置。我猜ResourceLoaderAware會取消將js文件複製到基於散列的文件夾的不必要步驟。 – makcalif 2014-09-09 04:23:17

2

我的方法是在資源路徑的開始處包含緩存清除值。適當的值可能是當前縮寫的提交哈希或修訂號,或者如果使用CI工具,則爲當前內部版本號。您的構建過程會將您的所有資產部署到以此值命名的目錄中,因此如果您當前的提交散列爲abcd1234,那麼最終會得到類似resources/abcd1234/js/之類的文件。

您的構建過程還需要動態修改您的YUI.GlobalConfig對象,也許使用令牌替換,以便YUI加載器可以在那裏找到您的文件。這可以通過設置base配置選項(請參閱http://yuilibrary.com/yui/docs/yui/loader.html#configuration-options)在一個位置完成,但由於您爲每個文件指定了fullpath,因此您必須設置每個文件。 (您正在使用SHIFT + REFRESH進行操作),但是您的用戶會分別緩存每個版本的資源。

+0

我從理論上理解解決方案,這就是我在某些問題上實現的方法。我正在尋找更多具體的Maven步驟,因爲這是很多人會做的事情。另外,我遇​​到了一些問題,如果我使它工作,.js文件需要放在像'abcd1234'這樣的文件夾下,那樣我就不能在爆炸模式下運行我的戰爭,因爲爆炸模式不使用maven。 – makcalif 2014-09-08 03:48:10