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

46 篇文章 1 订阅

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 Microsoft.Ajax.Utilities;
using Microsoft.VisualBasic;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Web;
using System.Web.Mvc;
using System.Web.UI;
using System.Web.WebPages;

namespace WebApplicationTestJs.Models
{
    //RazorView
    //BuildManagerCompiledView
    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(.)*?>)(.|\n)*?(?=</script>)", RegexOptions.IgnoreCase);
        //private static Regex regexJs = new Regex("(?<=<script[^>]*>)([\\s\\S](?!<script))*?(?=</script>)", RegexOptions.IgnoreCase);
        //測試證明,這個正則匹配準確高
        private static Regex regexJs = new Regex("(?<=<script(.)*?>)([\\s\\S](?!<script))*?(?=</script>)", RegexOptions.IgnoreCase);
        //string regexstr=@"<script[^>]*>([\s\S](?!<script))*?</script>";

        /// <summary>
        /// 匹配<style>xxxxx</style>之间的内容
        /// </summary>
        //private static Regex regexStyle = new Regex("(?<=<style(.*?)>)(.|\n)*?(?=</style>)", RegexOptions.IgnoreCase);
        private static Regex regexStyle = new Regex("(?<=<style(.)*?>)([\\s\\S](?!<script))*?(?=</style>)", RegexOptions.IgnoreCase);

        private const string keyCss = "[css*.256.843.56.745.h*J.]";
        private const string keyJs = "[js*.869.218.839.*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)
                {
                    foreach (Match item in marchCollection)
                    {
                        if (string.IsNullOrWhiteSpace(item.Value))
                        {
                            continue;
                        }
                        //string jsTemp = item.Value.Replace("<script>", "").Replace("</script>","").Replace("<script type=\"text/javascript\">", "");
                        html = html.Replace(item.Value, keyJs);
                        //压缩js
                        string minJs = minifier.MinifyJavaScript(item.Value, codeSettings);
                        html = html.Replace(keyJs, minJs);                     
                    }
                }
            }
                , () =>
             {
                //压缩css
                //是否有<style>标签
                //var isHaveStyle = Regex.Match(sb.ToString(), "<style(.*)>", RegexOptions.IgnoreCase).Success;
                //匹配style节点         
                var marchList = regexStyle.Matches(html);
                 if (marchList.Count > 0)
                 {
                     foreach (Match item in marchList)
                     {
                         if (string.IsNullOrWhiteSpace(item.Value))
                         {
                             continue;
                         }
                         html = html.Replace(item.Value, keyCss);
                         //压缩style
                         string minCss = minifier.MinifyStyleSheet(item.Value, cssSettings, codeSettings);
                         html = html.Replace(keyCss, minCss);                   
                     }
                 }
             });

             
            压缩html,要壓縮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);          
    	}
    }

項目地址:
https://gitee.com/wanghaoli/CompressionHtml_Js_Css

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

王焜棟琦

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

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

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

打赏作者

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

抵扣说明:

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

余额充值