require.js-如何将所需模块的版本设置为URL的一部分



我使用require.js来要求应用程序中的js模块。

我需要一种方法来破坏新JS模块上的客户端缓存,通过不同的请求URL。

即,如果文件hello/there.js已经缓存在客户端上,我可以更改文件名以强制浏览器获取新文件。

换句话说,对于模块hello/there,我希望require.js根据客户端上可访问的版本字符串请求urlhello/there___v1234___.js(文件名可能看起来不同,这只是一个示例)。

实现这一目标的最佳方式是什么?

我对urlArgs解决方案感到非常沮丧,最终放弃了,并将我自己的修复程序直接实现到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文件了。

这对我的环境很好,但我意识到有些用户更喜欢前缀而不是后缀,修改我的提交以满足您的需求应该很容易。

以下是一些可能重复的问题:

要求JS和代理缓存

阻止RequireJS缓存所需脚本

好吧,我在谷歌上为您搜索了"requirejs cache bust",找到了这个现有的SO答案,它说您可以使用urlArgs参数配置requirejs,这只是部分解决方案,但可能足以满足您的即时需求。

也就是说,破坏声望的问题充满了挑战,许多"解决方案"实际上并不能完全解决问题。实现这一点的唯一可维护方法(目前为IMHO)是使用一个完整的资产管理系统,如RubyonRails资产管道或连接资产或您选择的服务器端框架的等效系统。它们可以对每个文件的内容进行校验和计算(通常是MD5或SHA1),并为您提供需要在HTMLscript标签中作为URL的文件名。因此,不要麻烦根据版本号手动更改文件名,只需使用校验和,因为它们很容易自动且万无一失。

据我所知,开箱即用的requirejs无法为您提供打破缓存的功能。你可能想阅读这个谷歌群组线程。否则,您可能需要将requirej与一个额外的工具/脚本配对,以获得良好的cachebuster校验和。

就像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

HTML5 Boilerplate有一个ant构建脚本,它可以重命名你的文件以及对它们的任何引用,并且可以做更多的事情。如果你还没有,那就值得一试。

最新更新