防止必需的 JS 缓存必需的脚本

2022-08-30 00:03:14

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

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

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

跨平台解决方案:

我现在使用在开发期间自动破坏缓存,并在推出更新的所需脚本后递增硬编码的版本数。urlArgs: "bust=" + (new Date()).getTime()urlArgs: "bust=v2"

注意:

@Dustin Getz在最近的一个答案中提到,当Javascript文件像这样不断刷新时,Chrome Developer Tools将在调试期间删除断点。一种解决方法是编写代码以在大多数 Javascript 调试器中触发断点。debugger;

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

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


答案 1

可以将 RequireJS 配置为将值追加到每个脚本 URL 以进行缓存破坏。

从 RequireJS 文档 (http://requirejs.org/docs/api.html#config):

urlArgs:附加到 URL 的额外查询字符串参数,RequireJS 使用这些参数来获取资源。当浏览器或服务器配置不正确时,缓存 bust 最有用。

示例,将“v2”附加到所有脚本:

require.config({
    urlArgs: "bust=v2"
});

出于开发目的,您可以通过附加时间戳来强制 RequireJS 绕过缓存:

require.config({
    urlArgs: "bust=" + (new Date()).getTime()
});

答案 2

不要为此使用urlArgs!

需要脚本加载遵循 http 缓存标头。(脚本加载时会动态插入,这意味着请求看起来就像加载的任何旧资产一样。<script>

使用适当的 HTTP 标头提供 javascript 资产,以便在开发过程中禁用缓存。

使用 require 的 urlArgs 意味着您设置的任何断点都不会在刷新时保留;你最终需要把语句放在代码的任何地方。坏。我使用git sha在生产升级期间使用缓存破坏资产;然后我可以将我的资产设置为永久缓存,并保证永远不会有过时的资产。debuggerurlArgs

在开发过程中,我使用复杂的mockjax配置模拟所有ajax请求,然后我可以在仅javascript模式下使用10行python http服务器来提供我的应用程序,并且所有缓存都已关闭。对我来说,这已经扩展到一个相当大的“企业”应用程序,其中包含数百个宁静的Web服务端点。我们甚至有一个合同设计师,他可以使用我们真正的生产代码库,而无需让他访问我们的后端代码。