ASP.NET MVC继承RazorViewEngine,重写RenderView实现压缩html,压缩css,压缩js,简体转繁体,获取TextWriter内容

版权声明:本文为博主原创文章,未经博主允许不得转载。 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);          
    	}
    }

猜你喜欢

转载自blog.csdn.net/u011511086/article/details/82911297
今日推荐