簡體   English   中英

如何在ASP.NET MVC 4 Beta中禁用Javascript / CSS縮小

[英]How to disable Javascript/CSS minification in ASP.NET MVC 4 Beta

我只是嘗試ASP.NET MVC 4,但我無法弄清楚如何禁用Javascript / CSS縮小功能。 特別是對於開發環境,這將有助於調試。 我想這將是web.config中的一個開關,但由於ASP.NET MVC 4目前仍處於測試階段,因此實際上沒有太多信息。 如果有人可以幫助或指向正確的博客文章等,將不勝感激。

在Global.asax.cs中

#if DEBUG
        foreach (var bundle in BundleTable.Bundles)
        {
            bundle.Transform = new NoTransform();
        }
#endif

另一種選擇是創建一個HTML Helper,您可以使用它來構建腳本和鏈接標記。 這是我為Javascript實現的,也可以為CSS完成:

public static class BundleHelper
    {
        public static MvcHtmlString JsBundle(this HtmlHelper helper, string bundlePath)
        {
            var jsTag = new TagBuilder("script");
            jsTag.MergeAttribute("type", "text/javascript");

            return ReferenceBundle(helper, bundlePath, jsTag);
        }

        public static MvcHtmlString ReferenceBundle(this HtmlHelper helper, string bundlePath, TagBuilder baseTag)
        {
            var httpContext = helper.ViewContext.HttpContext;
            var urlHelper = new UrlHelper(helper.ViewContext.RequestContext);

            Bundle bundle = BundleTable.Bundles.GetBundleFor(bundlePath);
            var htmlString = new StringBuilder();

            if (bundle != null)
            {
                var bundleContext = new BundleContext(helper.ViewContext.HttpContext, BundleTable.Bundles, urlHelper.Content(bundlePath));

                if (!httpContext.IsDebuggingEnabled)
                {
                    baseTag.MergeAttribute("href", System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl(bundlePath));
                    return new MvcHtmlString(baseTag.ToString());
                }

                foreach (var file in bundle.EnumerateFiles(bundleContext))
                {
                    var basePath = httpContext.Server.MapPath("~/");
                    if (file.FullName.StartsWith(basePath))
                    {
                        var relPath = urlHelper.Content("~/" + file.FullName.Substring(basePath.Length));
                        baseTag.MergeAttribute("href", relPath, true);
                        htmlString.AppendLine(baseTag.ToString());
                    }
                }

            }

            return new MvcHtmlString(htmlString.ToString());
        }
    }

現在您需要做的就是在您的視圖中調用它:

<head>
    <meta charset="utf-8" />
    <title>@ViewBag.Title - My ASP.NET MVC Application</title>
    <link href="~/favicon.ico" rel="shortcut icon" type="image/x-icon" />
    <link href="~/Content/css" rel="stylesheet" type="text/css" />
    <link href="~/Content/themes/base/css" rel="stylesheet" type="text/css" />
    @Html.JsBundle("~/scripts/js")
    <meta name="viewport" content="width=device-width" />
</head>

它會將腳本呈現為單獨的引用,或者使用新的捆綁/縮小功能,具體取決於web.config中的調試設置。 如果您想查看更多示例,我在創建助手時使用了http://codecutout.com/resource-minify-bundling中的一些代碼作為參考。 他們的助手寫得好一點,在提供無效參數時拋出異常等等......我還沒有去清理我的。

您可以在Global.asax中注冊自己的包,如果不希望縮小內容,可以使用NoTransform類。

我個人不希望我的劇本完全改變。 我只是創建了兩個腳本目錄。 一個是調試腳本版本,一個是最初下載的縮小版本。

MVC 4開箱即用的minifier(JsMinify)打破了jQuery 1.7.1 for Opera,所以我不想使用那個。 我只是將以下幾行放在我的Global.asaxApplication_Start()方法中:

Bundle debugScripts = new Bundle("~/DebugScripts", 
    new NoTransform("text/javascript"));
