2013-05-13 108 views
9

此問題已被多次詢問,但不是特定於此示例。使用RequireJS緩存特定模塊

這裏是我們的應用程序的概述:

  • 簡單的服務器明確在節點路由
  • 單頁骨幹應用
  • 核心模塊和庫(JS/CSS)不改變
  • 的Widget JS /更少/ HTML文件的頻繁更改

在開發過程中,我期待緩存胸圍這些文件可以改變而不是這些核心庫來加速我的頁面重新加載並加速我的開發。

我已經找到解釋的:

  1. 快取清除上RequireJS - here
  2. 高速緩存說明猛擊特定模塊 - here

可能的解決方案:

  1. 解釋requireJS緩存破壞如何工作?
  2. 爲此特定場景提供解決方案。

回答

4

通過在每個需要的文件的末尾附加一個始終唯一的查詢字符串,緩存清除工作。它使用RequireJS的urlArgs配置值; RequireJS需要追加爲您的護理:

urlArgs: "bust=" + (new Date()).getTime() 

(new Date()).getTime()部分只是一個簡單的方式來獲得一個唯一的串出的JavaScript。您可以在Math.random()上進行一些修改,但使用number of milliseconds since the epoch可以保證唯一性,從而實現最佳緩存佔用率。

我覺得伯克先生是在暗示這樣的:不是

require.config({ 
    baseUrl: '/base/path', 
    paths: { 
     'fileAlias': 'fileLikelyToChange?bust=' + (new Date()).getTime(), 
     'anotherFileAlias': 'anotherFileLikelyToChange?bust=' + (new Date()).getTime(), 
     'jQuery': 'jQuery' 
    }, 
}); 

所以,無處不在的urlArgs緩存清除後,就特別將其應用到這很可能改變每個文件;因此排除任何圖書館。

我沒有測試過,但我大概整理一下,以這樣的:

function bust(path) { 
    return path + '?bust=' + (new Date()).getTime(); 
} 

require.config({ 
    baseUrl: '/base/path', 
    paths: { 
     'fileAlias': bust('fileLikelyToChange'), 
     'anotherFileAlias': bust('anotherFileLikelyToChange'), 
     'jQuery': 'jQuery' 
    }, 
}); 
+1

謝謝 - 那些包含在我的應用程序中但未在require.config - paths對象中引用的文件呢? – imrane 2013-05-14 14:20:53

+0

對於這種情況,我不認爲有一個簡單的解決方案。我只是描述了我認爲在GitHub問題中提出的建議。我不認爲你真的有任何其他的選擇,沒有修改RequireJS的來源或做一個精心製作的黑客。 – c24w 2013-05-14 15:39:54

0

只要記住,如果你真的需要依靠,你可以使用$.getScript,而不是一些外部腳本要求確保它包括在內。我有一些非第三方集成的非amd腳本(例如亞馬遜支付),我使用getScript代替require。如果您可以使用此方法,則可以避免將緩存清除參數從urlArgs發送到外部服務器。