【问题标题】:Add cache-buster to non-optimized bundle?将缓存破坏器添加到非优化包?
【发布时间】:2014-09-17 15:55:02
【问题描述】:

我在 MVC 中使用捆绑,并且有以下内容:

@Scripts.Render("~/bundles/scripts.js");

BundleTable.EnableOptimizations = true 呈现为:

<script src="/bundles/scripts.js?v=RF3ov56782q9Tc_sMO4vwTzfffl16c6bRblXuygjwWE1"></script>

BundleTable.EnableOptimizations = false 呈现为:

<script src="/js/header.js"></script>
<script src="/js/content.js"></script>
<script src="/js/footer.js"></script>

是否可以拦截非优化版本以包含我自己的自定义缓存破坏器?

例如:

<script src="/js/header.js?v=12345"></script>
<script src="/js/content.js?v=12345"></script>
<script src="/js/footer.js?v=12345"></script>

【问题讨论】:

标签: asp.net-mvc caching bundling-and-minification


【解决方案1】:

为什么需要?在开发中,BundleTable.EnableOptimizations = false 无论如何都不会缓存任何内容,而在生产中,您应该拥有BundleTable.EnableOptimizations = true 也不需要这样的东西。

简短的回答是否定的,没有任何内置功能可以让您按照您的要求去做,主要是因为我已经说过的原因:根本不需要这样的功能。

【讨论】:

  • 谢谢克里斯,我有一个配置可以禁用生产中的优化。它基本上是一个快速回退,以防优化的部署会导致任何意外问题。在这种情况下,id 喜欢保留现有的缓存破坏器。我认为我需要创建自己的自定义 mvc 助手来执行此操作。再次感谢。
  • @Chris:BundleTable.EnableOptimizations = false nothing is cached anyways,但是客户端不是还在缓存对静态js和css文件的请求吗?如果客户端有一个同名的旧文件,它不会访问服务器。这不是应该通过破坏缓存来解决什么版本查询参数,还是我错了?
  • 浏览器缓存不同。 Chrome 将捆绑结果缓存在 BundleTable.EnableOptimizations = false 的 Dev 中。因此,您是错误的。
  • 轶事证据!=证明。我也在开发中运行 Chrome,我的资源没有被缓存。此外,没有“在 Dev 中捆绑结果,其中 BundleTable.EnableOptimizations = false”之类的东西。资源未捆绑在 dev 中,因此如果您看到捆绑的资源,那么您要么在发布配置中运行,要么没有将 EnableOptimizations 设置为 false。
  • “开发中”还包括将开发版本部署到内部 IIS 以供其他人测试。在这些情况下添加 cache-bust 是“需要的”。
【解决方案2】:

以下是您正在寻找的深入解决方案:

https://volaresystems.com/blog/post/2013/03/18/Combining-JavaScript-bundling-minification-cache-busting-and-easier-debugging

总结一下缓存破坏部分,创建一个实用方法,该方法将连接您想要缓存破坏的非优化文件的文件创建时间戳。

例如

&lt;script src="@StaticFile.Version("/js/header.js")"&gt;&lt;/script&gt;

这将产生你正在寻找的东西:

<script src="/js/header.js?v=12345"></script>

缓存清除实用方法:

using System.IO;
using System.Web.Caching;
using System.Web.Hosting;

namespace System.Web.Optimization
{
    public static class StaticFile
    {
        public static string Version(string rootRelativePath)
        {
            if (HttpRuntime.Cache[rootRelativePath] == null)
            {
                var absolutePath = HostingEnvironment.MapPath(rootRelativePath);
                var lastChangedDateTime = File.GetLastWriteTime(absolutePath);

                if (rootRelativePath.StartsWith("~"))
                {
                    rootRelativePath = rootRelativePath.Substring(1);
                }

                var versionedUrl = rootRelativePath + "?v=" + lastChangedDateTime.Ticks;

                HttpRuntime.Cache.Insert(rootRelativePath, versionedUrl, new CacheDependency(absolutePath));
            }

            return HttpRuntime.Cache[rootRelativePath] as string;
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 2016-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多