Bundler不包括.min文件

Fat*_*tal 260 javascript c# 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"));            
}
Run Code Online (Sandbox Code Playgroud)

在我看来,我宣布

<html>
    <head>
    @Scripts.Render("~/Scripts/jquery")
    </head><body>test</body>
</html>
Run Code Online (Sandbox Code Playgroud)

当它呈现时,它只会呈现

<html>
    <head>
         <script src="/Scripts/jquery-1.8.0.js"></script>
    </head>
    <body>test</body>
</html>
Run Code Online (Sandbox Code Playgroud)

如果我将jquery.tmpl.min.js重命名为jquery.tmpl.js(并相应地更新bundle中的路径),则会正确呈现这两个脚本.

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

小智 255

我最初发布的解决方案是有问题的(是一个肮脏的黑客).正如许多评论者所指出的那样,在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
     }
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很长的wtf时刻,他们可能已经添加了那些带有理由或某些结果的评论的min文件,现在整整一小时浪费,想知道谁从输出中窃取了我的脚本文件. (27认同)
  • M $,当明确指定somefile.min.js时,或仅存在.min.js文件时,则只包含.min.js文件!否则只应用当前行为! (11认同)
  • Per Fatal在OP中的评论,如果它们都存在(例如jquery),这个解决方案将最终为minified和regular版本重新引用重复引用. (5认同)
  • 也感谢我 - 所以将此添加到我的MVC4问题列表:) (4认同)
  • 令人难以置信的是,实际的类被称为"IgnoreList",但它直接来自Object.没有LINQ,没有迭代. - http://msdn.microsoft.com/en-us/library/system.web.optimization.ignorelist.aspx (3认同)
  • 我还必须添加:bundles.DirectoryFilter.Clear(); (2认同)

Max*_*lev 176

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

精简版

  1. 您在同一文件夹下的项目中有脚本的调试和缩小版本:
    • 的script.js
    • script.min.js
  2. 您只需将script.js添加到代码中的包中.

因此,您将自动拥有的script.js包含在DEBUG模式和script.min.js释放模式.

长版

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

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

在RELEASE中:

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

注意

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

if (DEBUG) console.log("Debug message");
Run Code Online (Sandbox Code Playgroud)

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

  • 不过很好的解释,OP的问题是有些脚本(`jquery.tmpl`)没有,没有附带,没有下载非文件版本的文件.如果在调试模式下没有非最小版本,则bundler会完全忽略脚本文件 (6认同)
  • 我更喜欢这个答案,因为它是一种"最佳实践"方法,并解释了如何遵循捆绑器的默认规则来实现相同的目标. (5认同)
  • user981375,您还需要在web.config文件中设置<compilation debug ="false"/> (4认同)
  • 短版本对我不起作用."script.js"将包含在这两种版本类型中.我切换了DEBUG/RELEASE和(当我查看源代码时)'script.js'是选中/渲染的那个. (2认同)

joe*_*lfp 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"
    ));
    
    Run Code Online (Sandbox Code Playgroud)

仅仅因为名称中没有'min'的文件实际上是缩小的,不应该引起任何问题(除了它本质上是不可读的事实).它仅用于调试模式,并作为单独的脚本写出.当不处于调试模式时,预编译的min文件应包含在您的包中.