我在我的应用程序中使用require.js来要求JS模块。
我需要一种方法来通过不同的请求URL来破坏新JS模块上的客户端缓存。
即,如果文件hello/there.js
已经缓存在客户端上,我可以更改文件名以强制浏览器获取新文件。
换句话说,对于模块hello/there
,我希望require.js请求url hello/there___v1234___.js
(文件名看起来可能不同,这只是一个例子),根据版本可在客户端访问的字符串。
实现这一目标的最佳方法是什么?
答案 0 :(得分:3)
我对urlArgs解决方案感到非常沮丧,最后放弃了implemented my own fix直接进入require.js。如果您愿意修改库的版本,此修复程序将实现您理想的解决方案。
你可以在这里看到补丁:
https://github.com/jbcpollak/requirejs/commit/589ee0cdfe6f719cd761eee631ce68eee09a5a67
添加后,您可以在require config中执行以下操作:
var require = {
baseUrl: "/scripts/",
cacheSuffix: ".buildNumber"
}
使用构建系统或服务器环境将buildNumber
替换为修订版ID或软件版本。
使用像这样的要求:
require(["myModule"], function() {
// no-op;
});
将导致要求请求此文件:
http://yourserver.com/scripts/myModule.buildNumber.js
补丁将忽略指定协议的任何脚本,并且不会影响任何非JS文件。
在我们的服务器环境中,我们使用url重写规则去除buildNumber,并提供正确的JS文件。这样我们实际上不必担心重命名所有JS文件。
这适用于我的环境,但我发现有些用户更喜欢前缀而不是后缀,应该很容易修改我的提交以满足您的需求。
以下是一些可能的重复问题:
答案 1 :(得分:2)
好的,我为你搜索了“requirejs cache bust”并找到了this existing SO answer,其中说你可以使用urlArgs
参数配置requireJS,这只是一个部分解决方案,但它可能就足够了满足您的迫切需求。
也就是说,缓存问题充满挑战,许多“解决方案”实际上并没有完全解决问题。唯一可维护的方法(目前的恕我直言)是一个全面的资产管理系统,如Ruby on Rails资产管道或连接资产或等效的服务器端框架。这些可以纠正计算每个文件内容的校验和(通常是MD5或SHA1),并为您提供需要在HTML script
标记中作为URL放置的文件名。因此,不要因为根据版本号手动更改文件名而烦恼,只需使用校验和,因为它们很容易实现自动化和万无一失。
从我所知道的,开箱即用的requirejs不能为你做cachebusting方面。您可能需要阅读this google groups thread。否则,您可能需要将requirejs与其他工具/脚本配对,以获得良好的缓存校验和。
答案 2 :(得分:1)
HTML5 Boilerplate有ant-build-script,可以根据这个原因重命名您的文件以及对它们的任何引用can do alot more。如果你还没有,那值得一试。
答案 3 :(得分:1)
就像requirejs的创建者所建议的那样:
var load = requirejs.load;
requirejs.load = function (context, moduleId, url) {
// modify url here
url = url.substring(0, url.lastIndexOf('.')) + '.' + VERSION + url.substring(url.lastIndexOf('.'));
return load(context, moduleId, url);
};
https://github.com/jrburke/requirejs/wiki/Fine-grained-URL-control