该问题几次笔试都考了,需要了解下,面试也必然会问到。
首先先介绍下网站,网站分为前端和后端,可以说前端才是真正和用户直接交互的,除了后台需要做优化外,前端页面更需要在性能上做出优化,只有这样才能给用户带来更好的体验,那什么是web前端?一般来讲,web前端是指网站业务逻辑之外的部分,包括浏览器加载,网站视图模型,图片服务,CDN。
接下来介绍下浏览器访问页面时的处理流程:
接下来介绍前端优化的一些方法:
1. 减少http请求,合理设置http缓存
HTTP是无状态的应用层协议,这意味着每次http请求都需要建立通信链路,进行数据传输,而在服务器端,每个http请求,都需要独立的线程去处理,这些通信和服务的开销都很昂贵,减少http的请求数目,可以有效的提高访问性能,减少http请求主要手段是合并css合并javascript合并图片,将浏览器一次访问需要的javascript和css合并成一个文件,这样浏览器就只需要一次http请求,图片也可以合并,将多张图片合并成一张
恰当的缓存设置可以极大的减少http请求数目,eg第一次访问某网站首页,共77个请求,第二次再访问时,仅需10个,关于合理的解释是:缓存越多越好,缓存越久越好,例如,很少变化的图片资源可以直接通过HTTP Header中的Expries设置一个很长的过期头,变化不频繁但又有可能会变的资源可以用Last-modifed来做请求验证。尽可能的让资源在缓存中呆的久一些。
2. 使用浏览器缓存
对一个网站而言,CSS、javascript、logo、图标这些静态资源文件更新的频率都比较低,而这些文件又几乎是每次http请求都需要的,如果将这些文件缓存在浏览器中,可以极好的改善性能。通过设置http头中的cache-control和expires的属性,可设定浏览器缓存,缓存时间可以是数天,甚至是几个月。
在某些时候,静态资源文件变化需要及时应用到客户端浏览器,这种情况,可通过改变文件名实现,即更新javascript文件并不是更新javascript文件内容,而是生成一个新的JS文件并更新HTML文件中的引用。
使用浏览器缓存策略的网站在更新静态资源时,应采用逐量更新的方法,比如需要更新10个图标文件,不宜把10个文件一次全部更新,而是应该一个文件一个文件逐步更新,并有一定的间隔时间,以免用户浏览器忽然大量缓存失效,集中更新缓存,造成服务器负载骤增、网络堵塞的情况。3.启用压缩
在服务器端对文件进行压缩,在浏览器端对文件进行解压缩,可以减少通讯传输的数据量,但压缩对服务器和浏览器带来一定压力
4.CSS Sprites
合并 CSS图片,减少http请求数,而且合并后内存变小
5.lazyload images
这条策略实际上并不一定能减少 HTTP请求数,但是却能在某些条件下或者页面刚加载时减少 HTTP请求数。对于图片而言,在页面刚加载的时候可以只加载第一屏,当用户继续往后滚屏的时候才加载后续的图片。这样一来,假如用户只对第一屏的内容感兴趣时,那剩余的图片请求就都节省了。
6.CSS 放在最上面,JavaScript放在最下面
浏览器会在下载完成全部CSS之后才对整个页面进行渲染,因此最好的做法是将CSS放在页面最上面,让浏览器尽快下载CSS。如果将 CSS放在其他地方比如 BODY中,则浏览器有可能还未下载和解析到 CSS就已经开始渲染页面了,这就导致页面由无 CSS状态跳转到 CSS状态,用户体验比较糟糕,所以可以考虑将CSS放在HEAD中。
Javascript则相反,浏览器在加载javascript后立即执行,有可能会阻塞整个页面,造成页面显示缓慢,因此javascript最好放在页面最下面。
Lazy Load Javascript(只有在需要加载的时候加载,在一般情况下并不加载信息内容。)随着 Javascript框架的流行,越来越多的站点也使用起了框架。不过,一个框架往往包括了很多的功能实现,这些功能并不是每一个页面都需要的,如果下载了不需要的脚本则算得上是一种资源浪费 -既浪费了带宽又浪费了执行花费的时间。目前的做法大概有两种,一种是为那些流量特别大的页面专门定制一个专用的 mini版框架,另一种则是 Lazy Load。
7.减少cookie传输
cookie包含在每次请求和响应中,太大的cookie会严重影响数据传输,因此哪些数据需要写入cookie需要慎重考虑,尽量减少cookie中传输的数据量
8.Javascript代码优化
1)避免使用 eval,eval 函数效率特别低,由于事先无法知晓传给 eval 的字符串中的内容,eval在其上下文中解释要处理的代码,也就是说编译器无法优化上下文,因此只能有浏览器在运行时解释代码。这对性能影响很大。
2)减少作用域链查找,尤其是在循环中,如果在循环中需要访问非本作用域下的变量时请在遍历之前用局部变量缓存该变量,并在遍历结束后再重写那个变量,这一点对全局变量尤其重要,因为全局变量处于作用域链的最顶端,访问时的查找次数是最多的。
3)字符串拼接,在 Javascript中使用”+”号来拼接字符串效率是比较低的,所以用join()方法,但也要考虑到数组也是有一定开销的
4)CSS选择器优化 此处单开一篇