做为一名前端工程师咱们除了写得了编程修得了样式以外,咱们须要注意的就是如何进行前端性能优化。css
先说下前端性能优化的目的,咱们从用户角度和服务商角度来讲。html
1.用户方面:优化能让页面加载更快,对用户的操做响应更及时,可以给用户提供更为友好的体验;前端
2.服务商方面:优化可以减小页面请求数,或者减小请求所占带宽,可以节省客观的资源webpack
分析完优化目的,下面说说从什么途径进行优化或者说怎么进行优化?优化的方法有哪些?web
1、页面级别的优化ajax
1.1 减小http请求数以及减小请求资源的大小编程
理由:一个完整的HTTP请求需通过如下几个流程:域名解析,DNS寻址 --> 发起TCP的3次握手 --> 创建TCP链接后发起http请求 --> 服务器响应http请求,浏览器获得html代码 --> 浏览器解析html代码,并请求html代码中的资源(如js、css、图片等) --> 浏览器对页面进行渲染呈现给用户。整个流程除耗时成本不说若当下载资源过大时,页面加载如何能快?因此减小http请求数有助于提升页面加载速度。json
方法:gulp
1,.1.一、 尽可能合并和压缩css和js文件。经过打包工具webpack和gulp后端
1.1.二、 尽可能所使用的字体图标或者SVG图标来代替传统png图.由于字体图标或者SVG是矢量图, 代码编写出来的,方大不会变形,并且渲染速度快
1.1.三、 减小DNS查找
1.1.4 、使用雪碧图或者是说图片精灵
把全部相对较小的资源图片,绘制在一张大图上,只须要将大图下载下来,而后利用
图片定位来说小图展示在页面中(background-position:百分比,数值)
1.1.五、 采用图片的懒加载(延迟加载)
目的为了,减小页面第一次加载过程当中http的请求次数
具体步骤:
一、页面开始加载时不去发送http请求,而是放置一张占位图
二、当页面加载完时,而且图片在可视区域再去请求加载图片信息
1.1.六、 能用css作的效果,不要用js作,能用原生js作的,不要轻易去使用第三方插件。
避免引入第三方大量的库。而本身却只是用里面的一个小功能
1.1.7减小对cookie的使用(最主要的就是减小本地cookie存储内容的大小),由于客户端操做cookie的时候,这些信息老是在客户端和服务端传递。若是上设置不当,每次发送
一个请求将会携带cookie
1.1.八、前端与后端进行数据交互时,对于多项数据尽量基于json格式来进行传送。相对于使用xml
来讲传输有这个优点
目的:是数据处理方便,资源偏小
1.1.9 、在基于ajax的get请求进行数据交互的时候,根据需求可让其产生缓存(注意:这个
缓存不是咱们常看到的304状态码,去浏览器本地取数据),这样在下一次从相同地址获取是数据
时,取得就是上一次缓存的数据。(注意:不多使用,通常都会清空。根据需求来作)
1.二、避免使用iframe
不只很差管控样式,并且至关于在本页面又嵌套其余页面,消耗性能会更大。由于还回去加载这个嵌套页面的资源
2、代码级别的优化
2.一、由于使用闭包后,闭包所在的上下文不会被释放,因此在js中咱们要尽可能少使用闭包
2.2 、减小对DOM操做,主要是减小DOM的重绘与回流(重排)
2.三、在js中避免嵌套循环和"死循环"(一旦遇到死循环,浏览器就会直接卡掉)
2.四、把css放在body上,把js放在body下面
让其先加载css(注意:这里关于优化没有多大关系)
2.五、减小css表达式的使用
2.六、css选择器解析规则所示从右往左解析的。减小元素标签做为对后一个选择对象
2.七、尽可能将一个动画元素单独设置为一个图层(避免重绘或者回流的大小)
注意:图层不要过多设置,不然不但效果没有达到反而更差了
2.八、在js封装过程当中,尽可能作到低耦合高内聚。减小页面的冗余代码
2.九、css中设置定位后,最好使用z-index改变盒子的层级,让盒子不在相同的平面上
2.十、css导入的时候尽可能减小@import导入式,由于@import是同步操做,只有把对应的样式导入后,才会继续向下加兹安,而link是异步的操做
2.十一、使用window.requestAnimationFrame(js的帧动画)代替传统的定时器动画
若是想使用每隔一段时间执行动画,应该避免使用setInterval,尽可能使用setTimeout
代替setInterval定时器。由于setInterval定时器存在弊端:可能形成两个动画间隔时间
缩短
2.十二、尽可能减小使用递归。避免死递归
解决:建议使用尾递归
2.1三、基于script标签下载js文件时,可使用defer或者async来异步加载
2.1四、在事件绑定中,尽量使用事件委托,减小循环给DOM元素绑定事件处理函数。
2.1五、在js封装过程当中,尽可能作到低耦合高内聚。减小页面的冗余代码
2.1六、减小Flash的使用
3、、存储
3.一、结合后端,利用浏览器的缓存技术,作一些缓存(让后端返回304,告诉浏览器去本地拉取数据)。(注意:也有弊端)可让一些不太会改变的静态资源作缓存。好比:一些图片,js,cs
3.二、利用h5的新特性(localStorage、sessionStorage)作一些简单数据的存储, 避免向后台请求数据或者说在离线状态下作一些数据展现。