不包括 .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(并相应地更新捆绑包中的路径),则两个脚本都会正确呈现。

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


答案 1

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

答案 2

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

简短版

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

因此,您将自动脚本包含在 DEBUG 模式中.js,并将 script.min.js 包含在发布模式中。

长版

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

  1. script.debug.js
  2. 脚本.js

发布中:

  1. script.min.js
  2. 脚本.js

注意

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

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

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