强制浏览器在开发MVC视图时刷新javascript代码?

时间:2015-04-08 14:24:40

标签: javascript asp.net-mvc browser cross-browser browser-cache

非常简单,我正在开发一个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+RCTRL+F5时的结果与我的更改未生效之前的结果相同。

更新2

在DevTools打开的情况下,我还按下了“刷新”按钮并尝试了“正常/硬/空缓存”和“正常”。硬重新加载选项都具有相同的结果。为了简化测试,我在下面添加了一个警报,以便在页面加载时显示(并且当前没有警报出现):

$(document).ready(function () {
            alert("Test");
            // Other Code/Functions -- No Error showing in Console
});

3 个答案:

答案 0 :(得分:30)

如果您使用的是Bundling from MVC,则有两种方法可以禁用缓存:

  1. 使用BundleTable.EnableOptimizations。这指示捆绑即使在调试时也会缩小和优化捆绑。它会根据脚本的内容在流程中生成哈希,因此您的客户浏览器可以长时间缓存此文件。它会在您下次更改文件时生成完整的不同哈希,以便您的客户可以看到您的更改。缺点是您的脚本将变得不可读,并且您无法对其进行调试,因此这可能不是您的最佳选择。
  2. 使用System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl("url", true)解析脚本的网址,第二个参数(true)是requiring使用网址生成的哈希值,从而阻止您的缓存更改文件时的浏览器。这与第一个选项中生成的哈希完全相同,但没有缩小。
  3. 我创建了一个小型演示,显示第二个选项阻止缓存发生,诀窍是从脚本的内容中生成哈希,而不会缩小脚本。

    我使用以下内容创建了一个名为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以防止缓存:

    enter image description here

    编辑我的文件后:

    enter image description here

答案 1 :(得分:5)

您可能希望在脚本URL之后添加no_cache变量,如:

<script src="js/stg/Stg.js?nocache=@random_number"></script> 

如果您设法将随机数放在我指定的地方,浏览器将在F5之后自动下载最新版本的脚本

答案 2 :(得分:2)

解决此问题的快速技巧包括在新选项卡中打开脚本文件,然后在此页面上刷新它。 如果您碰巧打开了Chrome开发工具,它甚至会刷新它。

从开发工具中,您甚至可以轻松地右键单击 - 在新选项卡中打开脚本。