Web性能优化已经是老生常谈的话题了, 不过笔者也一直没放在心上,主要的原因还是项目的用户量以及页面中的js,css文件就那几个,感觉没什么优化的。人总要进步的嘛,最近在被angularjs吸引着,也用了angularjs开发了一个项目,那感觉真的是谁用谁知道。

   angularjs的好处我就不在这里废话了,有兴趣的请自行度娘。背景是这样的, 在这个使用angularjs开发的项目中,由于自己的粗心导致页面打开很慢,傻了吧唧的引用了未压缩的js文件,将近1M的js啊,我还傻乎乎的建索引,优化sql,然而最终并没有什么卵用,最后还是在查请求的时候发现angularjs未压缩的文件原来那么大,然后就用了min版本的,瞬间问题解决了。话说到此优化应该就结束了吧,但作为一个有理想,有抱负的程序员咱不能太容易满足,所以决定再进行优化下,数据库和程序都已经优化了,那后面就只能来减少网络的请求数来进行优化了。再加上在学习angularjs的过程中,发现js也可以像咱们的C#一样进行模块化开发(请原谅俺对于前端的小白),那进行模块化的时候就需要将不同的模块放在不同的文件中,这样问题就来了,我们页面的请求数会增多,减少页面请求的方式就是将多个css文件或者js文件进行合并,最简单的方法就是人工的进行合并再一起。但人工多傻啊,咱们可是励志改变世界的程序员们,咱不能人工,咱必须智能,所以在园子里逛了下,多少找到了点头绪,参考了下别人的博客,总结下下面的方法。

  首先先讲下思路,添加一个asp.net处理程序,然后在页面中的script标签中的src的值设置为这个asp.net的处理程序的路径,并加上一个参数(css类似),如下所示:

  <link href="/Css/CombineFiles.axd?fn=index" rel="stylesheet" />

  在程序中我们可以获取到fn的值,然后根据fn的值在/css/路径下面找到对应的文件名,如fn的值为index,那么就在/css/文件夹下面找到文件名问index.txt的文件,然后打开读取文件中的内容,如下所示:

第一行表示的是当前请求的css文件,如果是js文件,则第一行为js。后面的每行则表示的为文件名。在上图中的例子中,表示的是,当前请求的是a.css,b.css,c.css合并和的文件。那我们只需要将三个文件合并后并输入就行了。下面直接上代码:

  1. public class CombineFiles : IHttpHandler
  2. {
  3. #region IHttpHandler Members
  4. /// <summary>
  5. /// 缓存key值
  6. /// </summary>
  7. private const string CacheKeyFormat = "_CacheKey_{0}_";
  8. public bool IsReusable
  9. {
  10. get { return true; }
  11. }
  12.  
  13. public void ProcessRequest(HttpContext context)
  14. {
  15. HttpRequest request = context.Request;
  16. HttpResponse response = context.Response;
  17.  
  18. string cachekey = string.Empty;
  19. bool flag = false;//标志是否是最新合并的内容
  20. string fn = request.QueryString["fn"];
  21. if (!string.IsNullOrEmpty(fn))
  22. {
  23. cachekey = string.Format(CacheKeyFormat, fn);
  24. CompressCacheItem cacheItem = HttpRuntime.Cache[cachekey] as CompressCacheItem;
  25. if (cacheItem == null)
  26. {
  27. flag = true;
  28. string path = context.Server.MapPath("");
  29. StringBuilder sb = new StringBuilder();
  30. //找到请求的文本文件
  31. var con = File.ReadAllText(string.Format("{0}\\{1}.txt", path, fn)).
  32. Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
  33. response.ContentType = con[] == "css" ? "text/css" : "text/javascript";
  34. for (int i = ; i < con.Length; i++)
  35. {
  36. var filename = string.Format("{0}\\{1}.{2}", path, con[i],con[]);
  37. if (File.Exists(filename))
  38. {
  39. string readstr = File.ReadAllText(filename, Encoding.UTF8);
  40. sb.Append(readstr);
  41. }
  42. }
  43. cacheItem = new CompressCacheItem() { Type = con[], Content = sb.ToString(), Expires = DateTime.Now.AddDays() };
  44. HttpRuntime.Cache.Insert(cachekey, cacheItem, null, cacheItem.Expires, TimeSpan.Zero);
  45. }
  46.  
  47. string ifModifiedSince = request.Headers["If-Modified-Since"];
  48. if (!string.IsNullOrEmpty(ifModifiedSince)&&cacheItem.Expires>DateTime.Parse(ifModifiedSince)&&!flag)
  49. {
  50. response.StatusCode = (int)System.Net.HttpStatusCode.NotModified;
  51. response.StatusDescription = "Not Modified";
  52. }
  53. else
  54. {
  55. response.Write(cacheItem.Content);
  56. SetClientCaching(response, cacheItem.Expires);
  57. }
  58. }
  59.  
  60. }
  61.  
  62. private void SetClientCaching(HttpResponse response, DateTime expires)
  63. {
  64. response.Cache.SetETag(DateTime.Now.Ticks.ToString());
  65. response.Cache.SetLastModified(DateTime.Now);
  66.  
  67. //public 以指定响应能由客户端和共享(代理)缓存进行缓存。
  68. response.Cache.SetCacheability(HttpCacheability.Public);
  69.  
  70. //是允许文档在被视为陈旧之前存在的最长绝对时间。
  71. response.Cache.SetMaxAge(TimeSpan.FromTicks(expires.Ticks));
  72.  
  73. response.Cache.SetSlidingExpiration(true);
  74. }
  75. private class CompressCacheItem
  76. {
  77. /// <summary>
  78. /// 类型 js 或 css
  79. /// </summary>
  80. public string Type { get; set; } // js css
  81. /// <summary>
  82. /// 内容
  83. /// </summary>
  84. public string Content { set; get; }
  85. /// <summary>
  86. /// 过期时间
  87. /// </summary>
  88. public DateTime Expires { set; get; }
  89. }
  90.  
  91. #endregion
  92. }

