Приложение ASP.NET MVC 4 с пакетированием и минимизацией, почему минимизация включена в режиме отладки?

Я только что перенес проект ASP.NET MVC 3 в MVC 4/.NET 4.0 и установил пакет NuGet Microsoft.AspNet.Web.Optimization для поддержки связывания и минимизации CSS и JavaScript. У меня в значительной степени работает связывание/минимизация, проблема в том, что оно всегда включено. Несмотря на то, что приложение находится в режиме отладки, как настроено в Web.config, все включения JavaScript минимизированы. Как видно из приведенного ниже фрагмента XML, в 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 и смог убедиться, что CSS/JavaScript не минимизируется в режиме отладки для этого проекта.

ИЗМЕНИТЬ:

В моем файле _Layout.cshtml я отображаю стили/скрипты следующим образом:

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

Благодаря Хао я понял, что забыл добавить к именам пакетов префикс «~/».


person aknuds1    schedule 14.08.2012    source источник
comment
Этот вопрос может быть полезен. Как отключить Javascript/CSS минификация в ASP.NET MVC 4   -  person jrummell    schedule 14.08.2012
comment
@jrummell Похоже, что ответы на этот вопрос касаются безусловного отключения минимизации? Я просто хочу, чтобы стандартная условная минимизация работала.   -  person aknuds1    schedule 14.08.2012


Ответы (2)


Красный флаг связан с тегами ссылки/скрипта, отображаемыми в вашем HTML:

Они должны содержать хэш-код версии, если вы используете Script/Style.Render, т.е.

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

Чтобы получить поведение отладки/выпуска, которое используют шаблоны MVC4, вы также должны использовать методы Script/Style.Render. При вызове этих методов вы должны передать виртуальные пути пакетов, в вашем примере:

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

В режиме отладки вы не должны получать теги ссылок/скриптов, указывающие на пакет (который всегда будет минимизирован/связан). Вместо этого вы должны получать теги script/link для отдельных ресурсов в режиме отладки.

person Hao Kung    schedule 14.08.2012
comment
Спасибо за это. Но не должен ли @Scripts.Render(...) генерировать исключение, если не указан виртуальный путь? Когда вы захотите написать @Scripts.Render(/bundles/jquery), то есть без ~? - person Noel Abrahams; 29.10.2012
comment
Это не ограничивается пакетными URL-адресами, они также будут отображать теги script/link для произвольных URL-адресов (как относительных, так и абсолютных). Идея в более долгосрочной перспективе заключалась в том, чтобы эти помощники занимались управлением активами в целом, а не просто помощниками для конкретных пакетов. - person Hao Kung; 29.10.2012
comment
Хорошо, спасибо за уточнение. Но сегодня мы потеряли полдня, потому что кто-то забыл поставить ~. - person Noel Abrahams; 29.10.2012
comment
@HaoKung, не могли бы вы изучить эту проблему: заголовок stackoverflow.com/questions/16834384/ - person Oxon; 18.09.2013

У меня только что это произошло в новом проекте ASP.NET MVC. У меня было установлено значение true для <compilation debug="true" targetFramework="4.5.1" /> в web.config, и я все еще получал минимизированный вывод.

Исправление

В 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 и прочтите раздел Управление связыванием и минификацией (примерно до середины статьи).

person Kevin LaBranche    schedule 10.10.2014
comment
Это было проблемой для меня, кажется, что шаблон по умолчанию для BundleConfig.cs со временем где-то изменился. Я уверен, что никогда не был там - person ScottGuymer; 21.01.2015