debugScripts.AddDirectory("~/Scripts/Debug", "*.js");
BundleTable.Bundles.Add(debugScripts);

Bundle productionScripts = new Bundle("~/ProductionScripts", 
    new NoTransform("text/javascript"));
productionScripts.AddDirectory("~/Scripts/Minified", "*.js");
BundleTable.Bundles.Add(productionScripts);

有了這個,我可以在我的_layouts.cshtml添加兩行中的任何一行:

<script src="@System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl("~/DebugScripts")" type="text/javascript"></script>
<script src="@System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl("~/ProductionScripts")" type="text/javascript"></script>

當然,我們可以通過這種方式獲得更多時髦。 我們只能生成一個捆綁包,並根據構建的類型選擇要包含的文件。

在較新版本的ASP.NET MVC上添加

#if DEBUG
            foreach (var bundle in BundleTable.Bundles)
            {
                bundle.Transforms.Clear();
            }
#endif

之后

BundleConfig.RegisterBundles(...);

在Global.asax中調用EnableDefaultBundles()之后,你可以這樣做......

        if ( ... running in development environment ...)
        {
            var registeredBundles = BundleTable.Bundles.GetRegisteredBundles();
            foreach (var bundle in registeredBundles)
            {
                if (bundle.Transform is System.Web.Optimization.JsMinify)
                    bundle.Transform = new NoTransform();
            }
        }

不漂亮(修改系統設置的狀態),但是代碼比所有其他建議少得多,仍然允許您使用標准捆綁行為,並且不會對您的視圖進行任何更改。

你可以從配置中關閉它:

<system.web>
    <compilation debug="true" />
    <!-- Lines removed for clarity. -->
</system.web>

http://www.asp.net/mvc/tutorials/mvc-4/bundling-and-minification

可以改為使用接口,而不是替換JsMinify和CssMinify的實例。 此選項在早期版本中不可用,因為第二個構造函數參數是類型而不是接口。

IBundleTransform jsTransform;
IBundleTransform cssTransform;

#if DEBUG
    jsTransform = new NoTransform("text/javascript");
    cssTransform = new NoTransform("text/css");
#else
    jsTransform = new JsMinify();
    cssTransform = new CssMinify();
#endif

Bundle jsBundle = new Bundle("~/JsB", jsTransform);
Bundle cssBundle = new Bundle("~/CssB", cssTransform);

也許值得注意的是,對於帶有縮小和非縮小版本(例如jQuery)的腳本,可以使用輔助方法可選地去除DEBUG構建的“.min”以便於調試:

private string Min(string scriptNameIncludingMin)
{
#if DEBUG
    return scriptNameIncludingMin.Replace(".min", ""); // Remove .min from debug builds
#else
    return scriptNameIncludingMin;
#endif
}

// ...
jsBundle.AddFile(Min("~/Scripts/jquery-1.7.2.min.js"));

我認為這是正確的,如果這種功能可以“開箱即用”。

我在UserVoice.com上發布了反饋: http//aspnet.uservoice.com/forums/41201-asp-net-mvc/suggestions/2702000-improve-system-web-optimization-bundle

給它你的“聲音”。

另一種選擇(使用v1.1.0.0和MVC5測試):

public class BundleConfig
{
    public static void Register()
    {
        ScriptBundle jsBundle = new ScriptBundle("~/Scripts/myscript.min.js");
        jsBundle.Include("~/Scripts/myscript.js");
        DisableInDebugMode(jsBundle);

        BundleTable.Bundles.Add(jsBundle);
    }

    private static void DisableInDebugMode(ScriptBundle jsBundle)
    {
    #if DEBUG
        // Don't minify in debug mode
        jsBundle.Transforms.Clear();
    #endif
    }
}

嘗試System.Web.Optimization的新擴展 - Bundle Transformer 在Bundle Transformer中實現了許多簡化調試的機會(參見文檔 )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM