C# 捆绑程序不包括.min文件

C# 捆绑程序不包括.min文件,c#,javascript,asp.net-mvc-4,bundling-and-minification,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/j

我对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>
在我看来,我宣布

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>

@Scripts.Render(“~/Scripts/jquery”)
测试
当它渲染时,它只渲染

<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”文件?

我最初发布的解决方案有问题(是一个肮脏的黑客攻击)。正如许多评论者所指出的那样,在Microsoft.AspNet.Web.Optimization包中,经过调整的行为已经改变,并且调整不再有效。现在,我无法用软件包的1.1.3版重现这个问题

请参阅System.Web.Optimization.BundleCollection(您可以使用示例)的来源,以更好地了解您将要做的事情。 也读

原始答案

将.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
     }

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

短版
  • 项目中的脚本在同一文件夹下有调试版本和缩小版本:
    • script.js
    • script.min.js
  • 您只需在代码包中添加script.js
  • 因此,您将自动调试模式中包含script.js,在发布模式中包含script.min.js

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

  • script.debug.js
  • script.js
  • 发布中:

  • script.min.js
  • script.js
  • 笔记 顺便说一下,在MVC4中拥有.min版本的脚本的唯一原因是无法自动处理缩小的版本。例如,以下代码不能自动混淆:

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

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

    在我的情况下,我使用的是(很棒!)Knockout.js库,作为调试/非版本提供:

    "~/Scripts/knockout-{Version}.js"
    "~/Scripts/knockout-{Version}.Debug.js"
    
    为了实现这一点,我在包中包括了“Knockout-{Version}.js”(非调试),并获得了.debug。js文件处于调试模式。

    我只会简单地保留它,直到微软采取行动

    试试这个

    在RegisterBundles中为剑道创建此捆绑包

    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")   
     }
    
    @if(HttpContext.Current.IsDebuggingEnabled)
    { 
    }
    其他的
    {
    @style.Render(“~/Content/kendo/css”)
    }
    
    这样,我们可以在生产中获得最佳捆绑包,并在调试中获得参考


    当微软修复他们的MVC4代码时修复它,捆绑包有很多好处,但是:

    Microsoft MVC4平台认为,对于每个脚本或样式包,至少都有精简版本和未精简版本(还有其他文件,如Debug和vsdoc)。因此,在这些文件中只有一个的情况下,我们会遇到麻烦

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

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

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

    如果您所拥有的只是文件的缩小版本,我找到的最简单的解决方案是复制缩小的文件,从复制的文件名中删除.min,然后在包中引用未缩小的文件名

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

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

  • 引用捆绑包中未缩小的文件,如下所示:

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

  • 仅仅因为名称中没有“min”的文件实际上已缩小,就不会引起任何问题(除了它本质上不可读的事实)。它仅在调试模式下使用,并作为单独的脚本写入。当不处于调试模式时,预编译的min文件应包含在您的包中。

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

    我找到了一个至少在MVC5中有效的解决方案,您可以使用
    Bundle
    而不是
    ScriptBundle
    。在本例中,它没有我们不喜欢的
    ScriptBundle
    智能行为(忽略.min等)。在我的解决方案中,我对带有.min和.map文件的3d派对脚本使用
    Bundle
    ,对我们的代码使用
    ScriptBundle
    。我没有注意到这样做的任何缺点。要使其以这种方式工作,您需要添加原始文件,例如angular.js,它将在调试中加载angular.js,并在发布模式下绑定angular.min.js。

    要呈现
    *.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;
            }
        }
    }
    

    我使用的是MVC4bundler,它包含.min.js文件。RTM版本还是RC?它在RC for me-tooth中工作正常。它的想法是在调试模式下工作,当您处于非调试状态时,将使用没有缩小的“dev”版本