阻止RequireJS缓存所需的脚本
RequireJS似乎在内部做了一些需要JavaScript文件的缓存。 如果我对其中一个必需的文件进行了更改,则必须重命名该文件才能应用更改。
将版本号作为查询字符串参数附加到文件名末尾的常见技巧不适用于requirejs <script src="jsfile.js?v2"></script>
我正在寻找的是防止这种内部缓存RequireJS必需脚本的方法,而不必在每次更新时重命名脚本文件。
跨平台解决方案:
我现在在开发过程中使用urlArgs: "bust=" + (new Date()).getTime()
用于自动缓存清除, urlArgs: "bust=v2"
用于生产的urlArgs: "bust=v2"
,其中我在推出后增加硬编码版本num一个更新的必需脚本。
注意:
@Dustin Getz在最近的回答中提到Chrome开发人员工具将在调试过程中在JavaScript文件不断刷新时跳出断点。 一种解决方法是编写debugger;
在代码中触发大多数Javascript调试器中的断点。
服务器特定解决方案:
对于可能对您的服务器环境(如Node或Apache)更好的特定解决方案,请参阅下面的一些答案。
RequireJS可以配置为将值附加到每个脚本URL以缓存清除。
从RequireJS文档(http://requirejs.org/docs/api.html#config):
urlArgs :追加到RequireJS用于提取资源的URL的额外查询字符串参数。 当浏览器或服务器配置不正确时,最有用的功能是缓存。
例如,将“v2”附加到所有脚本中:
require.config({
urlArgs: "bust=v2"
});
出于开发目的,您可以强制RequireJS通过附加时间戳来绕过缓存:
require.config({
urlArgs: "bust=" + (new Date()).getTime()
});
不要为此使用urlArgs!
要求脚本加载尊重HTTP缓存标头。 (脚本加载了一个动态插入的<script>
,这意味着请求看起来就像任何旧资产被加载一样。)
在开发过程中使用正确的HTTP标头为您的JavaScript资源提供服务以禁用缓存。
使用require的urlArgs意味着您设置的任何断点在刷新时都不会被保留; 您最终需要在代码中的任何位置放置debugger
语句。 坏。 在使用git sha进行生产升级期间,我使用urlArgs
来缓存资源清除资产; 那么我可以设置我的资产永久缓存并保证永远不会有陈旧的资产。
在开发过程中,我使用复杂的mockjax配置来嘲讽所有ajax请求,然后我可以使用10行python http服务器以全JavaScript模式提供我的应用程序,并关闭所有缓存。 这已经扩展到一个相当大的“企业级”应用程序,拥有数百个安静的web服务端点。 我们甚至有一位签约设计师,他可以与我们的真实生产代码库一起工作,而无需让他访问我们的后端代码。
urlArgs解决方案有问题。 很遗憾,您无法控制可能位于您与用户网络浏览器之间的所有代理服务器。 不幸的是,这些代理服务器中的一些可能被配置为在缓存文件时忽略URL参数。 如果发生这种情况,您的JS文件的错误版本将会传送给您的用户。
我终于放弃了,并直接将我自己的修复程序应用于require.js。 如果您愿意修改您的requirejs库版本,该解决方案可能适用于您。
你可以在这里看到补丁:
https://github.com/jbcpollak/requirejs/commit/589ee0cdfe6f719cd761eee631ce68eee09a5a67
一旦添加,你可以在需要的配置中做这样的事情:
var require = {
baseUrl: "/scripts/",
cacheSuffix: ".buildNumber"
}
使用您的构建系统或服务器环境来使用修订版本ID /软件版本/最喜欢的颜色替换buildNumber
。
使用这样的要求:
require(["myModule"], function() {
// no-op;
});
将导致需要请求此文件:
http://yourserver.com/scripts/myModule.buildNumber.js
在我们的服务器环境中,我们使用url重写规则去除buildNumber,并提供正确的JS文件。 这样我们实际上不必担心重命名我们所有的JS文件。
该补丁将忽略任何指定协议的脚本,并且不会影响任何非JS文件。
这适用于我的环境,但我意识到有些用户更喜欢前缀而不是后缀,应该很容易修改我的提交以适应您的需求。
更新:
在拉请求讨论中,requirejs作者建议这可以作为修订号前缀的解决方案:
var require = {
baseUrl: "/scripts/buildNumber."
};
我没有试过这个,但其含义是,这将要求以下网址:
http://yourserver.com/scripts/buildNumber.myModule.js
对于许多可以使用前缀的人来说,这可能非常有效。
这里有一些可能的重复问题:
RequireJS和代理缓存
require.js - 如何将所需模块的版本设置为URL的一部分?
链接地址: http://www.djcxy.com/p/27559.html