我正在使用.NET 4.5 System.Web.Optimization
捆绑。当打开最小化文件时,我发现有些CSS和JavaScript没有通过验证机制而被最小化。这些文件的消息类似于
/* Minification failed. Returning unminified contents.
(5616,18): run-time error CSS1036: Expected expression, found '@Arial'
因为班级有font-family: @Arial Unicode MS;
或者在错误后产生的全局变量前面没有window
的Javascript。
/* Minification failed. Returning unminified contents.
(210,13-20): run-time error JS1300: Strict-mode does not allow assignment to undefined variables: PageObj
(189,13-20): run-time error JS1300: Strict-mode does not allow assignment to undefined variables: PageObj
*/
我确实理解正确的解决方法是修复错误,但是有很多文件有很多错误,有时可能很难解决。 有没有办法在捆绑时禁用css / js验证,或者必须使用自定义IBundleTransform
编写器,这样可以从捆绑的javascript文件中删除"use strict"
之类的内容并缩小?
答案 0 :(得分:5)
您可以通过编写自己继承自IBundleBuilder
。
下面的代码是对相关NuGet包LicensedBundler的改编,它保留了重要的注释并缩小了文件,同时没有缩小有错误的文件,而是将它们和错误移到了包的顶部(默认功能) ASP.NET捆绑的目的是不缩小任何东西)。如您所见,在CssSettings
中可以选择忽略所有错误:
public class LicensedStyleBundle : Bundle
{
public LicensedStyleBundle(string virtualPath)
: base(virtualPath)
{
this.Builder = new LicencedStyleBuilder();
}
public LicensedStyleBundle(string virtualPath, string cdnPath)
: base(virtualPath, cdnPath)
{
this.Builder = new LicencedStyleBuilder();
}
}
public class LicencedStyleBuilder : IBundleBuilder
{
public virtual string BuildBundleContent(Bundle bundle, BundleContext context, IEnumerable<BundleFile> files)
{
var content = new StringBuilder();
foreach (var file in files)
{
FileInfo f = new FileInfo(HttpContext.Current.Server.MapPath(file.VirtualFile.VirtualPath));
CssSettings settings = new CssSettings();
settings.IgnoreAllErrors = true; //this is what you want
settings.CommentMode = Microsoft.Ajax.Utilities.CssComment.Important;
var minifier = new Microsoft.Ajax.Utilities.Minifier();
string readFile = Read(f);
string res = minifier.MinifyStyleSheet(readFile, settings);
content.Append(res);
}
return content.ToString();
}
public static string Read(FileInfo file)
{
using (var r = file.OpenText())
{
return r.ReadToEnd();
}
}
}
然后在BundleConfig.cs中,使用LicensedStyleBundle
而不是StyleBundle
:
bundles.Add(new LicensedStyleBundle("~/Content/css").Include("~/Content/site.css"));
您可以为ScriptBundle执行类似的代码。如果你需要指针,所有源代码都在NuGet包的Github project site处,只需要稍微调整就可以忽略错误,就像上面的代码一样。