Bundle.config запутался в отладке, выпуске и сокращении

Я прочитал эту статью http://www.asp.net/mvc/tutorials/mvc-4/bundling-and-minification, и я просто чувствую, что там не хватает контента.

Я разрабатывал проект, используя unminified javascript файлы. Однако это стало проблемой, когда я решил опубликовать свой проект на другом сервере, где bundle.config захватывает мои файлы javascript и делает то, что я никогда не знал о том, что мне нужно было протестировать мою разработку, и теперь моя dev-машина бросает все виды ошибки javascript. Итак, теперь я здесь, читая информацию о том, что bundle.config делает с минимальными файлами.

После прочтения статьи я сделал следующие предположения:

Если я настрою свой проект на режим отладки, мой проект получит все файлы javascript, которые не содержат никаких файлов "min.js".

если я установил мой проект в режим выпуска, мой проект попытается получить все мои файлы min.js, а если нет файлов min.js, то не-мин файлы будут преобразованы в мини-версию.

Основываясь на этих двух предположениях, оказывается, что я был неправильным. Переход в режим Release не делает ничего с файлами мин, он действует так же, как мой режим отладки.

Во-вторых, перейдите в файл web.config и установите значение false (ранее true):

<compilation debug="false" /> 

берет все мои файлы, которые не минимизируются и не уменьшают их, игнорируя любые файлы min, которые у меня есть! Я ничего не вижу о File.min.js, все, что я вижу, это что-то вроде: "Файл? V = dw-fikdksdm...", это прекрасно, так как это считается "связкой" и получает сведения, но почему не могу я просто посмотреть, как мои мины загружены? и что произойдет, если минимизация и связывание вызывают ошибки JavaScript? Что мне делать в этот момент? Могу ли я запретить некоторые файлы javascript не включаться в пакет и/или уменьшать?

Также я заметил, что есть пара 403 ошибок, возникающих при попытке загрузить ресурсы javascript.

Может кто-нибудь объяснить, что здесь происходит и почему это противоречит моему первоначальному предположению?

Ответ 1

Хорошо, вот несколько вещей, которые я узнал об этом:

В режиме отладки и проверьте web.config:

 <system.web>
     <compilation debug="true">

тогда все ваши javascripts будут сохранены в виртуальном каталоге пучка (они не будут объединены в один файл, и они будут не быть сокращены).

При переключении в режим деблокирования, переключитесь на:

 <system.web>
     <compilation debug="false">

чтобы все ваши файлы javascript внутри пакета были минимизированы и скомпилированы в один файл, это уменьшает округлые поездки в сеть. Обратите внимание: для каждого пакета создается один файл.

Если вы хотите включить оптимизацию независимо от того, находитесь ли вы в режиме отладки, установите BundleTable.EnableOptimizations = true, что заставляет минимизировать и связывать. Если вы оставите это вне кода, тогда BundleConfig будет искать вместо этого web.config.

RegisterBundles(BundleCollection bundles) method in BundleConfig.cs, you put in:

    BundleTable.EnableOptimizations = true;
    bundles.UseCdn = true;
    var cssTransformer = new CssTransformer();
    var jsTransformer = new JsTransformer();
    var nullOrderer = new NullOrderer();

и так вы добавляете в файлы javascript:

    var jqueryBundle = new CustomScriptBundle("~/bundles/jquery");
    jqueryBundle.IncludeDirectory("~/Scripts/JQuery", "*.js");
    jqueryBundle.Transforms.Add(jsTransformer);
    jqueryBundle.Orderer = nullOrderer;
    bundles.Add(jqueryBundle);

Примечания:

  • Bundle.config игнорирует все файлы мин. Я добавил File.min.js и File.js, и он игнорирует File.min.js, и он минимизирует File.js и связывает его с другими файлами, входящими в комплект. Я проверил, потому что, когда я сам минимизировал один из файлов, все имена переменных (а не структурированный код) по сравнению с тем, что было загружено на моем сайте, были совершенно разными, чем файл min, который я включил в проект. Таким образом, это подтверждает, что файлы min не нужны в вашем проекте.
  • Bundle.config игнорирует минимизацию любых файлов, названных так. "File.debug.js", это никогда не будет минимизировано, по сути, оно никогда не будет включено в ваш проект в выпуске. Я узнал об этом после того, как один из моих файлов javascript никогда не попадал на сайт.
  • 403 ошибки будут возникать, если вы используете "Контент/css" в качестве своего виртуального каталога, где будет отображаться ваш пакет, его нужно изменить на "bundles/css", а 403 будет уходить так (используя бритвы):

    @Styles.Render( "~/пучки/CSS" )

означает, что если у вас есть это в коде (обратите внимание, где ~/bundle/css ", это будет где ваши файлы css будут идти):

BundleTable.EnableOptimizations = true;

bundles.UseCdn = true;
var cssTransformer = new CssTransformer();
var jsTransformer = new JsTransformer();
var nullOrderer = new NullOrderer();
#region CSS Styles
var cssBundle = new CustomStyleBundle("~/bundles/css");
cssBundle.IncludeDirectory("~/Content/CSS", "*.css")
         .IncludeDirectory("~/Content/CSS/Override", "*.css");
cssBundle.Transforms.Add(cssTransformer);
cssBundle.Orderer = nullOrderer;
bundles.Add(cssBundle);
#endregion
  • Если ваш css имеет относительный путь, это также может быть изменено, поэтому найдите ошибки 404.
  • Не все мини файлы будут вести себя так, как вы хотите, чтобы они... поэтому вам придется в конечном итоге сделать полузавернутую версию (или вам не нужно вообще никого из js вообще и просто связывать)

Но если вы хотите продолжить выполнение миниатюрного javascript, и вы не знаете, какие файлы выбрасывают ошибку, следующие шаги помогут:

  • Связывание всего
  • Откройте браузер и найдите все источники вложенных мини-js
  • Копирование рабочих входящих js в другой файл
  • начните вручную вставлять javascript, используя теги вместо bundleconfig.cs, и продолжайте добавлять их один за другим, пока один не сработает. Если это не удастся, тогда вам придется использовать неминифицированную версию этого проекта
  • повторите шаг 3-4

Я хотел бы, чтобы на момент написания этой статьи была лучшая документация на bundle.config, но я нашел, что весь этот опыт был сильно разочаровывающим.