2013-05-13 52 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发送到外部服务器。