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)的特定解决方案,请参阅下面的一些答案。


当前回答

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

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

其他回答

快速解决开发问题

对于开发,你可以在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的主要作者不喜欢使用urlArgs:

对于已部署的资产,我更喜欢将版本或哈希放在整体中 build作为构建目录,然后只需修改使用的baseUrl配置 项目使用该版本目录作为baseUrl。然后 没有其他文件更改,并且它有助于避免一些代理问题 不能缓存带有查询字符串的URL。

(样式我的。)

我遵循这个建议。

在开发中

我更喜欢使用智能缓存可能频繁更改的文件的服务器:发出Last-Modified并在适当的时候用304响应If-Modified-Since的服务器。即使是基于Node的快速集来提供静态文件的服务器也会立即这样做。它不需要对浏览器做任何操作,也不会弄乱断点。

不要使用urlArgs !

要求脚本加载尊重http缓存头。(脚本是用动态插入的<script>加载的,这意味着请求看起来就像加载的任何旧资产一样。)

在开发过程中使用适当的HTTP头来禁用缓存。

使用require的urlArgs意味着你设置的任何断点在刷新时都不会被保留;最终需要在代码中到处放置调试器语句。坏的。在git sha的生产升级期间,我使用urlArgs来破坏缓存资产;那么我就可以把我的资产设置为永远缓存,并保证永远不会有过时的资产。

在开发过程中,我用一个复杂的mockjax配置模拟所有ajax请求,然后我可以在仅javascript模式下使用10行python http服务器服务我的应用程序,并关闭所有缓存。对我来说,这已经扩展到一个相当大的“企业级”应用程序,拥有数百个restful webservice端点。我们甚至有一个签约设计师,他可以使用我们真实的产品代码库,而不允许他访问我们的后端代码。

我从AskApache中获取了这段代码,并将其放入本地Apache web服务器的一个单独的.conf文件中(在我的情况下是/etc/apache2/ others/preventcache .conf):

<FilesMatch "\.(html|htm|js|css)$">
FileETag None
<ifModule mod_headers.c>
Header unset ETag
Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
Header set Pragma "no-cache"
Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT"
</ifModule>
</FilesMatch>

对于开发来说,这很好,不需要更改代码。至于制作,我可能会使用@dvtoever的方法。