ASP.NET MVC解决BundleConfig,BundleTable压缩失败,压缩报错Minification failed

首先实现自定义的ScriptBundle,然后继承IBundleTransform抽象类创建自己的MyJsMinify替换原来的JsMinify,方便具体的操作处理
压缩的时候默认会执行原本的压缩,除非压缩失败才会执行DouglasCrockford.JsMin.JsMinifier这个类方法执行压缩
web项目首先要nuget里面安装DouglasCrockford.JsMin

完整参考代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;

namespace WebApplicationJsMin
{
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            //FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);          
        } 
    }
}

using Repair.HK.H5.UI.Common;
using System.Web;
using System.Web.Optimization;

namespace Repair.HK.H5.UI
{
    public class BundleConfig
    {     
        public static void RegisterBundles(BundleCollection bundles)
        {

            bundles.UseCdn = true;
			//启用压缩
            BundleTable.EnableOptimizations = true;

            // ReservationOrder頁面
            bundles.Add(new MyScriptBundle("~/pageJs/reservationOrder_js").Include(
             "~/pageJs/reservartionOrder.js"
             )); 
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Optimization;

namespace WebApplicationJsMin.Models
{
 
    public class MyScriptBundle : Bundle
    {
        public MyScriptBundle(string virtualPath) : this(virtualPath, null)
        {
        }

        public MyScriptBundle(string virtualPath, string cdnPath) : base(virtualPath, cdnPath, new IBundleTransform[]
        {
            new MyJsMinify()
        })
        {
            base.ConcatenationToken = ";" + Environment.NewLine;
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Optimization;

namespace WebApplicationJsMin.Models
{

    public class MyJsMinify : IBundleTransform
    {
        /// <summary>
        /// 压缩出错处理
        /// </summary>
        /// <param name="bundle"></param>
        /// <param name="errors"></param>
        internal static void GenerateErrorResponse(BundleResponse bundle, IEnumerable<object> errors)
        {
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.Append("/* ");
            stringBuilder.Append("压缩出错").Append("\r\n");
            foreach (object obj in errors)
            {
                stringBuilder.Append(obj.ToString()).Append("\r\n");
            }
            stringBuilder.Append(" */\r\n");
            stringBuilder.Append(bundle.Content);
            bundle.Content = stringBuilder.ToString();
        }

        /// <summary>
        /// 压缩处理
        /// </summary>
        /// <param name="context"></param>
        /// <param name="response"></param>
        public virtual void Process(BundleContext context, BundleResponse response)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }
            if (response == null)
            {
                throw new ArgumentNullException("response");
            }
            if (!context.EnableInstrumentation)
            {
                Microsoft.Ajax.Utilities.Minifier minifier = new Microsoft.Ajax.Utilities.Minifier();
                string content = minifier.MinifyJavaScript(response.Content, new Microsoft.Ajax.Utilities.CodeSettings
                {
                    EvalTreatment = Microsoft.Ajax.Utilities.EvalTreatment.MakeImmediateSafe,
                    PreserveImportantComments = false
                });
                //出错启用备用压缩,如果没有错误,会用原始的压缩方式去走else
                if (minifier.ErrorList.Count > 0)
                {                 
                    var minifier2 = new DouglasCrockford.JsMin.JsMinifier();
                    try
                    {
                        string content2 = minifier2.Minify(response.Content);
                        response.Content = "/* 压缩出错,备用压缩 */" + System.Environment.NewLine + content2;
                    }
                    catch (Exception)
                    {
                        MyJsMinify.GenerateErrorResponse(response, minifier.ErrorList);
                    }
                }
                else
                {
                    response.Content = content;
                }
            }
            response.ContentType = MyJsMinify.JsContentType;
        }

        internal static string JsContentType = "text/javascript";
        internal static readonly MyJsMinify Instance = new MyJsMinify();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王焜棟琦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值