ASP.NET пакеты как отключить минификацию
у меня есть 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.конфигурации иScripts/Styles.Render
чтобы ссылаться на пакеты на ваших страницах, это должно отключить как связывание, так и минимизацию.BundleTable.EnableOptimizations = false
всегда отключает как связывание, так и минимизацию (независимо от флага debug true/false).вы возможно не используете
Scripts/Styles.Render
помошники? Если вы непосредственно передаете ссылки на пакет черезBundleTable.Bundles.ResolveBundleUrl()
вы всегда будете получать уменьшенный/связанный контент.
директивы условной компиляции - это ваш друг:
#if DEBUG var jsBundle = new Bundle("~/Scripts/js"); #else var jsBundle = new ScriptBundle("~/Scripts/js"); #endif
чтобы отключить пакетирование и минимизацию, просто поместите это ваше .aspx (это отключит оптимизацию, даже если
debug=true
на web.конфигурации)vb.net:
System.Web.Optimization.BundleTable.EnableOptimizations = false
c#.net
System.Web.Optimization.BundleTable.EnableOptimizations = false;
если поставить
EnableOptimizations = true
это будет связывать и минимизировать, даже еслиdebug=true
на web.конфигурации
вы можете отключить минификацию в своих пакетах, просто очистив свои преобразования.
var scriptBundle = new ScriptBundle("~/bundles/scriptBundle"); ... scriptBundle.Transforms.Clear();
Я лично нашел это полезным, когда хотел объединить все мои скрипты в один файл, но необходима читаемость на этапах отладки.
Я пробовал много этих предложений, но заметив, казалось, работает. Я потратил немало часов, чтобы выяснить, что это была моя ошибка:
@Scripts.Render("/bundles/foundation")
Он всегда у меня минимизирован и в комплекте 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.конфигурации:
<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; }
просто чтобы дополнить уже данные ответы, если вы также хотите не уменьшать/запутывать / объединять некоторые файлы, все еще позволяя полную комплектацию и минимизацию для других файлов лучший вариант-использовать пользовательский рендеринг, который будет считывать содержимое определенного пакета(ов) и отображать файлы на странице, а не отображать виртуальный путь пакета. Я лично требовал этого, потому что IE 9 был $*%@ing кровать, когда мои файлы CSS были в комплекте даже при выключенной минификации.
большое спасибо в этой статье, что дало мне отправную точку для кода, который я использовал для создания рендерера CSS, который будет отображать файлы для CSS, но все же позволит системе отображать мои файлы javascript в комплекте/уменьшенные/запутанные.
создал статический вспомогательный класс:
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 и/или.- и " _ " где угодно в названии свертка. Держите имя как можно более простым и понятным, как в приведенном выше примере.
вспомогательные классы показаны ниже. Обратите внимание, что для того, чтобы сделать эти занятия в будущем мы хирургически удалить с JS/CSS на сокращение случаев вместо использования .clear () и мы также вставляем преобразование mime-type-setter, без которого производственные сборки обязательно столкнутся с проблемами, особенно когда речь заходит о правильной передаче css-пакетов (firefox и chrome отклоняют CSS-пакеты с MIME-типом, установленным в "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.преобразования конфигурации, чтобы всегда включать его при сборке выпуска или, возможно, найти способ изменить его в коде.<less useNativeMinification="false" ieCompat="true" strictMath="false" strictUnits="false" dumpLineNumbers="None">
Совет: весь смысл этого заключается в просмотре вашего CSS, который вы можете сделать в браузере inspect tools или просто открыв файл. Когда связывание включено, что изменения имени файла на каждой компиляции, поэтому я помещаю следующее в верхней части моей страницы, чтобы я мог просматривать мой скомпилированный 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
обновление: я создал веб.преобразование config, чтобы установить его в true для меня во время развертывания / сборка выпуска
<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)" />
казалось, что это переопределяет любые встроенные изменения, которые я сделал. Я прокомментировал эту линию, и мы были подливы (в смысле не минифицированный код в "релиз" построить)