ASP.NET捆绑如何禁用缩小

我在我的web.config(s) debug="true" ,我只是不希望我的包缩小,但我没有做任何事情似乎禁用它。 我试过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)) 

如果在web.config中debug="true" ,并使用Scripts/Styles.Render引用页面中的包,则应closures捆绑和缩小。 EnableOptimizations = false将始终同时closures捆绑和缩小(不考虑debugging真/假标志)。

你可能没有使用Scripts/Styles.Render助手? 如果您通过BundleTable.Bundles.ResolveBundleUrl()直接渲染对包的引用,则您将始终获取缩小/捆绑的内容。

有条件的汇编指令是你的朋友:

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

要禁用捆绑和缩小只需把这个.aspx文件(这将禁用优化,即使在web.config中 debug=true

vb.net:

 System.Web.Optimization.BundleTable.EnableOptimizations = false 

C#.NET

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

如果将EnableOptimizations = true则即使在web.config中 debug=true ,也会将其捆绑并缩小

您可以简单地通过清除变换来closures捆绑包中的缩小。

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

我个人发现这个很有用,当想要将所有脚本绑定到单个文件中,但在debugging阶段需要可读性。

我尝试了很多这些build议,但注意到似乎工作。 我浪费了好几个小时才发现这是我的错误:

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

无论我尝试什么,它总是让我缩小和捆绑javascript。 相反,我应该使用这个:

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

额外的'〜'做到了。 我甚至只在一个实例中再次删除它,看看是否是真的。 那是……我希望至less能救一个人浪费在这个时间上的时间。

结合几个答案,这在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 

还有一些简单的方法来手动控制缩小(和其他function)。 这是新的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)风格,这些风格正在你的脚下(对浏览器提出过多的请求),但是你想保持自己的风格。 (与JavaScript相同)。

在这个问题上,我结合了其他人提出的一些答案,来提出另一种解决办法。

目标:要始终捆绑文件,在<compilation debug="true" ... />的情况下禁用JS和CSS缩小,并始终将自定义转换应用于CSS包。

我的解决scheme

1)在web.config中<compilation debug="true" ... />

2)在Global.asax 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. Ie 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. Eg 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())); ... } 

只是为了补充已经给出的答案,如果你还不想缩小/混淆/连接一些文件,同时仍然允许完整的捆绑和缩小其他文件 ,最好的select是去一个自定义的渲染器,它将读取一个特定的包的内容(s)并呈现页面中的文件,而不是呈现该包的虚拟path。 我个人要求这样做,因为即使在缩小closures的情况下 ,我的CSS文件也被捆绑了所以IE 9是$ *%@床​​。

非常感谢这篇文章 ,它给了我用于创buildCSS渲染器的代码的起点,该渲染器将渲染CSS的文件,但仍允许系统渲染捆绑/缩小/模糊处理的JavaScript文件。

创build了静态帮助器类:

 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文件创build一个可选的渲染器也不需要更新到这个帮助器。

如果将以下属性设置为false,则会禁用绑定和缩小。

在Global.asax.cs中

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

如果您使用的是LESS / SASS CSS转换,那么有一个选项useNativeMinification可以设置为false来禁用缩小(在web.config中)。 为了我的目的,我只是在需要时将其更改,但是可以使用web.config转换始终在发布版本上启用它,或者可能find修改代码的方法。

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

提示:其中的重点是查看您的CSS,您可以在浏览器检查工具中或通过打开文件来进行查看。 启用捆绑时,每个编译的文件名都会改变,所以我把下面的内容放在页面的顶部,这样我就可以在每次更改时在一个新的浏览器窗口中查看编译好的CSS。

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

这将是一个像https://example.com/Content/css/bundlename?v=UGd0FjvFJz3ETxlNN9NVqNOeYMRrOkQAkYtB04KisCQ1


更新:我创build了一个web.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.configweb.Debug.configweb.Release.config 。 在web.release.config你会发现这行:

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

这似乎覆盖了我所做的任何内联更改。 我评论了这一行,我们是肉汁(在“发布”版本中看到非缩小的代码)

以下是如何在每个包的基础上禁用缩小的方法:

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

旁注:用于捆绑的path不能与已发布的构build中的任何实际path重合,否则将不起作用。 还要确保避免使用.js,.css和/或'。' 和“_”在捆绑的名字的任何地方。 保持这个名字尽可能简单和直接,就像上面的例子。

帮手类如下所示。 请注意,为了使这些类面向未来,我们通过外科手术删除js / css缩小实例,而不是使用.clear(),并且插入一个mime-type-setter转换,没有这个转换,生成的版本将会遇到麻烦,尤其是当它来正确地交付CSS的捆绑(火狐和铬拒绝与MIMEtypes设置为“文本/ HTML”,这是默认的)CSS套:

 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.AspNet.Web.Optimization 1.1.3+

而你的web.config应该像下面这样丰富:

 <runtime> [...] <dependentAssembly> <assemblyIdentity name="System.Web.Optimization" publicKeyToken="31bf3856ad364e35" /> <bindingRedirect oldVersion="1.0.0.0-xyzt" newVersion="xyzt" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-xyzt" newVersion="xyzt" /> </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捆绑在字体等方面的工作。但这是一个不同的故事。