require.js - 如何在URL中设置所需模块的版本?

时间:2012-12-12 05:01:12

标签: javascript requirejs browser-cache

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

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

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

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

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

4 个答案:

答案 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文件。

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

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

RequireJS and proxy caching

Prevent RequireJS from Caching Required Scripts

答案 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