使用 System.Web.Optimization Bundling 最小化时有没有办法禁用 js/css 验证?
Posted
技术标签:
【中文标题】使用 System.Web.Optimization Bundling 最小化时有没有办法禁用 js/css 验证?【英文标题】:Is there a way to disable js/css validation when using System.Web.Optimization Bundling minimisation? 【发布时间】:2014-10-13 18:30:17 【问题描述】:我正在使用 .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"
之类的东西?
【问题讨论】:
你想做什么?尽管有错误,还是缩小它们?它们仍然被捆绑在一起,它只是防止任何东西被缩小。 @MikeSmithDev 是的,用错误缩小它们是理想的结果。 【参考方案1】:您可以通过编写自己的继承自 IBundleBuilder
的类来完成此操作。
下面的代码是对相关 NuGet 包LicensedBundler 的改编,它保留了重要的 cmets 并缩小文件,而不是缩小有错误的文件,而是将它们及其错误移动到包的顶部(默认功能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 中,并且只需要稍作调整即可忽略错误,就像上面的代码一样。
【讨论】:
以上是关于使用 System.Web.Optimization Bundling 最小化时有没有办法禁用 js/css 验证?的主要内容,如果未能解决你的问题,请参考以下文章
在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?
Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)