ASP.NET пакеты как отключить minification

Я debug="true" и web.config(s), и я просто не хочу, чтобы мои пакеты уменьшались, но ничего, что я делаю, кажется, отключает его. Я пытался enableoptimisations=false, вот мой код:

//Javascript
bundles.Add(new ScriptBundle("~/bundles/MainJS")
            .Include("~/Scripts/regular/lib/mvc/jquery.validate.unobtrusive.js*")
            .Include("~/Scripts/regular/lib/mvc/jquery.validate*")
            .Include("~/Scripts/regular/lib/bootstrap.js")
            .IncludeDirectory("~/Scripts/regular/modules", "*.js", true)
            .IncludeDirectory("~/Scripts/regular/pages", "*.js", true)
            .IncludeDirectory("~/Scripts/regular/misc", "*.js", true));

//CSS
bundles.Add(new StyleBundle("~/bundles/MainCSS")
            .Include("~/Content/css/regular/lib/bootstrap.css*")
            .IncludeDirectory("~/Content/css/regular/modules", "*.css", true)
            .IncludeDirectory("~/Content/css/regular/pages", "*.css", true))

14 ответов


если у вас debug="true" на web.config и Scripts/Styles.Render чтобы ссылаться на пакеты на ваших страницах, это должно отключить как связывание, так и минимизацию. BundleTable.EnableOptimizations = false всегда будет отключать как связывание, так и минимизацию (независимо от флага отладки true/false).

возможно, вы не используете Scripts/Styles.Render помошники? Если вы непосредственно визуализируете ссылки на пакет через BundleTable.Bundles.ResolveBundleUrl() вы всегда будете получать минифицированный / в комплекте контент.


условные директивы компиляции-ваш друг:

#if DEBUG
            var jsBundle = new Bundle("~/Scripts/js");
#else
            var jsBundle = new ScriptBundle("~/Scripts/js");
#endif

чтобы отключить связывание и минимизацию, просто поместите это свой .аспн (это отключит оптимизацию, даже если debug=true на web.config)

vb.net:

System.Web.Optimization.BundleTable.EnableOptimizations = false

c#.net

System.Web.Optimization.BundleTable.EnableOptimizations = false;

если поставить EnableOptimizations = true это будет связывать и минимизировать, даже если debug=true на web.config


вы можете отключить минимизацию в своих расслоениях, просто очистив преобразования.

var scriptBundle = new ScriptBundle("~/bundles/scriptBundle");
...
scriptBundle.Transforms.Clear();

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


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

@Scripts.Render("/bundles/foundation")

У меня всегда есть minified и в комплекте javascript, независимо от того, что я пытался. Вместо этого я должен был использовать это:

@Scripts.Render("~/bundles/foundation")

дополнительно '~' сделал это. Я даже удалил его снова только в одном случае, чтобы увидеть, действительно ли это было. Это было... надеюсь, я смогу спасти хотя бы одного человека часа я потратил на этот.


объедините несколько ответов, это работает для меня в ASP.NET MVC 4.

        bundles.Add(new ScriptBundle("~/Scripts/Common/js")
            .Include("~/Scripts/jquery-1.8.3.js")
            .Include("~/Scripts/zizhujy.com.js")
            .Include("~/Scripts/Globalize.js")
            .Include("~/Scripts/common.js")
            .Include("~/Scripts/requireLite/requireLite.js"));

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

        bundles.Add(new StyleBundle("~/Content/css/App/FunGrapherStyles")
            .Include("~/Content/css/Apps/FunGrapher.css")
            .Include("~/Content/css/tables.css"));

#if DEBUG
        foreach (var bundle in BundleTable.Bundles)
        {
            bundle.Transforms.Clear();
        }
#endif

существует также простой способ управления минимизацией (и другими функциями) вручную. Это новый CssMinify() трансформатор используя, как это:

// this is in case when BundleTable.EnableOptimizations = false;
var myBundle = new StyleBundle("~/Content/themes/base/css")
    .Include("~/Content/themes/base/jquery.ui.core.css" /* , ... and so on */);
myBundle.Transforms.Add(new CssMinify());
bundles.Add(myBundle);

// or you can remove that transformer in opposite situation
myBundle.Transforms.Clear();

это удобно, когда вы хотите иметь специальную часть некоторых пакетов только для минимизации. Предположим, вы используете некоторые стандартные стили (jQuery), которые попадают под ваши ноги (принимая много чрезмерных запросов браузера к ним), но вы хотите сохранить свою собственную таблицу стилей. (То же самое-с яваскрипт.)


Я объединил несколько ответов других в этом вопросе, чтобы придумать другое альтернативное решение.

цель: всегда связывать файлы, чтобы отключить минификацию JS и CSS в случае, если <compilation debug="true" ... /> и всегда применять пользовательское преобразование к набору CSS.

мое решение:

1) в web.config: <compilation debug="true" ... />

2) в глобальные.эйсакс событий Application_Start() метод:

 protected void Application_Start() {
     ...
     BundleTable.EnableOptimizations = true; // Force bundling to occur

     // If the compilation node in web.config indicates debugging mode is enabled
     // then clear all transforms. I.e. disable Js and CSS minification.
     if (HttpContext.Current.IsDebuggingEnabled) {
         BundleTable.Bundles.ToList().ForEach(b => b.Transforms.Clear());
     }

      // Add a custom CSS bundle transformer. In my case the transformer replaces a
      // token in the CSS file with an AppConfig value representing the website URL
      // in the current environment. E.g. www.mydevwebsite in Dev and
      // www.myprodwebsite.com in Production.
      BundleTable.Bundles.ToList()
          .FindAll(x => x.GetType() == typeof(StyleBundle))
          .ForEach(b => b.Transforms.Add(new MyStyleBundleTransformer()));
     ...
}

Если вы установите для следующего свойства значение false, он отключит как связывание, так и минимизацию.

В Глобальном.асакс.cs

protected void Application_Start()
{
    System.Web.Optimization.BundleTable.EnableOptimizations = false;
}

просто дополнить ответы уже даны, если вы хотите не minify / obfuscate / concatenate некоторые файлы, все еще позволяя полное связывание и минимизацию для других файлов лучший вариант-использовать пользовательский визуализатор, который будет считывать содержимое определенного пакета(пакетов) и отображать файлы на странице, а не виртуальный путь пакета. Я лично требовал этого, потому что IE 9 был $ * %@ING кровать, когда мои файлы CSS были в комплекте даже с minification выключен.

большое спасибо в этой статье, что дало мне отправную точку для кода, который я использовал для создания CSS-рендерера, который будет отображать файлы для CSS, но все же позволит системе отображать мои файлы javascript в комплекте/minified/obfuscated.

создан статический вспомогательный класс:

using System;
using System.Text;
using System.Web;
using System.Web.Mvc;
using System.Web.Optimization;

namespace Helpers
{
  public static class OptionalCssBundler
  {
    const string CssTemplate = "<link href=\"{0}\" rel=\"stylesheet\" type=\"text/css\" />";

    public static MvcHtmlString ResolveBundleUrl(string bundleUrl, bool bundle)
    {
      return bundle ? BundledFiles(BundleTable.Bundles.ResolveBundleUrl(bundleUrl)) : UnbundledFiles(bundleUrl);
    }

    private static MvcHtmlString BundledFiles(string bundleVirtualPath)
    {
      return new MvcHtmlString(string.Format(CssTemplate, bundleVirtualPath));
    }

    private static MvcHtmlString UnbundledFiles(string bundleUrl)
    {
      var bundle = BundleTable.Bundles.GetBundleFor(bundleUrl);

      StringBuilder sb = new StringBuilder();
      var urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext);

