Bundler不包括.min文件

时间:2012-08-16 03:46:49

标签: c# javascript asp.net-mvc-4 bundling-and-minification

我有一个奇怪的问题,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(并相应地更新bundle中的路径),则两个脚本都会正确呈现。

是否有一些配置设置导致它忽略'.min.js'文件?

8 个答案:

答案 0 :(得分:255)

我最初发布的解决方案值得怀疑(是一个肮脏的黑客)。正如许多评论者所指出的那样,在Microsoft.AspNet.Web.Optimization包中调整的行为已经改变,调整不再起作用了。现在我无法使用软件包的1.1.3版重现该问题。

请参阅System.Web.Optimization.BundleCollection的来源(例如,您可以使用dotPeek)以更好地了解您将要执行的操作。 另请阅读Max Shmelev's answer

原始回答

将.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 :(得分:176)

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

短版

  1. 您在同一文件夹下的项目中同时具有调试和缩小版本的脚本:
    • 的script.js
    • script.min.js
  2. 您只需将 script.js 添加到代码中的捆绑包中。
  3. 因此,自动 DEBUG 模式和 script.min.js 中包含 script.js strong>在 RELEASE 模式下。

    长版

    您还可以拥有 .debug.js 版本。在这种情况下,该文件包含在DEBUG中的以下优先级中:

    1. script.debug.js
    2. 的script.js
    3. 在RELEASE中

      1. script.min.js
      2. 的script.js
      3. 注释

        顺便说一句,在MVC4中拥有 .min 版本的脚本的唯一原因是当缩小版本无法自动处理时。例如,以下代码无法自动进行模糊处理:

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

        在所有其他情况下,您只需使用脚本的调试版本。

答案 2 :(得分:5)

如果您拥有的只是文件的缩小版本,我找到的最简单的解决方案是复制缩小的文件,从复制的文件名中删除.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"
    ));
    
  3. 仅仅因为名称中没有'min'的文件实际上缩小了不应该引起任何问题(除了它本质上是不可读的事实)。它仅用于调试模式,并作为单独的脚本写出。当不处于调试模式时,预编译的min文件应该包含在您的包中。

答案 3 :(得分:3)

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

如果您只想为特定捆绑包启用优化,则可以创建自己的ScriptBundle类型,在枚举捆绑包中的文件时暂时启用优化。

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.*"));

答案 4 :(得分:2)

对于我的情况,我使用的是(精彩!)Knockout.js库,它来自Debug / Non版本:

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

为了完成这项工作,我在我的Bundle中包含了“Knockout- {Version} .js”(非调试)并得到了.debug。调试模式下的js文件。

答案 5 :(得分:1)

一种简单的方法只需重命名.min文件,例如你有abc.min.css而不是将此文件重命名为abc_min.css并将其添加到您的包中。我知道这不是正确的方法,而只是一个临时的解决方案。谢谢,快乐的编码。

答案 6 :(得分:0)

Bundler有很多好处check this page 但是

Microsoft MVC4平台认为您至少拥有缩小版本和版本。每个脚本或样式包的未经编辑的版本(另一个文件,如Debug和vsdoc也可用)。所以我们在只有这些文件中的一个的情况下遇到麻烦。

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

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

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

答案 7 :(得分:-21)

民间 我会保持简单,直到微软让它一起行动

试试这个

在RegisterBundles中为Kendo创建此捆绑包

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

这样我们就可以在Production中获得最佳的bundle和Debug

中的引用

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