防止RequireJS缓存所需的脚本

304

RequireJS似乎在内部缓存所需的javascript文件。如果我对其中一个所需的文件进行更改,我必须重命名文件以应用更改。

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

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

跨平台解决方案:

现在我正在使用urlArgs: "bust="+(new Date())。getTime() 自动清除开发过程中的缓存,以及urlArgs: "bust=v2",生产中我会递增硬编码的版本号以更新所需的脚本。

注意:

@Dustin Getz 在最近的一个回答中提到,当像这样不断刷新Javascript文件时,Chrome开发工具将在调试期间丢弃断点。一个解决方法是在代码中编写debugger; 触发大多数Javascript调试器中的断点。

服务器特定解决方案:

针对您的服务器环境(如Node或Apache)可能效果更好的特定解决方案,请参见下面的一些答案。


你确定这不是服务器或客户端在缓存吗?(我们已经使用必需的JS几个月了,没有注意到类似的情况)IE被捕获了MVC操作结果的缓存,Chrome缓存了我们的HTML模板,但是JS文件似乎在浏览器缓存被重置后都会刷新。我想如果您想利用缓存但无法按照通常的方式进行操作,因为来自必需JS的请求正在删除查询字符串,那可能会引起问题? - PJUK
我不确定RequireJS是否会删除附加的版本号。这可能是我的服务器的问题。有趣的是,RequireJS有一个缓存破坏器设置,所以你可能是对的,它会删除我在所需文件上附加的版本号。 - BumbleB2na
我更新了我的答案,并提供了一个可能的缓存解决方案。 - Dustin Getz
现在我可以将以下内容添加到我今天早上在博客文章中提出的问题清单中:http://codrspace.com/dexygen/does-require-js-introduce-more-problems-than-it-solves-/。而且,不仅需要添加缓存破坏,而且require.js忽略了强制刷新。 - Dexygen
我对这个用例感到困惑...这是为了将AMD模块热重新加载到前端,还是其他什么? - Alexander Mills
在开发过程中,我只是在浏览器中禁用缓存。我认为这是最容易的开发方式。我认为大多数浏览器都有这个功能;我使用Firefox。 - Tigerware
12个回答

-2

这是对@phil mccull所接受答案的补充。

我使用他的方法,但我还通过创建一个T4模板来自动化该过程,以在预构建时运行。

预构建命令:

set textTemplatingPath="%CommonProgramFiles(x86)%\Microsoft Shared\TextTemplating\$(VisualStudioVersion)\texttransform.exe"
if %textTemplatingPath%=="\Microsoft Shared\TextTemplating\$(VisualStudioVersion)\texttransform.exe" set textTemplatingPath="%CommonProgramFiles%\Microsoft Shared\TextTemplating\$(VisualStudioVersion)\texttransform.exe"
%textTemplatingPath% "$(ProjectDir)CacheBuster.tt"

enter image description here

T4模板:

enter image description here

生成的文件: 在此输入图像描述

在加载 require.config.js 之前存储到变量中: 在此输入图像描述

在 require.config.js 中引用:

enter image description here


2
很可能是因为你对JavaScript问题的解决方案是一堆C#代码。这也是一堆额外的工作和代码,做某件事情的最终结果与被接受的答案完全相同。 - mAAdhaTTah
@mAAdhaTTah,您可以使用任何服务器端语言来实现这个功能,不一定是C#。此外,这个过程可以自动化,当您构建项目的新版本时更新缓存破坏,确保客户始终缓存最新版本的脚本。我认为这并不应该被贬低评分。它只是通过提供自动化方法来扩展答案。 - Zach Painter
我创建这个工具的原因是在维护一个使用require.js的应用程序时,我发现每次更新应用程序时手动注释掉"(new Date()).getTime())"并取消注释静态缓存破坏器非常麻烦。很容易忘记。突然间客户正在验证更改并查看缓存的脚本,所以他们认为没有任何变化...全部都是因为你简单地忘记了更改缓存破坏器。这个小小的额外代码消除了这种情况发生的机会。 - Zach Painter
2
我没有打分,我不知道实际发生了什么。我只是建议那些不仅不是JS,而且是C#模板语言的代码对于试图解决问题的JS开发人员来说并不会有太大帮助。 - mAAdhaTTah

-2
在我的情况下,我想每次单击时加载相同的表格,我不希望我所做的更改留下来。这可能与这篇文章没有太大关系,但这可能是客户端的潜在解决方案,而无需为 require 设置配置。您可以复制所需文件并保持实际文件不变,而不是直接发送内容。
LoadFile(filePath){
    const file = require(filePath);
    const result = angular.copy(file);
    return result;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接