版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011511086/article/details/82911297
C#压缩css、js用到的组件WebGrease.dll,这个组件是微软的
类:
Microsoft.Ajax.Utilities.Minifier
此类代码:
namespace Microsoft.Ajax.Utilities
{
public class Minifier
{
public Minifier();
public int WarningLevel { get; set; }
public string FileName { get; set; }
public ICollection<ContextError> ErrorList { get; }
public ICollection<string> Errors { get; }
public string MinifyJavaScript(string source);
public string MinifyJavaScript(string source, CodeSettings codeSettings);
public string MinifyStyleSheet(string source);
public string MinifyStyleSheet(string source, CssSettings settings);
public string MinifyStyleSheet(string source, CssSettings settings, CodeSettings scriptSettings);
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace WebApplicationTestJs.Models
{
public class MyRazorViewEngine : RazorViewEngine
{
protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath)
{
//压缩输出
return new MyRazorView(controllerContext, viewPath, masterPath, true, base.FileExtensions, base.ViewPageActivator);
//不处理
//return new RazorView(controllerContext, viewPath, masterPath, true, base.FileExtensions, base.ViewPageActivator);
}
}
}
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Properties;
using System.Web.WebPages;
using System.Web.Mvc.Razor;
using System.Web.Compilation;
using System.Web.UI;
using System.Threading.Tasks;
using System.Text.RegularExpressions;
using Microsoft.Ajax.Utilities;
using Microsoft.VisualBasic;
namespace Pisen.UserCenter.Console.Web.Extension
{
public class MyRazorView : RazorView
{
public MyRazorView(ControllerContext controllerContext, string viewPath, string layoutPath, bool runViewStartPages, IEnumerable<string> viewStartFileExtensions)
: base(controllerContext, viewPath, layoutPath, runViewStartPages, viewStartFileExtensions, null)
{
}
public MyRazorView(ControllerContext controllerContext, string viewPath, string layoutPath, bool runViewStartPages, IEnumerable<string> viewStartFileExtensions, IViewPageActivator viewPageActivator)
: base(controllerContext, viewPath, layoutPath, runViewStartPages, viewStartFileExtensions, viewPageActivator)
{
}
private static Minifier minifier = new Minifier();
private static CodeSettings codeSettings = new CodeSettings()
{
IgnoreAllErrors = true,
MinifyCode = true,
LocalRenaming = LocalRenaming.CrunchAll
};
private static CssSettings cssSettings = new CssSettings()
{
IgnoreAllErrors = true,
OutputMode = OutputMode.SingleLine,
MinifyExpressions = true,
};
/// <summary>
/// 匹配<script>xxxxx</script>之间的内容
/// </summary>
//private static Regex regexJs = new Regex("(?<=<script(.*?)>)(.|\n)*?(?=</script>)", RegexOptions.IgnoreCase);
private static Regex regexJs = new Regex("(?<=<script type=\"text/javascript\">)(.|\n)*?(?=</script>)|(?<=<script>)(.|\n)*?(?=</script>)", RegexOptions.IgnoreCase);
/// <summary>
/// 匹配<style>xxxxx</style>之间的内容
/// </summary>
//private static Regex regexStyle = new Regex("(?<=<style(.*?)>)(.|\n)*?(?=</style>)", RegexOptions.IgnoreCase);
private static Regex regexStyle = new Regex("(?<=<style>)(.|\n)*?(?=</style>)|(?<=<style type=\"text/css\">)(.|\n)*?(?=</style>)", RegexOptions.IgnoreCase);
private const string keyCss = "[css.256.843.56.745.hJ.]";
private const string keyJs = "[js.3456.7867.839gsK.W.]";
protected override void RenderView(ViewContext viewContext, TextWriter writer, object instance)
{
StringWriter stringWriter = new StringWriter();
HtmlTextWriter tw = new HtmlTextWriter(stringWriter);
base.RenderView(viewContext, tw, instance);
string html = stringWriter.ToString();
//将html里面的简体中文转换为繁体,末尾參數設置為1033為了防止頁面亂碼產生
//html = Microsoft.VisualBasic.Strings.StrConv(html, VbStrConv.TraditionalChinese, 1033);
Parallel.Invoke(() =>
{
//压缩js
var marchCollection = regexJs.Matches(html);
if (marchCollection?.Count > 0)
{
List<Match> listJs = marchCollection.Cast<Match>().ToList();
List<Match> listJs2 = listJs.AsParallel().Where(w => w.Value != "" && !w.Value.Contains("<script")).ToList();
foreach (Match item in listJs2)
{
html = html.Replace(item.Value, keyJs);
//压缩js
string minJs = minifier.MinifyJavaScript(item.Value, codeSettings);
html = html.Replace(keyJs, minJs);
//html = html.Replace(item.Value, minJs);
}
}
}
, () =>
{
//压缩css
//是否有<style>标签
//var isHaveStyle = Regex.Match(sb.ToString(), "<style(.*)>", RegexOptions.IgnoreCase).Success;
//匹配style节点
var marchList = regexStyle.Matches(html);
if (marchList?.Count > 0)
{
List<Match> listStyle = marchList.Cast<Match>().ToList();
List<Match> listStyle2 = listStyle.AsParallel().Where(w => w.Value != "" && !w.Value.Contains("<style")).ToList();
if (listStyle2?.Count > 0)
{
foreach (Match item in listStyle2)
{
html = html.Replace(item.Value, keyCss);
//压缩style
string minCss = minifier.MinifyStyleSheet(item.Value, cssSettings, codeSettings);
html = html.Replace(keyCss, minCss);
//html = html.Replace(item.Value, minCss);
}
}
}
});
//压缩html
//tHtml = Regex.Replace(tHtml, @"(?<=>)\s|\n|\t(?=<)", string.Empty);
//移除html标签之间的空格
html = Regex.Replace(html, @"(?<=>)[\s|\n|\t]*(?=<)", string.Empty);
//移除多余空格和换行符
html = new Regex(@"\n+\s+").Replace(html, string.Empty);
//输出到页面
writer.Write(html);
}
}
}
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
//注册自定义引擎
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new MyRazorViewEngine());
AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}