使用RequireJS清除特定模块的缓存

9
这个问题已经被问了很多次,但并不是特别针对这个例子。
以下是我们应用程序的概述:
- 在Node上使用Express进行简单的服务器路由 - 单页Backbone应用程序 - 核心模块和库(JS / CSS)不会改变 - 经常更改的小部件JS / LESS / HTML文件
在开发过程中,我希望缓存破坏更改的文件,但不包括那些核心库,以加快页面重新加载速度并加快开发速度。
我找到了以下解释:
1. RequireJS上的缓存破坏 - here 2. 缓存破坏特定模块的解释 - here 以下是可能的解决方案:
1. 解释一下requireJS缓存破坏是如何工作的? 2. 提供此特定情况的解决方案。
2个回答

4
缓存破坏的原理是在需要的每个文件结尾加上一个总是独一无二的查询字符串。它利用了RequireJS的urlArgs配置值;RequireJS将为您添加查询字符串。
urlArgs: "bust=" + (new Date()).getTime()

(new Date()).getTime()这部分只是JavaScript中获取唯一字符串的简单方法。你可以使用Math.random()的变化,但使用自纪元以来的毫秒数可以保证唯一性,以实现最佳缓存破坏。

我认为Burke先生是在建议类似于:

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
对于这种情况,我认为没有简单的解决方案。我只是在描述GitHub问题中提出的建议。除非修改RequireJS源代码或进行精心设计的黑客操作,否则我认为您真的没有其他选择。 - c24w

0
只要记住,如果你真的需要依赖某些外部脚本,你可以使用$.getScript而不是require来确保它被包含进来。我有一些非amd脚本用于第三方集成(例如亚马逊支付),我使用了getScript而不是require。如果你能使用这种方法,就可以避免将缓存破坏参数从urlArgs发送到外部服务器上。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接