当我打开发布模式时,捆绑在 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

这是默认行为。

Bundling and minification is enabled or disabled by setting the value of the debug attribute in the compilation Element in the Web.config file.

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 是一个 preprocessor directives,它告诉 CLR 在存在 DEBUG 构建参数时执行该块中的操作(应该只存在在 DEBUG 模式下,尽管可以从项目属性中更改)。如果该变量不存在(释放模式或任何其他模式),那么它将执行另一个块。

默认版本 Web.config 转换删除调试属性,如下所示:

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

但是,这不会导致预期的捆绑行为发生。相反,您必须创建一个将调试属性字面上设置为 "false" 的转换,如下所示:

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

另一个可能的问题是,在 Global.asax.cs 文件中的 Application_Start() 方法中,您缺少对 BundleConfig.

的调用

例如,假设您的方法使用默认名称 RegisterBundles(BundleCollection bundles),那么在 Global.asax.cs 文件中,您需要在 Application_Start() 中添加 BundleConfig.RegisterBundles(BundleTable.Bundles);方法。

因此您的 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 = 真; }

  2. 重置 IIS

  3. 重新加载页面并检查 minify 是否有效

在我的例子中,我的解决方案中的某处正在将 "BundleTable.EnableOptimizations" 从 true 更改为 false。当我在使用捆绑包之前将其强制为 TRUE 时,我开始工作了。

在我注意到它有效后,我将它移到了我的 BundleConfig class:

的一个静态方法中
public static void EnableOptimizations()
{
    #if DEBUG
        BundleTable.EnableOptimizations = false;
    #else
        BundleTable.EnableOptimizations = true;
    #endif
}

所以我可以从视图中调用它并为开发人员禁用它缩小

@{
    BundleConfig.EnableOptimizations();
}
<compilation debug="true" targetFramework="4.5.2" />

解决我的问题。 发布时我的网络配置中缺少 debug=true

确保您的 BundleConfig 中没有任何缩小文件 class, 例如 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 文件,请确保您正在寻址正确的路径 and/or folder/file 名称。

就我而言,我正在寻址的一些文件实际上丢失了,有些在寻址时有错字。更正这些东西后,捆绑包应该可以正常工作。

最后,如果您通过 CSS 或 JS 文件(例如 url(../../css/img/loading.gif))的相对路径进行引用,您可能希望将它们转换为绝对路径(例如 url(/Content/css/img/loading.gif))否则即使文件已成功捆绑,它们也不会工作或呈现。包中的相对路径从浏览器的角度显示差异。