Asp.net 脚本或者样式 动态压缩(网页加载性能提升)

多个脚本合并压缩加载

 

为了解决脚本与脚本之间的加载阻塞,可以减少脚本文件的引用数,一次请求加载完毕缓存到客户端,这样即减少了请求次数,也缓解了服务器的压力。

    这里我们需要用到Yahoo.Yui提供的压缩DLL Yahoo.Yui.Compressor.dll和Yahoo.Yui.Compressor.MsBuildTask.dll

 

咱们在项目里新建一个HttpCombiner.ashx 一般处理程序,专门用来处理请求的CSS和Javascript,服务端收到请求后,读取相应的文件合并压缩一起返回给客户端.

  1 /// <summary>
  2     /// HttpCombiner 的摘要说明
  3     /// </summary>
  4     public class HttpCombiner : IHttpHandler
  5     {
  6         class CacheItem
  7         {
  8             public string Content { set; get; }
  9             public DateTime Expires { set; get; }
 10         }
 11         public void ProcessRequest(HttpContext context)
 12         {
 13             context.Response.ContentType = "text/javascript";
 14             HttpRequest request = context.Request;
 15             HttpResponse response = context.Response;
 16             string[] allkeys = request.QueryString.AllKeys;
 17             if (!allkeys.Contains("href") || !allkeys.Contains("type") || !allkeys.Contains("compress"))
 18             {
 19                 response.Write("请求格式不正确,正确格式是type=....&href=....&compress=...");
 20                 response.Write("type只能是js或则css,compress只能是true或则false,href则是请求的文件,多个文件已逗号分隔");
 21             }
 22             else
 23             {
 24                 string cacheKey = request.Url.Query;
 25                 #region /*确定合并文件类型*/
 26                 string fileType = request.QueryString["type"].Trim().ToLower();
 27                 string contenType = string.Empty;
 28                 if (fileType.Equals("js"))
 29                 {
 30                     contenType = "text/javascript";
 31                 }
 32                 else if (fileType.Equals("css"))
 33                 {
 34                     contenType = "text/css";
 35                 }
 36                 /*确定合并文件类型*/
 37                 #endregion
 38                 CacheItem cacheItem = HttpRuntime.Cache.Get(cacheKey) as CacheItem;//服务端缓存
 39                 if (cacheItem == null)
 40                 {
 41                     #region 合并压缩文件
 42                     /*合并文件*/
 43                     string href = context.Request.QueryString["href"].Trim();
 44                     string content = string.Empty;
 45                     string[] files = href.Split(new string[] { ",", "" }, StringSplitOptions.RemoveEmptyEntries);
 46                     StringBuilder sb = new StringBuilder();
 47                     foreach (string fileName in files)
 48                     {
 49                         string filePath = context.Server.MapPath(fileName);
 50                         if (File.Exists(filePath))
 51                         {
 52                             string readstr = File.ReadAllText(filePath, Encoding.UTF8);
 53                             sb.Append(readstr);
 54                             //content = JavaScriptCompressor.Compress(content);
 55                             //response.Write(content);
 56                         }
 57                         else
 58                         {
 59                             sb.AppendLine("\r\n未找到源文件" + filePath + "\r\n");
 60                         }
 61                     }
 62                     content = sb.ToString();
 63                     /*合并文件*/
 64                     /*压缩文件*/
 65                     string compressStr = request.QueryString["compress"].Trim();
 66                     bool iscompress = bool.Parse(compressStr);
 67                     if (iscompress)
 68                     {
 69                         if (fileType.Equals("js"))
 70                         {
 71                             content = JavaScriptCompressor.Compress(content);
 72                         }
 73                         else if (fileType.Equals("css"))
 74                         {
 75                             content = CssCompressor.Compress(content);
 76                         }
 77                     }
 78                     /*压缩文件*/
 79                     #endregion
 80                     cacheItem = new CacheItem() { Content = content, Expires = DateTime.Now.AddMinutes(30) };
 81                     HttpRuntime.Cache.Insert(cacheKey, cacheItem, null, cacheItem.Expires, TimeSpan.Zero);
 82                 }
 83                 response.ContentType = contenType;
 84                 if (request.Headers["If-Modified-Since"] != null && TimeSpan.FromTicks(cacheItem.Expires.Ticks - DateTime.Parse(request.Headers["If-Modified-Since"]).Ticks).Seconds < 100)
 85                 {
 86                     response.StatusCode = 304;
 87                     // response.Headers.Add("Content-Encoding", "gzip");  
 88                     response.StatusDescription = "Not Modified";
 89                 }
 90                 else
 91                 {
 92                     response.Write(cacheItem.Content);
 93                     SetClientCaching(response, DateTime.Now);
 94                 }
 95             }  //合并文件结束
 96         }
 97         private void SetClientCaching(HttpResponse response, DateTime lastModified)
 98         {
 99             response.Cache.SetETag(lastModified.Ticks.ToString());
100             response.Cache.SetLastModified(lastModified);
101             //public 以指定响应能由客户端和共享(代理)缓存进行缓存。  
102             response.Cache.SetCacheability(HttpCacheability.Public);
103             //是允许文档在被视为陈旧之前存在的最长绝对时间。  
104             response.Cache.SetMaxAge(new TimeSpan(7, 0, 0, 0));
105             //将缓存过期从绝对时间设置为可调时间  
106             response.Cache.SetSlidingExpiration(true);
107         }  
108         public bool IsReusable
109         {
110             get
111             {
112                 return false;
113             }
114         }
115     }
View Code

调用说明:

1 <script src="handles/HttpCombiner.ashx?type=js&compress=true&href=/Plugins/Highcharts/highcharts.js,/Plugins/Easytabs/easytabs.js"
2         type="text/javascript"></script>
View Code

若是压缩css文件,将上面的type修改成css即可。

 

文件引用页面:http://www.peng8.net/post/2014/03/26/javascript-and-css-compression

posted @ 2014-09-11 16:15  慕枫小屋  阅读(169)  评论(0)    收藏  举报