9

这个问题已经被问过好几次了,但不是针对这个例子。

这是我们的应用程序的概述:

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

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

我找到了以下解释:

  1. RequireJS 上的缓存破坏 -这里
  2. 缓存清除特定模块的说明 -这里

能否解决:

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

2 回答 2

4

缓存清除通过将始终唯一的查询字符串附加到所需的每个文件的末尾来工作。它利用了 RequireJS 的urlArgs配置值;RequireJS 会为你添加它:

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

(new Date()).getTime()部分只是从 JavaScript 中获取唯一字符串的简单方法。您可以对 做一些变化Math.random(),但使用自 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'
    },
});
于 2013-05-14T12:41:36.503 回答
0

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

于 2014-10-15T18:51:11.650 回答