非常简单,我正在开发一个MVC5应用程序并且已经注意到(最近)我的浏览器似乎正在缓存我在@section Scripts { }
内的视图上的JavaScript代码。
目前我正在使用Chrome开发,我尝试过CTRL+F5
&重新加载页面的CTRL+SHFT+R
,但我在javascript代码中取消注释的alert()
仍在呈现为已注释。我也尝试通过隐身模式以及其他浏览器(Firefox,IE)访问我的本地主机并获得相同的行为。这是我的/Home/Index.cshtml
视图,它是应用程序启动时加载的默认视图。我还尝试在页面中添加一些额外的HTML文本,然后新代码再次生效/显示。
我目前的Chrome版本是Version 41.0.2272.118 m
,如果有人有任何想法可能会发生什么?
更新:
我已经进入了开发者工具=> Chrome中的常规设置并选中[X] Disable cache (while DevTools is open)
,然后重复(使用DevTools仍处于打开状态),尝试CTRL+SHFT+R
和CTRL+F5
时的结果与我的更改未生效之前的结果相同。
更新2 :
在DevTools打开的情况下,我还按下了“刷新”按钮并尝试了“正常/硬/空缓存”和“正常”。硬重新加载选项都具有相同的结果。为了简化测试,我在下面添加了一个警报,以便在页面加载时显示(并且当前没有警报出现):
$(document).ready(function () {
alert("Test");
// Other Code/Functions -- No Error showing in Console
});
答案 0 :(得分:30)
如果您使用的是Bundling from MVC,则有两种方法可以禁用缓存:
System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl("url", true)
解析脚本的网址,第二个参数(true
)是requiring使用网址生成的哈希值,从而阻止您的缓存更改文件时的浏览器。这与第一个选项中生成的哈希完全相同,但没有缩小。我创建了一个小型演示,显示第二个选项阻止缓存发生,诀窍是从脚本的内容中生成哈希,而不会缩小脚本。
我使用以下内容创建了一个名为myscript.js
的脚本文件:
$(document).ready(function () {
alert('a');
});
然后我将其添加到我的BundleConfig.cs
:
// PLEASE NOTE this is **NOT** a ScriptBundle
bundles.Add(new Bundle("~/bundles/myscripts").Include(
"~/Scripts/myscript*"));
如果您添加ScriptBundle
,则会再次获得缩小的响应,因为ScriptBundle
只是Bundle
使用JsMinify
转换(source)。这就是为什么我们只使用Bundle
。
现在,您可以使用此方法添加脚本,以使用散列appendend解析脚本URL。您可以使用Script.Render
@Scripts.Render(System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl("~/bundles/myscripts", true))
或script
代码:
<script src="@System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl("~/bundles/myscripts", true)"></script>
无论哪种方式都会生成带有哈希的URL以防止缓存:
编辑我的文件后:
答案 1 :(得分:5)
您可能希望在脚本URL之后添加no_cache变量,如:
<script src="js/stg/Stg.js?nocache=@random_number"></script>
如果您设法将随机数放在我指定的地方,浏览器将在F5之后自动下载最新版本的脚本
答案 2 :(得分:2)
解决此问题的快速技巧包括在新选项卡中打开脚本文件,然后在此页面上刷新它。 如果您碰巧打开了Chrome开发工具,它甚至会刷新它。
从开发工具中,您甚至可以轻松地右键单击 - 在新选项卡中打开脚本。