C# 捆绑程序不包括.min文件
我对mvc4绑定器有一个奇怪的问题,它不包括扩展名为.min.js的文件 在我的BundleConfig类中,我声明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
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
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的文件。要在捆绑包中使用此文件,请执行以下操作:
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”版本