      foreach (BundleFile file in bundle.EnumerateFiles(new BundleContext(new HttpContextWrapper(HttpContext.Current), BundleTable.Bundles, bundleUrl)))
      {
        sb.AppendFormat(CssTemplate + Environment.NewLine, urlHelper.Content(file.VirtualFile.VirtualPath));
      }

      return new MvcHtmlString(sb.ToString());
    }

    public static MvcHtmlString Render(string bundleUrl, bool bundle)
    {
      return ResolveBundleUrl(bundleUrl, bundle);
    }
  }

}

затем в файле макета бритвы:

@OptionalCssBundler.Render("~/Content/css", false)

вместо стандарт:

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

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


вот как отключить минификацию на основе каждого пакета:

bundles.Add(new StyleBundleRaw("~/Content/foobarcss").Include("/some/path/foobar.css"));
bundles.Add(new ScriptBundleRaw("~/Bundles/foobarjs").Include("/some/path/foobar.js"));

Sidenote: пути, используемые для ваших пакетов, не должны совпадать с любым фактическим путем в ваших опубликованных сборках, иначе ничего не будет работать. Также избегайте использования .js,.CSS и/или.- и " _ " где угодно во имя свертка. Держите имя как можно более простым и понятным, как в приведенном выше примере.

вспомогательные классы показаны ниже. Обратите внимание, что для того, чтобы сделать эти классы future-proof мы хирургически удаляем экземпляры JS / css minifying вместо использования .clear (), и мы также вставляем преобразование mime-type-setter, без которого производственные сборки обязательно столкнутся с проблемами, особенно когда дело доходит до правильной передачи css-пакетов (firefox и chrome отклоняют CSS-пакеты с набором mime-type в "text/html", который по умолчанию):

internal sealed class StyleBundleRaw : StyleBundle
{
        private static readonly BundleMimeType CssContentMimeType = new BundleMimeType("text/css");

        public StyleBundleRaw(string virtualPath) : this(virtualPath, cdnPath: null)
        {
        }

        public StyleBundleRaw(string virtualPath, string cdnPath) : base(virtualPath, cdnPath)
        {
                 Transforms.Add(CssContentMimeType); //0 vital
                 Transforms.Remove(Transforms.FirstOrDefault(x => x is CssMinify)); //0
        }
        //0 the guys at redmond in their infinite wisdom plugged the mimetype "text/css" right into cssminify    upon unwiring the minifier we
        //  need to somehow reenable the cssbundle to specify its mimetype otherwise it will advertise itself as html and wont load
}

internal sealed class ScriptBundleRaw : ScriptBundle
{
        private static readonly BundleMimeType JsContentMimeType = new BundleMimeType("text/javascript");

        public ScriptBundleRaw(string virtualPath) : this(virtualPath, cdnPath: null)
        {
        }

        public ScriptBundleRaw(string virtualPath, string cdnPath) : base(virtualPath, cdnPath)
        {
                 Transforms.Add(JsContentMimeType); //0 vital
                 Transforms.Remove(Transforms.FirstOrDefault(x => x is JsMinify)); //0
        }
        //0 the guys at redmond in their infinite wisdom plugged the mimetype "text/javascript" right into jsminify   upon unwiring the minifier we need
        //  to somehow reenable the jsbundle to specify its mimetype otherwise it will advertise itself as html causing it to be become unloadable by the browsers in published production builds
}

internal sealed class BundleMimeType : IBundleTransform
{
        private readonly string _mimeType;

        public BundleMimeType(string mimeType) { _mimeType = mimeType; }

        public void Process(BundleContext context, BundleResponse response)
        {
                 if (context == null)
                          throw new ArgumentNullException(nameof(context));
                 if (response == null)
                          throw new ArgumentNullException(nameof(response));

         response.ContentType = _mimeType;
        }
}

чтобы все это работало, вам нужно установить (через nuget):

