使用 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有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)