首先实现自定义的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();
}
}