使用RequireJS缓存破坏特定模块

时间:2013-05-13 13:50:05

标签: javascript node.js caching requirejs browser-cache

这个问题已被多次询问,但不是特定于此示例。

以下是我们的应用程序概述:

  • 使用Express on Node
  • 进行简单的服务器路由
  • 单页骨干应用
  • 不改变的核心模块和库(JS / CSS)
  • 经常更改的Widget JS / LESS / HTML文件

在开发过程中,我希望缓存更改的胸部文件,而不是那些核心库,以加快我的页面重新加载并加快我的开发。

我找到了解释:

  1. 在RequireJS上缓存加密 - here
  2. 缓存清除特定模块的说明 - here
  3. 解决方案可以:

    1. 解释requireJS缓存破坏是如何工作的?
    2. 为此特定方案提供解决方案。

2 个答案:

答案 0 :(得分: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 :(得分:0)

请记住,如果你真的需要依赖一些外部脚本,你可以使用$.getScript而不是要求确保它包含在内。我有一些非amd脚本用于第三方集成(例如亚马逊支付),我使用getScript代替require。如果您可以使用此方法,则可以避免将缓存清除参数从urlArgs发送到外部服务器。