Bundler不包括.min文件

我有一个奇怪的问题与mvc4打包机不包括扩展名为.min.js的文件

在我的BundleConfig类中,我声明

public static void RegisterBundles(BundleCollection bundles) { bundles.Add(new ScriptBundle("~/Scripts/jquery") .Include("~/Scripts/jquery-1.8.0.js") .Include("~/Scripts/jquery.tmpl.min.js")); } 

我认为,我宣布

 <html> <head> @Scripts.Render("~/Scripts/jquery") </head><body>test</body> </html> 

当它呈现时,它只呈现

 <html> <head> <script src="/Scripts/jquery-1.8.0.js"></script> </head> <body>test</body> </html> 

如果我将jquery.tmpl.min.js重命名为jquery.tmpl.js(并相应地更新包中的path),则两个脚本都将正确呈现。

是否有一些configuration设置导致它忽略“.min.js”文件?

我最初发布的解决scheme是可疑的(是一个肮脏的黑客)。 Microsoft.AspNet.Web.Optimization包中的调整行为已经发生了变化,正如很多评论者所指出的那样,调整已经不起作用了。 现在我根本不能用1.1.3的版本来重现这个问题。

请参阅System.Web.Optimization.BundleCollection的源代码(例如,您可以使用dotPeek )以更好地理解您将要执行的操作。 还请阅读Max Shmelev的回答 。

原始答案

