4

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

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

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

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

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

4

4 回答 4

4

我对 urlArgs 解决方案感到非常沮丧,最后放弃并直接在 require.js 中实现了我自己的修复。如果您愿意修改您的库版本,此修复将实现您的理想解决方案。

你可以在这里看到补丁:

https://github.com/jbcpollak/requirejs/commit/589ee0cdfe6f719cd761eee631ce68eee09a5a67

添加后,您可以在需要配置中执行以下操作:

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 和代理缓存

防止 RequireJS 缓存所需的脚本

于 2014-02-07T04:16:55.943 回答
3

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

也就是说,cachebusting 问题充满挑战,许多“解决方案”实际上并不能完全解决问题。唯一可维护的方法(恕我直言,截至目前)是使用完整的资产管理系统,如 Ruby on Rails 资产管道或连接资产或您选择的服务器端框架的等价物。这些可以正确计算每个文件内容的校验和(通常是 MD5 或 SHA1),并为您提供需要作为 URL 放入 HTMLscript标记中的文件名。因此,不要费心根据版本号手动更改文件名,只需使用校验和,因为它们很容易自动化且万无一失。

据我所知,开箱即用的 requirejs 无法为您完成缓存清除方面。您可能想阅读这个 google groups thread。否则,您可能需要将 requirejs 与其他工具/脚本配对,以获得良好的 cachebuster 校验和。

于 2012-12-12T05:24:46.777 回答
2

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

于 2015-09-25T08:30:20.560 回答
1

HTML5 Boilerplate 有ant-build-script可以重命名您的文件以及出于这个确切原因对它们的任何引用,并且可以做更多的事情。如果您还没有,值得一试。

于 2012-12-12T05:21:39.500 回答