博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
web优化之-asp.net js延迟加载 js动态合并 js动态压缩
阅读量:6575 次
发布时间:2019-06-24

本文共 5467 字,大约阅读时间需要 18 分钟。

紧接着上一篇文章来说,遗留了一个很大的问题那就是js文本怎么合并与压缩了,上一篇文章中的

  
public 
static 
void AppendJsFile(
this HtmlHelper htmlHelper, 
string jsFile, 
int group = 1)  
  
public 
static MvcHtmlString RenderJsFile(
this HtmlHelper htmlHelper)  

都只限于MVC中使用,我们能不能搞一个更通用的东东了,答案是肯定的。

先说说思路吧,其实很简单 就是我们自己接管输出流,如何接管了?在Global.asax文件中添加以下代码:

public override void Init()        {            base.Init();            this.ReleaseRequestState += new EventHandler(InstallResponseFilter);        }        private void InstallResponseFilter(object sender, EventArgs e)        {            HttpResponse response = HttpContext.Current.Response;            if (response.ContentType == "text/html")                response.Filter = new PageFilter(response.Filter);        }

我还是沿用先前的项目做demo吧

和我们平时的开发没有任何区别,但是返回结果却是如下

我们看到js文件和js文本都合并 并且也是压缩了的。

关键的一切还是PageFilter的功劳啊

代码如下:

public class PageFilter : Stream    {        Stream responseStream;        long position;        StringBuilder responseHtml;        public PageFilter(Stream inputStream)        {            responseStream = inputStream;            responseHtml = new StringBuilder();        }        #region Filter overrides        public override bool CanRead        {            get { return true; }        }        public override bool CanSeek        {            get { return true; }        }        public override bool CanWrite        {            get { return true; }        }        public override void Close()        {            responseStream.Close();        }        public override void Flush()        {            responseStream.Flush();        }        public override long Length        {            get { return 0; }        }        public override long Position        {            get { return position; }            set { position = value; }        }        public override long Seek(long offset, SeekOrigin origin)        {            return responseStream.Seek(offset, origin);        }        public override void SetLength(long length)        {            responseStream.SetLength(length);        }        public override int Read(byte[] buffer, int offset, int count)        {            return responseStream.Read(buffer, offset, count);        }        #endregion        #region Dirty work        public override void Write(byte[] buffer, int offset, int count)        {            HttpResponse response = HttpContext.Current.Response;            string charset = response.Charset ?? "utf-8";            string finalHtml = Encoding.GetEncoding(charset).GetString(buffer, offset, count);            Regex eof = new Regex("", RegexOptions.IgnoreCase);            if (!eof.IsMatch(finalHtml))            {                responseHtml.Append(finalHtml);            }            else            {                responseHtml.Append(finalHtml);                 finalHtml = responseHtml.ToString();                //js文本                Regex reg = new Regex("
]*>(?
[^<]*)", RegexOptions.IgnoreCase | RegexOptions.Multiline); //js引用 Regex regSrc = new Regex("src=\"?(?
[^'\">]*)\"?", RegexOptions.IgnoreCase | RegexOptions.Multiline); StringBuilder jsContent = new StringBuilder(); List
jsSrc = new List
(); MatchCollection mc = reg.Matches(finalHtml); if (mc.Count > 0) { #region 找出js部分 foreach (Match m in mc) { string str = m.Groups["content"].Value; if (!string.IsNullOrEmpty(str)) { jsContent.AppendLine(str);//找出js文本 } else { //找出js引用 Match mSrc = regSrc.Match(m.Value); if (mSrc != null && mSrc.Success) { string temp = mSrc.Groups["src"].Value; if (!jsSrc.Contains(temp)) jsSrc.Add(temp); } } } #endregion finalHtml = reg.Replace(finalHtml, string.Empty); #region 合并js文本和js引用 //生成新的js引用 string jsFileFormat = "
"; string jshref = string.Format(jsFileFormat, "http://localhost:58798/js.ashx?href=" + string.Join(",", jsSrc)); //生成新的js文本 string jstextFormat = "
"; //压缩js文本 string jsContentstr = jsContent.ToString(); if(!string.IsNullOrEmpty(jsContentstr)) jsContentstr = JavaScriptCompressor.Compress(jsContent.ToString()); string jsText = string.Format(jstextFormat, jsContentstr); //插入新生成的js int bodyindex = finalHtml.ToLower().LastIndexOf(""); finalHtml = finalHtml.Insert(bodyindex, jshref + Environment.NewLine + jsText); #endregion } byte[] data = Encoding.GetEncoding(charset).GetBytes(finalHtml); responseStream.Write(data, 0, data.Length); } } #endregion }

说了这么多,这里只是提供一个思想,一个js合并的思想,在真实的项目中还有很多细节需要注意啊。

转载地址:http://fdgjo.baihongyu.com/

你可能感兴趣的文章
UVM中的class--2
查看>>
任务调度器配置文件
查看>>
ORACLE 存储过程异常捕获并抛出
查看>>
HDU 4293 Groups (线性dp)
查看>>
博客园博客美化相关文章目录
查看>>
root用户重置其他密码
查看>>
关于查询扩展版ESI高被引论文的说明
查看>>
Oracle推断值为非数字
查看>>
多年前写的一个ASP.NET网站管理系统,到现在有些公司在用
查看>>
vue-cli中理不清的assetsSubDirectory 和 assetsPublicPath
查看>>
从JDK源码角度看Short
查看>>
解密Angular WebWorker Renderer (二)
查看>>
parceljs 中文文档24小时诞生记
查看>>
五年 Web 开发者 star 的 github 整理说明
查看>>
Docker 部署 SpringBoot 项目整合 Redis 镜像做访问计数Demo
查看>>
ReactNative字体大小不随系统字体大小变化而变化
查看>>
中台之上(五):业务架构和中台的难点,都是需要反复锤炼出标准模型
查看>>
为什么中台是传统企业数字化转型的关键?
查看>>
使用模板将Web服务的结果转换为标记语言
查看>>
inno setup 打包脚本学习
查看>>