Web前端性能优化学习总结

2020-02-14  本文已影响0人  超跑飞飞

概述

在同样的网络环境下,两个同样能满足你的需求的网站,一个“Duang”的一下就加载出来了,一个纠结了半天才出来,你会选择哪个?研究表明:用户最满意的打开网页时间是2-5秒,如果等待超过10秒,99%的用户会关闭这个网页。也许这样讲,各位还不会有太多感触,接下来我列举一组数据:Google网站访问速度每慢400ms就导致用户搜索请 求下降0.59%;Amazon每增加100ms网站延迟将导致收入下降1%;雅虎如果有400ms延迟会导致流量下降5-9%。网站的加载速度严重影响了用户体验,也决定了这个网站的生死存亡。

可能有人会说:网站的性能是后端工程师的事情,与前端并无多大关系。我只能说,too young too simple。事实上,只有10%~20%的最终用户响应时间是用在从Web服务器获取HTML文档并传送到浏览器的,那剩余的时间去哪儿了?来瞄一下性能黄金法则:

只有10%20%的最终用户响应时间花在了下载HTML文档上。其余的80%90%时间花在了下载页面中的所有组件上,并且随着前端应用的壮大,大部分逻辑是交给浏览器执行的,所以网页的性能问题尤为突出。下面总结几点提高网页性能的方法。

资源合并与压缩

  1. html压缩
  1. css压缩
  1. js压缩
  1. 压缩工具

图片相关的优化

png8/png24/png32之间的区别

不同图片常用的业务场景

进行图片压缩

css雪碧图

image inline

使用矢量图

在安卓下使用webp

图片压缩网址

css和js的装载与执行

html,css,js加载过程

输入网站,发起请求,服务器返回一段html,浏览器html解析器解析,从上到下生成dom树,在这个过程中,解析到相应的link,script等外部资源,然后由浏览器发起请求,加载到相应的资源并解析,生成对应的css树,css树和dom树结合,生成render tree,然后布局,重绘,形成html页面

html渲染过程中的一些特点

css阻塞

js阻塞

依赖关系

js引入方式

懒加载与预加载

原理

预加载的三种方法

1.直接在页面内通过img标签引入,默认隐藏
2.在js里文件new image对象,需要的时候直接引用
3.使用XMLHttpRequest对象加载图片,这个方法返回状态和回调函数,监听函数,更好控制整个过程,但是不同域名下的资源有跨域问题
4.使用preloadJS库

缓存优化

CDN缓存

CDN可以理解分布世界各地的节点,当用户浏览网站的时候,CDN会选择一个离用户最近的CDN边缘节点来响应用户的请求,这样在广州访问王者荣耀用户的请求就不会千里迢迢跑到北京的服务器(假设王者荣耀源站部署在北京)
CDN的优势很明显:
1.CDN解决了跨地域访问的问题,访问延时大大降低;
2.大部分请求在CDN边缘节点完成,CDN起了分流作用,减轻了源站的负载

//设置CDN边缘节点数据缓存时间
Cache-Control:max-age

当客户端向CDN节点请求数据时,CDN节点会判断缓存数据是否过期,若缓存数据并没有过期,则直接将缓存数据返回给客户端;否则,CDN节点会向源站发出请求,从源站获取最新数据,更新本地缓存,并将最新的数据返回给客户端。CDN服务商一般会提供基于文件后缀、目录多个维度来指定CDN缓存时间,为用户提供更精细化的缓存管理

DNS缓存

DNS(Domain Name System):解析域名找到IP地址服务器
DNS查找流程:首先查看浏览器缓存是否存在,不存在则访问本机DNS缓存;再不存在则访问远程DNS服务器,通常浏览器查找域名对应的IP地址需要花费20-120ms,在DNS查找完成之前,浏览器不能从host下载任何东西

浏览器缓存