此代码是在园子里一个园友的博客的基础上进行改进的。链接找不到了,在这里就不贴出来了。

最后呢,需要在配置文件中加入如下配置信息:

  1. <configuration>
  2. <system.web>
  3. <compilation debug="true" targetFramework="4.0" />
  4. <httpHandlers>
  5. <add verb="GET" path="*.axd" type="Angular.CombineFiles"/>
  6. </httpHandlers>
  7. </system.web>
  8.  
  9. </configuration>

上面的代码中可以实现功能是,合并js或css,并将其缓存起来,当每次请求时都会判断当前浏览器中是否有缓存,且是否有效,如果有效则直接响应302,告诉浏览器本地缓存是可以使用的,不需要从服务器端重新下载,介绍了很多流量,并且提高了速度。假如,在项目升级的过程中,修改了js或者css,想让浏览器强制下载最新的文件时,可将HttpRuntime.Cache中的缓存移除,这样当重新请求时,会重新合并文件,并响应到客户端。

如下所示:

  1. HttpRuntime.Cache.Remove(string.Format("_CacheKey_{0}_","index"));

over

另外,在这里推广下咱们的微信开发交流群,这里是一群致力于C#微信开发交流的平台,欢迎各位同行进行交流。也可以到群论坛与大家一起交流学习。

