具有捆绑和缩小功能的 ASP.NET MVC 4 应用程序,为啥在调试模式下启用缩小?

Posted

技术标签:

【中文标题】具有捆绑和缩小功能的 ASP.NET MVC 4 应用程序,为啥在调试模式下启用缩小?【英文标题】:ASP.NET MVC 4 app with bundling and minification, why is minification enabled in debug mode?具有捆绑和缩小功能的 ASP.NET MVC 4 应用程序,为什么在调试模式下启用缩小? 【发布时间】:2012-08-10 18:08:32 【问题描述】:

我刚刚将一个 ASP.NET MVC 3 项目迁移到 MVC 4 / .NET 4.0,并安装了 NuGet 包 Microsoft.AspNet.Web.Optimization 以支持捆绑和缩小 CSS 和 javascript。我几乎可以进行捆绑/缩小工作,问题是它总是启用。即使应用程序处于调试模式(如 Web.config 中配置的那样),所有 JavaScript 包含的内容都会被缩小。从下面的 XML sn-p 可以看出,在 Web.config 中启用了调试模式:

<system.web>
  <compilation debug="true" targetFramework="4.0">
    ...
  </compilation>
  ...
</system.web>

我的捆绑配置摘录:

public class BundleConfig

    public static void RegisterBundles(BundleCollection bundles)
    
        ...

        bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
                    "~/Scripts/jquery-1.*",
                    "~/Scripts/jquery.form.js",
                    "~/Scripts/jquery.format.js"));

        bundles.Add(new StyleBundle("~/Content/css").Include(
            "~/Content/Site.css"));

        ...
    

CSS/JavaScript 包含在 html 中呈现,例如:

<link href="/content/css" rel="stylesheet" type="text/css">
<script src="/bundles/jquery" type="text/javascript"></script>

有没有人知道为什么在我的案例中启用了缩小功能?我不知道我在这里缺少什么。为了解决问题,我创建了一个测试 ASP.NET MVC 4 Internet 应用程序,并且可以验证 CSS/JavaScript 是否没有在该项目的调试模式下被缩小。

编辑:

在我的 _Layout.cshtml 文件中,我像这样渲染样式/脚本:

@Styles.Render("content/css")
@Scripts.Render("bundles/jquery")

感谢 Hao,我意识到我忘记在包名称前加上“~/”。

【问题讨论】:

这个问题可能会有所帮助。 How to disable Javascript/CSS minification in ASP.NET MVC 4 @jrummell 这个问题的答案似乎是无条件地禁用缩小?我只想让标准条件缩小工作。 【参考方案1】:

我刚刚在一个全新的 ASP.NET MVC 项目中遇到了这种情况。我在 web.config 中将 &lt;compilation debug="true" targetFramework="4.5.1" /&gt; 设置为 true 并且仍然得到缩小的输出。

修复

BundleConfig.cs(在 App_Start 中)底部有一行 BundleTable.EnableOptimizations = true;,它覆盖了我的 web.config 设置......

删除该行和/或将其设置为 false,然后我的脚本就可以在调试环境中根据需要进行未缩小/未捆绑。

我建议删除该行,因为这将覆盖 web.config。在 web.config 中设置此项具有使用 web.config 转换的优势,因此您可以创建不同的设置以部署到不同的环境。

有关这方面的更多信息,请参阅 http://www.asp.net/mvc/tutorials/mvc-4/bundling-and-minification 并阅读控制捆绑和缩小部分(大约在文章的一半处)。

【讨论】:

这对我来说是个问题,似乎 BundleConfig.cs 的默认模板随着时间的推移发生了变化。我敢肯定,以前从来没有在那里【参考方案2】:

危险信号是 HTML 中呈现的链接/脚本标签:

如果您使用的是 Script/Style.Render,这些应该包含版本哈希码,即

< script src="/bundles/jquery?v=wvLq7H7qEZB2giyIRn7aEZAxhHOb2RfTYYh2HMd9EqM1"/>

要获得 MVC4 模板正在使用的调试/发布行为,您还必须使用 Script/Style.Render 方法。调用这些方法时,您必须传递虚拟包路径,在您的示例中:

@Styles.Render("~/content/css")
@Scripts.Render("~/bundles/jquery")

在调试模式下,您不应该让链接/脚本标签指向捆绑包(它将始终被缩小/捆绑)。相反,您应该在调试模式下获取各个资源的脚本/链接标签。

【讨论】:

谢谢。但是如果没有给定虚拟路径,@Scripts.Render(...) 不应该抛出异常吗?你什么时候想写 @Scripts.Render("/bundles/jquery") 即没有“~”? 它不仅限于捆绑网址,它们还将脚本/链接标签呈现到任意网址(相对和绝对)。长期的想法是让这些助手处理一般的资产管理,而不仅仅是捆绑特定的助手。 好的,感谢您的澄清。但是今天我们浪费了半天,因为有人忘记输入“~”。 @HaoKung 你介意调查一下这个问题吗:***.com/questions/16834384/…

以上是关于具有捆绑和缩小功能的 ASP.NET MVC 4 应用程序,为啥在调试模式下启用缩小?的主要内容,如果未能解决你的问题,请参考以下文章

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

如何在 ASP.NET MVC 中集成 AngularJS

如何在 ASP.NET MVC 中集成 AngularJS

捆绑包未在 ASP.NET MVC 4 中加载

在没有npm的情况下在ASP.NET MVC 5中生成javascript包

asp.net mvc 应用Bundle(捆绑和微小)压缩技术 启用 BundleConfig 配置web.config