目录 1.背景介绍 2.知识剖析 3.常见问题 4.解决方案 5.编码实战 6.扩展思考 7.参考文献 8.更多讨论
1.背景介绍 为什么要对网站进行性能优化 网站的访问量及用户的持久性其实在一定程度上取决于其性能,如果一个网站响应耗时久, 动画卡顿,占用大量的cpu等,往往就会导致用户流失。 尤其是app及微信端应用,可以这么说,如果页面打开都要超过4秒, 这体验绝对差。作为一个开发者,是不允许出现这种情况的,那么该如何提高页面的性能呢? 大致的网站优化性能步骤不外乎减少HTTP请求次数,减少DNS访问,减少对DOM的操作,缩减请求的文件大小/cookie大小等等.
2.知识剖析 如何进行网站性能优化 1、尽量减少HTTP请求次数 2、减少DNS查找次数 3、避免跳转 4、可缓存的AJAX 5、推迟加载内容 6、预加载 7、减少DOM元素数量 8、根据域名划分页面内容 9、使iframe的数量最小 10、不要出现404错误 11、使用内容分发网络(CDN) 12、为文件头指定Expires或Cache-Control 13、Gzip压缩文件内容 14、配置ETag 15、尽早刷新输出缓冲 16、使用GET来完成AJAX请求 17、把样式表置于顶部 18、避免使用CSS表达式(Expression) 19、使用外部JavaScript和CSS 20、削减JavaScript和CSS 21、用<link>代替@import 22、避免使用滤镜 23、把脚本置于页面底部 24、剔除重复脚本 25、减少DOM访问 26、开发智能事件处理程序 27、减小Cookie体积 28、对于页面内容使用无coockie域名 29、优化图像 30、优化CSS Spirite 31、不要在HTML中缩放图像 32、favicon.ico要小而且可缓存 33、保持单个内容小于25K 34、打包组件成复合文本 3.常见问题 DNS为什么和优化搜索有关 4.解决方案 域名系统(DNS)提供了域名和IP的对应关系,就像电话本中人名和他们的电话号码的关系一样。当你在浏览器地址栏中输入www.dudo.org 时,DNS解析服务器就会返回这个域名对应的IP地址。DNS解析的过程同样也是需要时间的。一般情况下返回给定域名对应的IP地址会花费20到120毫秒的时间。而且在这个过程中浏览器什么都不会做直到DNS查找完毕。 缓存DNS查找可以改善页面性能。这种缓存需要一个特定的缓存服务器,这种服务器一般属于用户的ISP提供商或者本地局域网控制,但是它同样会在用户使用 的计算机上产生缓存。DNS信息会保留在操作系统的DNS缓存中(微软Windows系统中DNS Client Service)。大多数浏览器有独立于操作系统以外的自己的缓存。由于浏览器有自己的缓存记录,因此在一次请求中它不会受到操作系统的影响。 Internet Explorer默认情况下对DNS查找记录的缓存时间为30分钟,它在注册表中的键值为DnsCacheTimeout。Firefox对DNS的查找 记录缓存时间为1分钟,它在配置文件中的选项为network.dnsCacheExpiration(Fasterfox把这个选项改为了1小时)。 当客户端中的DNS缓存都为空时(浏览器和操作系统都为空),DNS查找的次数和页面中主机名的数量相同。这其中包括页面中URL、图片、脚本文件、样式表、Flash对象等包含的主机名。减少主机名的数量可以减少DNS查找次数。 减少主机名的数量还可以减少页面中并行下载的数量。减少DNS查找次数可以节省响应时间,但是减少并行下载却会增加响应时间。我的指导原则是把这些页面中 的内容分割成至少两部分但不超过四部分。这种结果就是在减少DNS查找次数和保持较高程度并行下载两者之间的权衡了。 5.编码实战 6.扩展思考 1.HTTP缓存怎样设置? meta http-equiv="Cache-Control" content="max-age=7200" meta http-equiv="expires" content="someGMT" 2.链接后面是否带“/”有什么区别? 有/会认为是目录,没/会认为是文件。 加了/浏览器会指向一个目录,目录的话会读取默认文件index等等。 没有/会先尝试读取文件,如果没有文件再找与该文件同名的目录,最后才读目录下的默认文件。 网址没有加上/会给服务器增加一个查找是否有同名文件的过程。 3.如何正确理解 Repaint 和 Reflow ? Repaint(重绘)就是在一个元素的外观被改变,但没有改变布局(宽高)的情况下发生,如改变visibility、outline、背景色等等。 Reflow(重排)就是DOM的变化影响到了元素的几何属性(宽和高),浏览器会重新计算元素的几何属性,会使渲染树中受到影响的部分失效, 浏览器会验证DOM树上的所有其它结点的visibility属性,这也是Reflow低效的原因。 如:改变窗囗大小、改变文字大小、内容的改变、浏览器窗口变化,style属性的改变等等。 如果Reflow的过于频繁,CPU使用率就会噌噌的往上涨,所以前端也就有必要知道 Repaint 和 Reflow的知识。 减少性能影响的办法: 总之,因为 Reflow 有时确实不可避免,所以只能尽可能限制Reflow的影响范围。 7.参考文献 参考一: <a href="http://www.ha97.com/2710.html"></a> 参考二: <a href="https://blog.youkuaiyun.com/weixin_40346317/article/details/81144131"></a> 8.更多讨论 1.减少HTTP请求次数同时又可能保持页面内容丰富的技术有哪些。 1.合并文件是通过把所有的脚本放到一个文件中来减少HTTP请求的方法,如可以简单地把所有的CSS文件都放入一个样式表中。当脚本或者样式表在不同页面中使用时需要做不同的修改,这可能会相对麻烦点,但即便如此也要把这个方法作为改善页面性能的重要一步。 2.CSS Sprites是减少图像请求的有效方法。把所有的背景图像都放到一个图片文件中,然后通过CSS的background-image和 background-position属性来显示图片的不同部分; 3图片地图是把多张图片整合到一张图片中。虽然文件的总体大小不会改变,但是可以减少HTTP请求次数。图片地图只有在图片的所有组成部分在页面中是紧挨在 一起的时候才能使用,如导航栏。确定图片的坐标和可能会比较繁琐且容易出错,同时使用图片地图导航也不具有可读性,因此不推荐这种方法; 4.内联图像是使用data:URL scheme的方法把图像数据加载页面中。这可能会增加页面的大小。把内联图像放到样式表(可缓存)中可以减少HTTP请求同时又避免增加页面文件的大小。但是内联图像现在还没有得到主流浏览器的支持。 减少页面的HTTP请求次数是你首先要做的一步。这是改进首次访问用户等待时间的最重要的方法。如同Tenni Theurer的他的博客Browser Cahe Usage – Exposed!中所说,HTTP请求在无缓存情况下占去了40%到60%的响应时间。让那些初次访问你网站的人获得更加快速的体验吧! 2.DOM元素数量如何计算出来, 只需要在Firebug的控制台内输入: document.getElementsByTagName(‘*’).length
3.<iframe>优缺点
<iframe>优点:
- 解决加载缓慢的第三方内容如图标和广告等的加载问题
- Security sandbox
- 并行加载脚本
<iframe>的缺点:
- 即时内容为空,加载也需要时间
- 会阻止页面加载
- 没有语意