将.min.js重命名为.js或执行类似操作

  public static void AddDefaultIgnorePatterns(IgnoreList ignoreList) { if (ignoreList == null) throw new ArgumentNullException("ignoreList"); ignoreList.Ignore("*.intellisense.js"); ignoreList.Ignore("*-vsdoc.js"); ignoreList.Ignore("*.debug.js", OptimizationMode.WhenEnabled); //ignoreList.Ignore("*.min.js", OptimizationMode.WhenDisabled); ignoreList.Ignore("*.min.css", OptimizationMode.WhenDisabled); } public static void RegisterBundles(BundleCollection bundles) { bundles.IgnoreList.Clear(); AddDefaultIgnorePatterns(bundles.IgnoreList); //NOTE: it's bundles.DirectoryFilter in Microsoft.AspNet.Web.Optimization.1.1.3 and not bundles.IgnoreList //...your code } 

微软暗示以下行为(我更喜欢在我的项目中遵循):

短版

  1. 在同一个文件夹下,您的项目中既有debugging版本,也有缩小版本的脚本:
    • 的script.js
    • script.min.js
  2. 您只能将script.js添加到代码中的包中。

因此,您将自动script.js包含在DEBUG模式下,并将script.min.js包含RELEASE模式下。

长版

你也可以有.debug.js版本。 在这种情况下,在DEBUG中文件被包含在以下优先级中:

  1. script.debug.js
  2. 的script.js

在发布:

  1. script.min.js
  2. 的script.js

注意

顺便说一句,在MVC4中有一个.min版本的脚本的唯一原因是缩小版本不能自动处理的情况。 例如下面的代码不能自动混淆:

 if (DEBUG) console.log("Debug message"); 

在所有其他情况下,您可以只使用脚本的debugging版本。

如果你只有一个文件的缩小版本,我find的最简单的解决scheme是复制缩小文件,从复制文件的名称中删除.min,然后引用你的包中的非缩小文件名。

例如,假设您购买了一个js组件,并且他们给了您一个名为some-lib-3.2.1.min.js的文件。 要在一个包中使用此文件,请执行以下操作:

  1. 复制some-lib-3.2.1.min.js并将复制的文件重命名为some-lib-3.2.1.js。 在你的项目中包含这两个文件。

  2. 引用您的包中的非缩小文件,如下所示:

     bundles.Add(new ScriptBundle("~/bundles/libraries").Include( "~/Scripts/some-lib-{version}.js" )); 

只是因为名称中没有“min”的文件实际上被缩小了,不应该引起任何问题(除了基本上不可读的事实之外)。 它只用于debugging模式,并作为一个单独的脚本写出来。 当不在debugging模式时,预编译的min文件应该包含在你的包中。

我发现了一个很好的解决scheme,至less在MVC5中,你可以使用Bundle而不是ScriptBundle 。 在这种情况下,它不具有我们不喜欢的ScriptBundle的智能行为(忽略.min等)。 在我的解决scheme中,我使用包含.min和.map文件的3d方脚本的Bundle ,并使用ScriptBundle作为我们的代码。 我没有注意到这样做的任何缺点。 为了使它以这种方式工作,您将需要添加原始文件,例如angular.js,并且它将在debugging中加载angular.js,并且将在发布模式下捆绑angular.min.js。

要呈现*.min.js文件,您必须禁用BundleTable.EnableOptimizations ,这是一个适用于所有包的全局设置。

如果只想为特定捆绑包启用优化,则可以创build自己的ScriptBundletypes,在枚举捆绑包中的文件时临时启用优化。

 public class OptimizedScriptBundle : ScriptBundle { public OptimizedScriptBundle(string virtualPath) : base(virtualPath) { } public OptimizedScriptBundle(string virtualPath, string cdnPath) : base(virtualPath, cdnPath) { } public override IEnumerable<BundleFile> EnumerateFiles(BundleContext context) { if (context.EnableOptimizations) return base.EnumerateFiles(context); try { context.EnableOptimizations = true; return base.EnumerateFiles(context); } finally { context.EnableOptimizations = false; } } } 

无论是否存在非缩小文件,都应使用OptimizedScriptBundle代替ScriptBundle以便始终使用缩小的文件。

用于ASP.NET MVC的Kendo UI的示例,它作为仅缩小文件的集合分发。

 bundles.Add(new OptimizedScriptBundle("~/bundles/kendo") .Include( "~/Scripts/kendo/kendo.all.*", "~/Scripts/kendo/kendo.aspnetmvc.*", "~/Scripts/kendo/cultures/kendo.*", "~/Scripts/kendo/messages/kendo.*")); 

对于我的情况,我使用(精彩!)Knockout.js库作为debugging/非版本:

 "~/Scripts/knockout-{Version}.js" "~/Scripts/knockout-{Version}.Debug.js" 

为了做到这一点,我在我的Bundle中包含了“Knockout- {Version} .js”(非debugging版),并获得了.debug。 js文件在debugging模式。

一个简单的方法就是将.min文件重命名为例如abc.min.css而不是将这个文件重命名为abc_min.css并将其添加到您的包中。 我知道这不是正确的做法,但只是一个临时的解决scheme。 感谢和愉快的编码。

Bundler有很多好处检查这个页面 但是

Microsoft MVC4平台考虑到每个Script或Style Bundle都至less包含缩小版本和非缩减版本(另外还有类似Debug和vsdoc的文件也可用)。 所以我们在只有这些文件中的一个的情况下遇到了麻烦。

您可以永久更改web.config文件中的debugging状态来处理输出:

 <compilation debug="false" targetFramework="4.0" /> 

看到输出的变化! 文件过滤已更改。 为了达到目的,我们必须改变忽略案例过滤,这将改变应用逻辑!

我只想保持它,直到微软得到它一起行动

尝试这个

在RegisterBundles中为Kendo创build这个包

 bundles.Add(new StyleBundle("~/Content/kendo/css").Include( "~/Content/kendo/2012.3.1121/kendo.common.min.css", "~/Content/kendo/2012.3.1121/kendo.dataviz.min.css", "~/Content/kendo/2012.3.1121/kendo.blueopal.min.css" )); 

在_Layout.cshtml把这个:

 @if (HttpContext.Current.IsDebuggingEnabled) { <link href="@Url.Content("~/Content/kendo/2012.3.1121/kendo.common.min.css")" rel="stylesheet" type="text/css" /> <link href="@Url.Content("~/Content/kendo/2012.3.1121/kendo.dataviz.min.css")" rel="stylesheet" type="text/css" /> <link href="@Url.Content("~/Content/kendo/2012.3.1121/kendo.blueopal.min.css")" rel="stylesheet" type="text/css" /> } else { @Styles.Render("~/Content/kendo/css") } 

通过这种方式,我们可以在生产环境中获得最佳的捆绑,并在Debug中获得参考

当微软修复他们的MVC 4代码时修复它