200

我的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))
4

14 回答 14

168

条件编译指令是你的朋友:

#if DEBUG
            var jsBundle = new Bundle("~/Scripts/js");
#else
            var jsBundle = new ScriptBundle("~/Scripts/js");
#endif
于 2012-08-14T16:23:59.683 回答
145

如果您debug="true"web.config中使用并Scripts/Styles.Render用于引用页面中的捆绑包,则应该关闭捆绑和缩小。BundleTable.EnableOptimizations = false将始终关闭捆绑和缩小(不管调试真/假标志)。

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

于 2012-08-14T21:13:18.027 回答
91

要禁用捆绑和缩小,只需将其放入您的.aspx文件(即使debug=trueweb.config中也会禁用优化)

VB.net:

System.Web.Optimization.BundleTable.EnableOptimizations = false

c#.net

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

如果你把它放在web.configEnableOptimizations = true中,它也会捆绑和缩小debug=true

于 2012-10-17T10:29:20.007 回答
74

您可以通过清除转换来关闭捆绑包中的缩小。

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

当我想将我的所有脚本捆绑在一个文件中但在调试阶段需要可读性时,我个人发现这很有用。

于 2014-01-16T16:51:18.930 回答
29

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

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

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

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

额外的'〜'做到了。我什至仅在一个实例中再次将其删除,以查看是否确实如此。那是……希望我能节省至少一个人浪费在这上面的时间。

于 2014-05-02T19:42:03.913 回答
26

结合几个答案,这在 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
于 2014-03-18T02:19:49.180 回答
22

还有一些简单的方法可以手动控制缩小(和其他功能)。这是新的 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)。

于 2012-11-29T22:29:15.333 回答
14

我结合了其他人在这个问题中给出的一些答案,提出了另一种替代解决方案。

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

我的解决方案

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. 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()));
     ...
}
于 2014-11-05T23:43:19.003 回答
10

如果您将以下属性设置为 false,那么它将禁用捆绑和缩小。

Global.asax.cs文件中,添加如下所述的行

protected void Application_Start()
{
    System.Web.Optimization.BundleTable.EnableOptimizations = false;
}
于 2016-01-16T10:38:23.753 回答
6

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

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

旁注:用于捆绑包的路径不得与已发布版本中的任何实际路径一致,否则将无法正常工作。还要确保避免使用 .js、.css 和/或 '.' 和 '_' 包名称中的任何位置。保持名称尽可能简单明了,如上例所示。

助手类如下所示。请注意,为了使这些类面向未来,我们通过外科手术删除了 js/css 缩小实例而不是使用 .clear() 并且我们还插入了一个 mime-type-setter 转换,如果没有它,生产构建肯定会遇到麻烦,尤其是在涉及到正确移交 css 捆绑包(firefox 和 chrome 拒绝将 mime-type 设置为“text/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-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-bundle 在字体等方面工作。但这是另一回事。

于 2017-09-14T15:46:12.517 回答
6

在您的项目中搜索EnableOptimizations关键字

所以如果你发现

BundleTable.EnableOptimizations = true;

转动它false

这确实禁用了缩小,并且还完全禁用了捆绑

于 2018-05-06T06:53:37.780 回答
4

只是为了补充已经给出的答案,如果您也不想缩小/混淆/连接某些文件,同时仍然允许对其他文件进行完全捆绑和缩小,最好的选择是使用自定义渲染器,它将读取特定包的内容(s) 并呈现页面中的文件,而不是呈现包的虚拟路径。我个人需要这样做,因为即使在缩小缩小的情况下,当我的 CSS 文件被捆绑时,IE 9 也是 $*%@ing 。

非常感谢这篇文章,它给了我用于创建 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 文件创建一个可选的渲染器也几乎不需要更新到这个帮助程序。

于 2014-06-27T04:56:15.427 回答
1

如果您使用 LESS/SASS CSS 转换useNativeMinification,则可以将选项设置为 false 以禁用缩小(在 web.config 中)。出于我的目的,我只是在需要时在此处更改它,但是您可以使用 web.config 转换来始终在发布构建时启用它,或者找到一种在代码中修改它的方法。

<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>
}

这将是一个动态 URL,例如https://example.com/Content/css/bundlename?v=UGd0FjvFJz3ETxlNN9NVqNOeYMRrOkQAkYtB04KisCQ1


更新:我创建了一个 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>
于 2014-04-12T05:56:40.707 回答
1

这可能对将来的某些人有用,因为新框架在通过 VS 设置时会获得默认web.config的. 在你会发现这一行:web.Debug.configweb.Release.configweb.release.config

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

这似乎覆盖了我所做的任何内联更改。我评论了这条线,我们很高兴(就在“发布”构建中看到非缩小代码而言)

于 2016-01-20T23:02:10.880 回答