RequireJS似乎在内部做了一些事情,缓存所需的javascript文件。如果我对所需的文件之一进行了更改,我必须重命名该文件,以便应用更改。

将版本号作为查询字符串参数附加到文件名末尾的常见技巧不适用于requirejs <script src="jsfile.js? "脚本v2”> < / >

我正在寻找的是一种方法,以防止RequireJS所需脚本的这种内部缓存,而不必在每次更新脚本文件时重命名脚本文件。

跨平台解决方案:

我现在使用urlArgs: "bust=" + (new Date()). gettime()在开发过程中自动缓存破坏和urlArgs: "bust=v2"的生产,在推出一个更新的所需脚本后,我增加硬编码的版本num。

注意:

@Dustin Getz在最近的回答中提到,当Javascript文件不断刷新时,Chrome开发工具将在调试过程中删除断点。一个解决方法是编写调试器;在大多数Javascript调试器中触发断点。

特定于服务器的解决方案:

有关可能更适合您的服务器环境(如Node或Apache)的特定解决方案,请参阅下面的一些答案。


当前回答

urlArgs解决方案有问题。不幸的是,您无法控制可能在您和用户的web浏览器之间的所有代理服务器。不幸的是,其中一些代理服务器可能被配置为在缓存文件时忽略URL参数。如果发生这种情况,将会向用户发送错误的JS文件版本。

我最终放弃了,并直接在require.js中实现了自己的修复。如果您愿意修改requirejs库的版本,这个解决方案可能适合您。

你可以在这里看到补丁:

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

一旦添加,你可以在require配置中做这样的事情:

var require = {
    baseUrl: "/scripts/",
    cacheSuffix: ".buildNumber"
}

使用构建系统或服务器环境将buildNumber替换为修订id /软件版本/喜欢的颜色。

像这样使用require:

require(["myModule"], function() {
    // no-op;
});

将导致需要请求此文件:

http://yourserver.com/scripts/myModule.buildNumber.js

在我们的服务器环境中,我们使用url重写规则来去除buildNumber,并提供正确的JS文件。这样我们就不必担心重命名所有的JS文件。

该补丁将忽略任何指定协议的脚本,也不会影响任何非js文件。

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

更新:

在拉请求的讨论中,requirejs作者建议这可以作为一个解决方案,为修订号添加前缀:

var require = {
    baseUrl: "/scripts/buildNumber."
};

我没有尝试过这个,但其含义是,这将请求以下URL:

http://yourserver.com/scripts/buildNumber.myModule.js

这对于许多会使用前缀的人来说可能非常有用。

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

RequireJS和代理缓存

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

其他回答

快速解决开发问题

对于开发,你可以在Chrome开发工具中禁用缓存(为网站开发禁用Chrome缓存)。缓存禁用只发生在开发工具对话框打开时,所以您不必担心在每次常规浏览时切换此选项。

注意:在生产环境中使用'urlArgs'是合适的解决方案,这样用户就可以获得最新的代码。但这使得调试变得困难,因为chrome每次刷新都会使断点失效(因为它每次都是一个“新”文件)。

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'来处理RequireJS的缓存爆破。因为这并不能完全解决问题。更新版本no将导致下载所有资源,即使您只更改了单个资源。

为了解决这个问题,我建议使用Grunt模块,如“filerev”来创建修订号。在此之上,我已经在Gruntfile中编写了一个自定义任务,以在任何需要的地方更新修订。

如果需要,我可以分享这个任务的代码片段。

urlArgs解决方案有问题。不幸的是,您无法控制可能在您和用户的web浏览器之间的所有代理服务器。不幸的是,其中一些代理服务器可能被配置为在缓存文件时忽略URL参数。如果发生这种情况,将会向用户发送错误的JS文件版本。

我最终放弃了,并直接在require.js中实现了自己的修复。如果您愿意修改requirejs库的版本,这个解决方案可能适合您。

你可以在这里看到补丁:

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

一旦添加,你可以在require配置中做这样的事情:

var require = {
    baseUrl: "/scripts/",
    cacheSuffix: ".buildNumber"
}

使用构建系统或服务器环境将buildNumber替换为修订id /软件版本/喜欢的颜色。

像这样使用require:

require(["myModule"], function() {
    // no-op;
});

将导致需要请求此文件:

http://yourserver.com/scripts/myModule.buildNumber.js

在我们的服务器环境中,我们使用url重写规则来去除buildNumber,并提供正确的JS文件。这样我们就不必担心重命名所有的JS文件。

该补丁将忽略任何指定协议的脚本,也不会影响任何非js文件。

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

更新:

在拉请求的讨论中,requirejs作者建议这可以作为一个解决方案,为修订号添加前缀:

var require = {
    baseUrl: "/scripts/buildNumber."
};

我没有尝试过这个,但其含义是,这将请求以下URL:

http://yourserver.com/scripts/buildNumber.myModule.js

这对于许多会使用前缀的人来说可能非常有用。

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

RequireJS和代理缓存

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

在我的情况下,我想每次点击都加载相同的表单,我不希望我对文件所做的更改保持不变。它可能与这篇文章不太相关,但这可能是一个潜在的解决方案,在客户端不需要为require设置配置。无需直接发送内容,您可以复制所需文件并保持实际文件完整。

LoadFile(filePath){
    const file = require(filePath);
    const result = angular.copy(file);
    return result;
}