将cache-buster添加到非优化捆绑包中?

时间:2014-09-17 15:55:03

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

我在MVC中使用Bundling并具有以下内容:

@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>

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:0)

这是您要寻找的深入解决方案:

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

要总结缓存破坏的内容,请创建一个实用程序方法,该方法将连接您要缓存破坏的未优化文件的文件创建时间戳。

例如

<script src="@StaticFile.Version("/js/header.js")"></script>

这将产生您想要的东西:

<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;
        }
    }
}