1.Cache-Control:max-age
假如站点引入一个脚本文件,希望20年不变,这时浏览器把这个脚本缓存起来,不用每一次都请求服务器。这样节省宽带并且提升性能;

//设置Response的HTTP头中Cache-Control
Cache-Control:max-age=31536000

因为标准规定最多只能设置一年。这里设置了一年的缓存,以秒为单位。
但是,有一天发现脚本的文件要改了怎么办?很简单,改变请求的文件名就好了。这时浏览器会向服务器请求这个文件。
2.Expires
指一个绝对过期日期,如果过期了,客户端向服务器获取最新资源;这个过期时间是参照客户端的时间,修改客户端的时间等同于更改缓存命中结果,推荐与Cache-Control一块使用

//设置Response的HTTP头中Expires
Response Headers
Expires:Sat,24 Jan 2018 20:30:47 GMT
...

3.Last-Modified 和 If-Modified-Since

1.客户端第一次向服务器发送请求获取JS文件
2.服务器接收请求后将JS文件返回给客户端,响应头里JS文件最后的修改时间Last-modified:Sat,24 Jan 2018 20:30:47 GMT
3.客户端第二次发起请求获取JS文件,在这里会把第2步返回的修改时间放在请求头里If-Modified-Since:Sat,24 Jan 2018 20:30:47 GMT发送给服务器
4.服务器进行校验,检查修改文件的时间;如果文件没有修改过,通知客户端是最新版本;反之,则返回最新的JS文件给客户端

//第一次发起请求,响应头返回的修改文件时间
Response Headers
Last-Modified:Sat,24 Jan 2018 20:30:47 GMT
//第二次发起请求,请求头发送给服务器的修改文件时间
Request Headers
If-Modified-Since:Sat,24 Jan 2018 20:30:47 GMT

4.ETag 和 If-None-Match
场景:客户端发起请求获取JS文件,JS文件的内容加一个空格然后删除空格进行保存操作;这时候服务器会校验JS文件最后的修改的时间,发现匹配不上,服务器会重新将文件返回给客户端。可是,这样合理么?JS文件内容并没有被修改?
ETag的出现了,完美处理上述情况

1.客户端第一次向服务器发送请求获取JS文件
2.服务器接收请求后将JS文件返回给客户端,响应头里ETag :W/"262b9-Lo40+3qjAODueOOX6ceeIg"
3.客户端第二次发起请求获取JS文件,请求头里 If-None-Match:W/"262b9-Lo40+3qjAODueOOX6ceeIg"发送给服务器
4.服务器进行校验,检查文件内容是否变化了(ETag的值:是依据文件内容的哈希值生成);如果文件内容没有改变过,通知客户端是最新版本;反之,则返回最新的JS文件给客户端

//第一次发起请求,响应头返回ETag
Response Headers
ETag:W/"262b9-Lo40+3qjAODueOOX6ceeIg"
//第二次发起请求,请求头发送ETag的值给服务器
Request Headers
If-None-Match:W/"262b9-Lo40+3qjAODueOOX6ceeIg"

浏览器存储

多种浏览器存储方式并存,如何选择?

cookie

因为HTTP请求无状态,所以需要cookie去维护客户端状态

cookie存储的限制

localstorage

sessionstorage

IndexedDB

-IndexedDB 就是浏览器提供的本地数据库,它可以被网页脚本创建和操作。IndexedDB 允许储存大量数据,提供查找接口,还能建立索引。这些都是 LocalStorage 所不具备的。就数据库类型而言,IndexedDB 不属于关系型数据库(不支持 SQL 查询语句),更接近 NoSQL 数据库。

PWA

Progressive Web App(渐进性网页应用,简称PWA)是全新的网页技术,让网站的离线体验变得更好,网络连接断断续续时体验也会更好, 它会模拟一些原生功能。在移动端利用标准化框架,让网页应用呈现和原生应用相似的体验。

上一篇 下一篇

猜你喜欢

热点阅读