捆绑器不包括.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'文件?

101173 次浏览

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

请参阅System.Web.Optimization.BundleCollection的源代码(例如,您可以使用dotPeek),以便更好地理解您将要做的事情。

原来的答案:

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

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

短的版本

    在你的项目中,一个脚本的调试版和缩小版都在同一个文件夹下:
    • script.js
    • script.min.js
    • 李< / ul > < / >
    • 在你的代码中,你只向一个bundle中添加script.js

因此,你将在自动中将script.js包含在调试模式中,而在释放模式中包含script.min.js

长版本

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

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

发布:

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

请注意

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

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

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

对于我的案例,我使用的是(太棒了!)Knockout.js库作为调试/非版本:

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

为了做到这一点,我在我的Bundle中包含了“Knockout-{Version}.js”(非调试),并获得了.debug。js文件在调试模式。

< p >的人 我只想简单地保持它,直到微软一起行动

试试这个

在RegisterBundles中为Kendo创建这个bundle

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

通过这种方式,我们在生产中得到了最好的包,在调试中得到了引用

当微软修正他们的MVC 4代码时再修正它

捆绑器有很多好处检查此页面 :

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

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

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

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

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

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

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

  2. 在你的bundle中引用未缩小的文件,像这样:

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

Just because the file without 'min' in the name is actually minified shouldn't cause any issues (other than the fact it's essentially unreadable). It's only used in debug mode and gets written out as a separate script. When not in debug mode the pre-compiled min file should be included in your bundle.

一个简单的方法就是重命名。min文件,比如你有abc.min.css,而不是把这个文件重命名为abc_min.css,然后把它添加到你的bundle中。我知道这不是正确的方法,但这只是一个临时的解决办法。谢谢大家,编码愉快。

我发现了一个很好的解决方案,至少在MVC5中工作,你可以只使用Bundle而不是ScriptBundle。在这种情况下,它没有我们不喜欢的ScriptBundle的聪明行为(忽略.min等)。在我的解决方案中,我使用Bundle用于带有.min和.map文件的3d政党脚本,我使用ScriptBundle用于我们的代码。我没有发现做这件事有什么缺点。要让它以这种方式工作,你需要添加原始文件,例如angular.js,它会在调试时加载angular.js,并在发布模式下捆绑angular.min.js。

要呈现*.min.js文件,必须禁用BundleTable.EnableOptimizations,这是一个适用于所有bundle的全局设置。

如果你只想为特定的包启用优化,你可以创建自己的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;
}
}
}

对于始终应该使用缩小文件的bundle,使用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.*"));