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 }
调用说明:
1 <script src="handles/HttpCombiner.ashx?type=js&compress=true&href=/Plugins/Highcharts/highcharts.js,/Plugins/Easytabs/easytabs.js" 2 type="text/javascript"></script>
若是压缩css文件,将上面的type修改成css即可。
文件引用页面:http://www.peng8.net/post/2014/03/26/javascript-and-css-compression

浙公网安备 33010602011771号