一.总体思路
前端输入url后发生的事情
- 输入url,计算机先解析域名,先看本地有没有相应的域名,否则请求isp,经过迭代递归查询dns后,获取域名对应的ip地址
- 获取ip地址后,与主机三次握手建立连接。
- 请求主机资源
- 主机响应,返回相关资源
- 浏览器获得资源,进行解析,直到解析完成后浏览器渲染。
因此,优化思路主要从两方面进行,第一是资源加载的流程,第二是浏览器渲染。
二.资源加载优化思路
优化资源加载的思路主要有下面这几种
- 1.减少资源体积
1)资源压缩,gzip,图片压缩,tinypng,Terser 压缩js,压缩css,压缩html等。
2)treeShake
2.减少请求次数
为什么?因为浏览器限制,例如谷歌浏览器,同一域名下,get请求的并发限制为1,也就是说必须等上一个请求完后才能请求下一个请求。不同域名的请求并发请求次数为6
如何减少?
1)图片可以使用雪碧图,或者懒加载
2)合并css和js文件
三 渲染流程优化思路
四 加载时间计算
// 计算加载时间
function getPerformanceTiming () {
var performance = window.performance;
if (!performance) {
// 当前浏览器不支持
console.log('你的浏览器不支持 performance 接口');
return;
}
var t = performance.timing;
var times = {};
//【重要】页面加载完成的时间
//【原因】这几乎代表了用户等待页面可用的时间
times.loadPage = t.loadEventEnd - t.navigationStart;
//【重要】解析 DOM 树结构的时间
//【原因】反省下你的 DOM 树嵌套是不是太多了!
times.domReady = t.domComplete - t.responseEnd;
//【重要】重定向的时间
//【原因】拒绝重定向!比如,http://example.com/ 就不该写成 http://example.com
times.redirect = t.redirectEnd - t.redirectStart;
//【重要】DNS 查询时间
//【原因】DNS 预加载做了么?页面内是不是使用了太多不同的域名导致域名查询的时间太长?
// 可使用 HTML5 Prefetch 预查询 DNS ,见:[HTML5 prefetch](http://segmentfault.com/a/1190000000633364)
times.lookupDomain = t.domainLookupEnd - t.domainLookupStart;
//【重要】读取页面第一个字节的时间
//【原因】这可以理解为用户拿到你的资源占用的时间,加异地机房了么,加CDN 处理了么?加带宽了么?加 CPU 运算速度了么?
// TTFB 即 Time To First Byte 的意思
// 维基百科:https://en.wikipedia.org/wiki/Time_To_First_Byte
times.ttfb = t.responseStart - t.navigationStart;
//【重要】内容加载完成的时间
//【原因】页面内容经过 gzip 压缩了么,静态资源 css/js 等压缩了么?
times.request = t.responseEnd - t.requestStart;
//【重要】执行 onload 回调函数的时间
//【原因】是否太多不必要的操作都放到 onload 回调函数里执行了,考虑过延迟加载、按需加载的策略么?
times.loadEvent = t.loadEventEnd - t.loadEventStart;
// DNS 缓存时间
times.appcache = t.domainLookupStart - t.fetchStart;
// 卸载页面的时间
times.unloadEvent = t.unloadEventEnd - t.unloadEventStart;
// TCP 建立连接完成握手的时间
times.connect = t.connectEnd - t.connectStart;
return times;
}