WebGrease 1.6.0+ Microsoft.сеть САШ.Сеть.Оптимизация 1.1.3+

и ваша сеть.конфигурация должна быть обогащена следующим образом:

<runtime>
       [...]
       <dependentAssembly>
        <assemblyIdentity name="System.Web.Optimization" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-x.y.z.t" newVersion="x.y.z.t" />
       </dependentAssembly>
       <dependentAssembly>
              <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-x.y.z.t" newVersion="x.y.z.t" />
       </dependentAssembly>
        [...]
</runtime>

<!-- setting mimetypes like we do right below is absolutely vital for published builds because for some reason the -->
<!-- iis servers in production environments somehow dont know how to handle otf eot and other font related files   -->
</system.webServer>
        [...]
        <staticContent>
      <!-- in case iis already has these mime types -->
      <remove fileExtension=".otf" />
      <remove fileExtension=".eot" />
      <remove fileExtension=".ttf" />
      <remove fileExtension=".woff" />
      <remove fileExtension=".woff2" />

      <mimeMap fileExtension=".otf" mimeType="font/otf" />
      <mimeMap fileExtension=".eot" mimeType="application/vnd.ms-fontobject" />
      <mimeMap fileExtension=".ttf" mimeType="application/octet-stream" />
      <mimeMap fileExtension=".woff" mimeType="application/font-woff" />
      <mimeMap fileExtension=".woff2" mimeType="application/font-woff2" />
      </staticContent>

      <!-- also vital otherwise published builds wont work  https://stackoverflow.com/a/13597128/863651  -->
      <modules runAllManagedModulesForAllRequests="true">
         <remove name="BundleModule" />
         <add name="BundleModule" type="System.Web.Optimization.BundleModule" />
      </modules>
      [...]
</system.webServer>

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


если вы используете преобразование LESS/SASS CSS, есть опция useNativeMinification который может быть установлен в false, чтобы отключить минификацию (в интернете.конфигурация.) Для моих целей я просто меняю его здесь, когда мне нужно, но вы можете использовать web.config преобразования, чтобы всегда включить его на сборке выпуска или, возможно, найти способ изменить его в коде.

<less useNativeMinification="false" ieCompat="true" strictMath="false"
      strictUnits="false" dumpLineNumbers="None">

Совет: весь смысл в том, чтобы просмотреть CSS, который вы можете сделать в браузере проверить инструменты или просто открыв файл. Когда объединение включено, что изменения имени файла на каждой компиляции, поэтому я помещаю следующее в верхней части моей страницы, чтобы я мог просматривать скомпилированный CSS eaily в новом окне браузера каждый раз, когда он изменяется.

@if (Debugger.IsAttached) 
{
    <a href="@Styles.Url(ViewBag.CSS)" target="css">View CSS</a>
}

это будет динамический URL что-то вроде https://example.com/Content/css/bundlename?v=UGd0FjvFJz3ETxlNN9NVqNOeYMRrOkQAkYtB04KisCQ1


Update: я создал веб-сайт.преобразование config, чтобы установить его в true для меня во время развертывания / выпуска build

  <bundleTransformer xmlns="http://tempuri.org/BundleTransformer.Configuration.xsd">
    <less xdt:Transform="Replace" useNativeMinification="true" ieCompat="true" strictMath="false" strictUnits="false" dumpLineNumbers="None">
      <jsEngine name="MsieJsEngine" />
    </less>
  </bundleTransformer>

Это может стать полезным для кого-то в будущем, как новая структура, при установке через VS, получает по умолчанию web.config, web.Debug.config и web.Release.config. В web.release.config вы найдете эту строку:

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

это, казалось, переопределяло любые встроенные изменения, которые я сделал. Я прокомментировал эту линию, и мы были подливы (в смысле не минифицированный код в "релиз" построить)


искать EnableOptimizations ключевое слово в вашем проекте

Так что если вы найдете

BundleTable.EnableOptimizations = true;

превратить его false.