2014-07-12 44 views
0

我想實現我的node.js服務器 指紋我使用requirejs和我的主網頁加載像這樣的腳本:在前端的NodeJS緩存requirejs

<script src="/public/assets2/scripts/lib/requirejs/require.js"></script> 
<script src="/public/assets2/scripts/app/common.js"></script> 
<script> 
require.config({baseUrl: '/public/assets2/scripts/lib'}); 
require(['app/main']); 
</script> 

資產中內置了public/assets2目錄。在重建時,我想要 將requirejs config baseUrl更改爲散列版本 public/assets2/HASHHASH。所以requirejs會請求這樣的腳本,如 :public/assets2/HASHHASH/scripts/app.main.js

將散列添加到baseUrl中是否是一個好主意?我認爲 這是推薦的方法,如果我理解正確。

資產仍然內置了public/assets2,而不是在 public/assets2/HASHHASH,所以我需要一個映射這些 兩者之間,或者實際上把資產注入HASHASH目錄。有沒有 不錯的庫已經做到這一點,我怎麼才能簡單地實現這一點?

編輯

borschik是偉大的,但requirejs已經複製了我的所有資產注入 建立文件夾,它可以在以後要求他們。 borjik與requirejs是過量的 。但是同樣,requirejs沒有內置的緩存清除解決方案。根據我在這裏理解的:,建議使用 ,我將所有資產置於版本化文件夾中,並相應地修復我的baseUrl 。這是requirejs最簡單的修復方法,我甚至不需要從文件生成哈希,每生成一次生成任務都會生成一個哈希 。

問題我已經是步驟3

3。配置您的Web服務器(nginx的等),返回原始文件 即使您使用哈希

我要求的一種方便的方式來做到這一點就要求的NodeJS它。

例子:

GET public/assets2/<hash>/app/main.js

地帶哈希,並返回 public/assets2/app/main.js

另一個問題是,即使我只改變一個 文件中的每個資產搗毀。所以我想最終的解決方案是將它建成 requirejs。

r.js將複製與散列對應的所有資產 優化。然後在瀏覽器上,它會請求哈希文件的URL。 這將需要一個清單文件,在優化工具和瀏覽器上的requirejs之間。

+0

好吧,如果你要處理的文件在客戶端,那麼也許[這](HTTP的HashMap:// stackoverflow.com/a/24680885/896280)將幫助你。 –

+0

@ant_Ti仍然r.js需要生成具有哈希名稱的文件。那麼它需要生成一個清單文件來進行映射。那麼我可以重載加載方法。或者甚至更好,我可以將一個manifest選項傳遞給requirejs配置,所以它可以幫我實現! – eguneys

+0

您可以使用[grunt-frontend](https://github.com/sergeche/grunt-frontend)任務 –

回答

0

你可以看看borschik,尤其是freeze and resource inlining的能力。

如果borschik是不是適合你的好那麼這裏就是你如何能實現這樣的機制的一些理論:

  1. 首先,你需要使用grunt-frontend任務生成文件的哈希值。稍後,您將使用它們用哈希創建網址。
  2. 創建一個簡單的方法,將文件路徑作爲參數,並在由grunt-frontend創建的.build-catalog.json中搜索以創建並返回哈希特定的url。
  3. 配置您的Web服務器(nginx的等),返回原來的文件,即使你與哈希
  4. 將所有路徑要求它使用你的方法寫在第2步

    require.config({ 
        path: { 
         lib: requireURL('/public/assets2/scripts/lib.js') // Will result in: "/public/assets2/<hash>/scripts/lib" 
        } 
    }); 
    

但是有一個侷限性。 grunt-frontend只能從文件和文件夾中計算散列值。您無法設置baseUrl: requireURL('/public/assets2/scripts/lib'),因爲那樣所有文件都將需要使用相同的散列。

但是有一個解決方法的文件夾。您可以請求文件的url並將結果排除到您感興趣的文件夾中。但請記住文件夾散列會隨文件更改而改變。


除了這個方案,您可以配置文件拆分,以提高瀏覽器的並行資源加載

+0

請參閱我的編輯。 – eguneys