• 前端性能分析


    一.总体思路

     前端输入url后发生的事情
    
    • 1
    • 输入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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
  • 相关阅读:
    金融行业数据安全法律法规清单
    未来会是一个编程普及的时代吗?
    快速理解 JVM 内存模型 & 对象组成 & 对象内存分配
    NumPy 数组迭代与合并详解
    因果推断概述
    style=“width: ___“ VS width=“___“
    Rust逆向学习 (2)
    SpringBoot 统一登录鉴权、异常处理、数据格式
    C#/VB.NET 实现Word和ODT文档相互转换
    计算机毕设 大数据工作岗位数据分析与可视化 - python flask
  • 原文地址:https://blog.csdn.net/qq_37524886/article/details/127592499