Web 前端开发 让前端飞

前端常用性能优化详解

2017-05-04  本文已影响0人  JokerPeng

一、减少HTTP请求

每个请求都是有成本的,既包含时间成本也包含资源成本。一个完整的请求都需要经过 DNS寻址、与服务器建立连接、发送数据、等待服务器响应、接收数据这样一个 “漫长” 而复杂的过程。时间成本就是用户需要看到或者 “感受” 到这个资源是必须要等待这个过程结束的,资源上由于每个请求都需要携带数据,因此每个请求都需要占用带宽。

另外,由于浏览器进行并发请求的请求数是有上限的 ,因此请求数多了以后,浏览器需要分批进行请求,因此会增加用户的等待时间,会给用户造成站点速度慢这样一个印象,。

常用的具体操作方法有:资源的压缩与合并,CSS Sprites等

二、非核心代码异步加载

1、异步加载方式
var myScript= document.createElement("script");
myScript.type = "text/javascript";
myScript.src="a.js";
document.body.appendChild(myScript);
2、defer和async的区别

三、利用浏览器的缓存

浏览器缓存是提高性能最重要的一步!

获取资源形式 状态码 发送请求到服务器
强缓存 right-aligned 200(from cache) 否,直接从缓存取
协议缓存 centered 304(not modified) 是,通过服务器来告知缓存是否可用
1、强缓存(本地缓存)

强缓存相关的header字段:

2、协商缓存

协商缓存相关的header字段:

这两个值是由服务器生成的每个资源的唯一标识字符串,只要资源有变化就这个值就会改变;其判断过程与Last-Modified/If-Modified-Since类似,与Last-Modified不一样的是,当服务器返回304 Not Modified的响应时,由于ETag重新生成过,response header中还会把这个ETag返回,即使这个ETag跟之前的没有变化。

服务器返回资源的时候会返回一个Etag值,当过了强缓存的时间,浏览器再去向服务器请求资源,HTTP会加一个key值即If-None-Match,和value值即Etag即 If-None-Match: Etag

通过在Nginx里server配置中设置加上etag on来开启etag。

Last-Modified与ETag是可以一起使用的,服务器会优先验证ETag,一致的情况下,才会继续比对Last-Modified,最后才决定是否返回304。

使用浏览器缓存流程图

额外:

为什么既生Last-Modified何生Etag?

你可能会觉得使用Last-Modified已经足以让浏览器知道本地的缓存副本是否足够新,为什么还需要Etag呢?HTTP1.1中Etag的出现主要是为了解决几个Last-Modified比较难解决的问题:

四、使用CDN

CDN:内容分发网络(Content delivery network或Content distribution network)是指一种通过互联网互相连接的电脑网络系统,利用最靠近每位用户的服务器,更快、更可靠地将音乐、图片、视频、应用程序及其他文件发送给用户,来提供高性能、可扩展性及低成本的网络内容传递给用户。

举个栗子:

以前还没有火车票代售点,12306.cn也只不过是最近几年才有。那时候火车票还智能在火车站的售票大厅购买,好多小县城不通火车,火车票要到市里去买,从小县城到市里去买火车票来回要花不少时间。

后来小县城有了火车票代售点,可以直接在代售点购买车票,方便了很多,全市人民再也不用苦逼的排队在一个点买票了,可以分散到不同的火车票代售点。那么CDN就可以理解为分布在每个县城的火车票代售点,用户在浏览网站时,CDN会选择一个离用户最近的CDN边缘节点来响应用户的请求,这样上海的移动用户的请求就不用千里迢迢跑到北京电信机房的服务器上了(假设源站部署在北京电信机房)。

这样,CDN节点解决了跨运营商和跨地域访问的问题,访问时间大大降低,同时,大部分请求在CDN边缘节点完成,CDN起到了分流作用,减轻了源站的负载。

五、预解析DNS

上一篇下一篇

猜你喜欢

热点阅读