簡體   English   中英

當我打開發布模式時,捆綁在 MVC5 中不起作用

[英]Bundling not working in MVC5 when I turn on release mode

我在 BundleConfig.cs 中配置了以下捆綁包:

bundles.Add(new StyleBundle("~/bundles/css").Include(
                      "~/assets/bootstrap/css/bootstrap.css",
                      "~/assets/css/global/all.css"));

我使用以下內容引用它:

@Styles.Render("~/bundles/css")

當我處於調試模式(web.config 編譯debug="true" )時,它按預期工作,因為它將兩個 css 文件都呈現為正常,即:

<link href="/assets/bootstrap/css/bootstrap.css" rel="stylesheet"/>
<link href="/assets/css/global/all.css" rel="stylesheet"/>

但是,當我設置debug="false"時,仍然會出現上述行為,因為它確實識別了文件,但是它只是將它們呈現為正常。

為了確認捆綁絕對可以工作,我在 BundleConfig 中啟用了優化,即BundleTable.EnableOptimizations = true;

每當我執行上述操作時,它都會捆綁 css 並按預期顯示,即:

<link href="/bundles/css?v=WBKHkZAJly7jUzHrVDT8SwfaQE-CA9dbOUQUlLKadNE1" rel="stylesheet"/>

編輯:

一些人提到將以下代碼添加到我的 BundleConfig.cs 文件將實現我所追求的:

#if DEBUG
            BundleTable.EnableOptimizations = false;
#else
            BundleTable.EnableOptimizations = true;
#endif

我理解並欣賞這種響應,但是根據文檔,MVC 捆綁的默認行為是在發布模式下捆綁,而不是在調試模式下捆綁。 我不明白為什么我應該添加額外的代碼來讓它在它應該已經這樣做的時候做到這一點。

編輯 2

我要坦白。 事實證明,我打開了 Views 文件夾中的 web.config,而不是主 web.config。 我更改了主 web.config 中的設置,這對我來說很好。 我責怪 ReSharper

這是默認行為。

通過在 Web.config 文件的編譯元素中設置調試屬性的值來啟用或禁用捆綁和縮小。

http://www.asp.net/mvc/overview/performance/bundling-and-minification

在此處輸入圖像描述

我解決這個問題的方法是在BundleConfig中強制它完全按照我想要的方式執行。 我不認為 MVC4 與配置文件有相同的選項(或者我只是從來沒有讓它們工作)。

所以這就是我在 RegisterBundles 方法結束時所擁有的:

#if DEBUG
BundleTable.EnableOptimizations = false;
#else
BundleTable.EnableOptimizations = true;
#endif

這樣它就一直在那里,一目了然。 但是,您必須記住在啟動項目時將其放在那里,但這並不是什么大不了的事。

如果您不熟悉這些, #if DEBUG是一個預處理器指令,它告訴 CLR 在存在 DEBUG 構建參數時執行該塊中的內容(應該只在 DEBUG 模式下存在,盡管可以從項目屬性)。 如果該變量不存在(發布模式或任何其他模式),那么它將執行另一個塊。

默認的 Release Web.config 轉換會刪除調試屬性,如下所示:

<compilation xdt:Transform="RemoveAttributes(debug)" />

但是,這不會導致發生預期的捆綁行為。 相反,您必須創建一個將調試屬性設置為“false”的轉換,如下所示:

<compilation debug="false" xdt:Transform="SetAttributes" />

另一個可能的問題是,在Application_Start()方法中的Global.asax.cs文件中,您缺少對BundleConfig的調用。

例如,假設您的方法使用默認名稱RegisterBundles(BundleCollection bundles)然后在Global.asax.cs文件中,您需要添加BundleConfig.RegisterBundles(BundleTable.Bundles); Application_Start()方法中。

所以你的Global.asax.cs文件可能看起來像這樣:

using System;
using System.Collection.Generic;
using System.Linq;
using System.Web;
using System.Http;
using System.Mvc;
using System.Routing;
using System.Optimization;

namespace MyProject
{
    public class MvcApplication : System.Web.HttpApplication
    {
        AreaRegistration.RegisterAllAreas();

        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);

        // ** This line right below might be what you are missing **
        BundleConfig.RegisterBundles(BundleTable.Bundles);

    }
}

當我更改 css 文件夾時,我遇到了這個問題。 我的問題是我更改了 CSS 文件的 BundleConfig 文件:

BundleConfig.cs:

bundles.Add(new StyleBundle("~/Content/css").Include(
                      "~/Content/css/bootstrap.css",
   ....

包括的觀點:

@Styles.Render("~/Content/css")

由於某種原因,這沒有奏效。 'bundles' 似乎是一個關鍵字或其他東西(不確定)。 你必須這樣離開它:

bundles.Add(new StyleBundle("~/bundles/css").Include(
                      "~/Content/css/bootstrap.css", ...

意見:

...
@Styles.Render("~/bundles/css")
...

我不需要修改 'BundleTable.EnableOptimizations' 或 web.config 或其他任何東西。

希望這可以幫助某人。

在與這個問題斗爭了幾個小時之后,我建議你也試試這個:

  1. 在你正在使用你的包的視圖的最開始添加這個:

    @{ BundleTable.EnableOptimizations = true; }

  2. 重置 IIS

  3. 重新加載您的頁面並檢查縮小是否有效

在我的情況下,我的解決方案中的某個地方將“BundleTable.EnableOptimizations”從真更改為假。 當我在使用捆綁包之前強制它為 TRUE 時,我得到了這個工作。

在我注意到它有效之后,我將它移到了我的 BundleConfig 類的靜態方法中:

public static void EnableOptimizations()
{
    #if DEBUG
        BundleTable.EnableOptimizations = false;
    #else
        BundleTable.EnableOptimizations = true;
    #endif
}

所以我可以從視圖中調用它並為開發人員禁用它

@{
    BundleConfig.EnableOptimizations();
}

確保您的 BundleConfig 類中沒有任何縮小文件,例如bundles.Add(new ScriptBundle("~/bundles/bootstrap").Include("~/Scripts/js/popper.min.js"));

而是使用bundles.Add(new ScriptBundle("~/bundles/bootstrap").Include("~/Scripts/js/popper.js"));

除了所有其他回復之外,如果您仍然無法捆綁您的 CSS 和 JS 文件,請確保您正在處理正確的路徑和/或文件夾/文件名。

在我的情況下,我正在處理的一些文件實際上丟失了,有些在尋址時有拼寫錯誤。 更正這些事情后,捆綁包應該可以正常工作。

最后,如果您通過 CSS 或 JS 文件(例如url(../../css/img/loading.gif) )上的相對路徑進行引用,您可能希望將它們轉換為絕對路徑(例如url(/Content/css/img/loading.gif) ) 否則即使文件已成功捆綁,它們也不會工作或呈現。 bundle 中的相對路徑從瀏覽器的角度顯示了差異。

<compilation debug="true" targetFramework="4.5.2" />

解決我的問題。 發布時我的 Web 配置中缺少debug=true

暫無
暫無

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

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