我有一个奇怪的问题与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'文件?


当前回答

如果您拥有的只是一个文件的缩小版,我发现的最简单的解决方案是复制缩小版文件,从复制的文件名中删除.min,然后在您的包中引用非缩小版文件名。

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

复制some-lib-3.2.1.min.js,并将复制的文件重命名为some-lib-3.2.1.js。在项目中包含这两个文件。 在你的bundle中引用未缩小的文件,像这样: 包。添加(新ScriptBundle(“~ /包/库”)。包括( “~ /脚本/一些自由- {version} . js” ));

仅仅因为名称中没有“min”的文件实际上被缩小了,不应该导致任何问题(除了它本质上是不可读的事实)。它只在调试模式下使用,并作为单独的脚本编写。当不在调试模式时,预编译的min文件应该包含在你的包中。

其他回答

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

如果您拥有的只是一个文件的缩小版,我发现的最简单的解决方案是复制缩小版文件,从复制的文件名中删除.min,然后在您的包中引用非缩小版文件名。

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

复制some-lib-3.2.1.min.js,并将复制的文件重命名为some-lib-3.2.1.js。在项目中包含这两个文件。 在你的bundle中引用未缩小的文件,像这样: 包。添加(新ScriptBundle(“~ /包/库”)。包括( “~ /脚本/一些自由- {version} . js” ));

仅仅因为名称中没有“min”的文件实际上被缩小了,不应该导致任何问题(除了它本质上是不可读的事实)。它只在调试模式下使用,并作为单独的脚本编写。当不在调试模式时,预编译的min文件应该包含在你的包中。

捆扎机有很多好处,看看这个页面,但是:

微软MVC4平台认为每个脚本或样式包至少都有缩小版和非缩小版(其他文件如Debug和vsdoc也可用)。在只有一个文件的情况下,我们会遇到麻烦。

您可以在web中更改调试状态。配置文件永久处理输出:

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

查看输出变化!文件过滤发生变化。为了达到这个目的,我们必须改变忽略大小写过滤,这会改变应用程序逻辑!

要呈现*.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的Kendo UI示例。NET MVC,它仅作为一个缩小文件的集合分发。

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

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

短的版本

在你的项目中,一个脚本的调试版和缩小版都在同一个文件夹下: script.js script.min.js 在代码中只向包中添加script.js。

因此,你会自动在DEBUG模式下包含script.js,在RELEASE模式下包含script.min.js。

长版本

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

script.debug.js script.js

发布:

script.min.js script.js

note

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

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

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