微信开发交流的论坛(微兔码农说

如有疑问加群一起交流,我需要广大屌丝小伙伴的反馈与建议,   

Web性能优化-合并js与css,减少请求的更多相关文章

  1. web性能优化之js图片懒加载

    html <div class="container"> <ul> <li> <div id="first" clas ...

  2. Web 性能优化:21 种优化 CSS 和加快网站速度的方法

    这是 Web 性能优化的第 4 篇,上一篇在下面看点击查看: Web 性能优化:使用 Webpack 分离数据的正确方法 Web 性能优化:图片优化让网站大小减少 62% Web 性能优化:缓存 Re ...

  3. Web 性能优化: 图片优化让网站大小减少 62%

    摘要: 压缩各种格式的图片. 原文:Web 性能优化: 图片优化让网站大小减少 62% 作者:前端小智 Fundebug经授权转载,版权归原作者所有. 这是 Web 性能优化的第二篇,上一篇在下面看点 ...

  4. web性能优化--减少客户端请求数(一)

    多图标合并,用css分隔 设置较长时间的过期时间 合并多个css文件 合并多个js文件 根据域名划分内容 首先介绍一款速度测试工具:webpagetest(填上url,username,passwor ...

  5. Web性能优化:What? Why? How?

    为什么要提升web性能? Web性能黄金准则:只有10%~20%的最终用户响应时间花在了下载html文档上,其余的80%~90%时间花在了下载页面组件上. web性能对于用户体验有及其重要的影响,根据 ...

  6. web性能优化——浏览器相关

    简介 优化是一个持续的过程.所以尽可能的不要有人为的参与.所以能自动化的或者能从架构.框架级别解决的就最更高级别解决. 这样即能实现面对开发人员是透明的.不响应,又能确保所有资源都是被优化过的. 场景 ...

  7. web性能优化 来自《web全栈工程师的自我修养》

    最近在看<web全栈工程师的自我修养>一书,作者是来自腾讯的前端工程师.作者在做招聘前端的时候问应聘者web新能优化有什么了解和经验,应聘者思索后回答“在发布项目之前压缩css和 Java ...

  8. web前端除了关注代码功能实现,还应具备web性能优化以及SEO优化的常识

    web前端除了关注代码功能实现,还应具备web性能优化以及SEO优化的常识 ——不会WPO.SEO的前端工程师不是好码农 作为一名web前端工程师,除了要实现上级的要求,满足其所需要的功能,还要在平时 ...

  9. web性能优化-网络传输性能优化

    浏览器工作原理:https://www.cnblogs.com/thonrt/p/10008220.html 浏览器渲染原理: https://www.cnblogs.com/thonrt/p/100 ...

随机推荐

  1. Mongodb源代码阅读笔记:Journal机制

    Mongodb源代码阅读笔记:Journal机制 Mongodb源代码阅读笔记:Journal机制 涉及的文件 一些说明 PREPLOGBUFFER WRITETOJOURNAL WRITETODAT ...

  2. Java并发工具类Semaphore应用实例

    package com.thread.test.thread; import java.util.Random; import java.util.concurrent.*; /** * Semaph ...

  3. php.ini配置解析

    为了让PHP读取这个文件,它必须被命名为'php.ini'. PHP 查找配置文件次序:当前工作目录:环境变量PHPRC  ; 指明的路径:编译时指定的路径.  ; 在windows下,编译时的路径是 ...

  4. SQL Server:服务器角色

    角色 描述 sysadmin 执行SQL Server中的任何动作 serveradmin 配置服务器设置 setupadmin 安装复制和管理扩展过程 securityadmin 管理登录和CREA ...

  5. dubbo-admin-2.5.3 运行报错: Bean property 'URIType' is not writable or has an invalid 解决方法

    因为 jdk 是1.8的版本,和 dubbo-admin 存在兼容性问题.所以报错: Bean property 'URIType' is not writable or has an invalid ...

  6. OpenResty(nginx+lua) 入门

    OpenResty 官网:http://openresty.org/ OpenResty 是一个nginx和它的各种三方模块的一个打包而成的软件平台.最重要的一点是它将lua/luajit打包了进来, ...

  7. ubuntu下apache2 安装 配置 卸载 CGI设置 SSL设置

    一.安装.卸载apache2      apache2可直接用命令安装           sudo apt-get install apache2      卸载比较麻烦,必须卸干净,否则会影响ap ...

  8. C# 中 SQLite 使用介绍

    关于SQLite SQLite是一款轻型的嵌入式的遵守ACID的关系型数据库管理系统,诞生已有15个年头了.随着移动互联的发展,现在得到了更广泛的使用. 在使用SQLite之前,我们势必要先了解它一些 ...

  9. OpenStack Austin 峰会观察:OpenStack as IaaS 已是过去,Solutions on OpenStack 才是未来

    虽然搞 OpenStack 前后也有几年,但是今年在美国 Austin 举办的 OpenStack Summit 我还是第一次参加.回来之后,一直还在回味,觉得要写点东西,将我在这次峰会上的观察和思考 ...

  10. Web学习之css

    CSS指层叠样式表(Cascading Style Sheets),CSS 是标准的布局语言,用来控制元素的尺寸.颜色.排版.CSS 由 W3C 发明,用来取代基于表格的布局.框架以及其他非标准的表现 ...