工作生活

性能优化总结

2019-07-08  本文已影响0人  _小海绵

资源的合并与压缩

图片相关优化

CSS JS的加载与执行

  1. 一个网站在浏览器端是如何被渲染的?


    页面加载渲染过程.png
  2. HTML渲染过程特点:

    1. 顺序执行(自上而下) 并发加载(浏览器对域名的加载数量有限制)
    2. 是否阻塞
      1. CSS阻塞
        1. CSS在head中以link形式引入会阻塞页面的渲染,需等link标签所引入的CSS加载后,方进行渲染。
        2. CSS会阻塞JS的执行(JS执行可能会依赖已经生成好CSS的DOM)。
        3. CSS不阻塞外部脚本加载。
        4. CSS加载方式
          1. link 2. @import 3. 行内样式 4. 内部样式表
        5. link与@import的区别:
          1. link功能更多,可以定义RSS,Rel等,@import只能加载CSS。
          2. 解析link时,页面会同步加载css。@import所引用的只能等页面加载完成后加载。
          3. @import需要IE5以上
          4. link可以JS引入。@import不可
        6. CSS选择器优先级
          1. !important > 行内 > id > class >tag > * > 继承 > 默认
          2. 从右向左解析
          3. 约具体优先级越高,后面的会覆盖前面的
        7. CSS书写顺序:位置属性 > 大小 > 文字系列 > 背景边框 > 其他
      2. JS阻塞
        1. <script>直接引入会阻塞页面的渲染(JS执行可能会改变现有页面结构)。
        2. JS不会阻塞资源的加载。
        3. JS顺序执行,阻塞后续JS逻辑的执行。
        4. defer属性:
          1. 延迟脚本执行,DOM加载完成后再执行脚本。
          2. 非外部引入的内置<script>标签defer属性不生效,也不应该在外部脚本中使用document.write
        5. async属性:
          1. 使用另一个进程下载脚本,下载时不会阻塞渲染,脚本下载完毕后暂停解析HTML,执行该脚本,脚本执行完毕后恢复解析HTML。
          2. 当同时多个外部脚本加载时,无法保障执行顺序,哪个先下载完成就先执行哪个。
        6. 脚本直接无依赖关系就使用async,反之用defer。
        7. 同时使用async与defer时,defer不起作用,由async决定。
    3. 依赖关系
    4. 引入方式

懒加载与预加载

  1. 懒加载:

    1. 图片进入可视区域之后请求图片资源。
    2. 适用于电商等图片很多,页面很长的业务场景。
    3. 可以有效的减少无效资源的加载。
    4. 并发记载的资源过多会阻塞js加载,影响网站的正常使用。
    /**HTML部分**/
    <img src="" class="image-item" lazyload="true" data-original="图片路径"/>
    /**JS部分**/
    //获取可是区域的高度
    var viewHeight = document.documentElement.clientHeight;
    function lazyload() {
        var eles = document.querySelectorAll('img[data-original][lazyload]')
        Array.prototype.forEach.call(eles, function (item, index) {
            var rect;
            if (item.dataset.original === '') {
              return
            }
            //getBoundingClientRect:返回元素的大小及其相对于视口的位置。
            rect = item.getBoundingClientRect()
            if (rect.bottom >= 0 && rect.top < viewHeight) {
              !function () {
                var img = new Image()
                img.src = item.dataset.url
                img.onload = function () {
                  item.src = img.src
                }
                item.removeAttribute("data-original")
                item.removeAttribute("lazyload")
              }()
            }
        }
    }
    //手动调用,使第一屏图片正常显示
    lazyload()
    document.addEventListener('scroll', lazyload)
    //需要预先设置图片高度占位,如果图片没有预设高度,每个img的hight几乎为零,会导致首屏可是区域图片过多。
    
  2. 预加载

    1. 图片等静态资源在使用之前的提前请求。
    2. 资源被需要时可以从缓存中加载,提升用户体验。
    3. 页面展示的依赖关系维护。
    //解决方案1:使用Image对象
        var image = new Image()
        image.src = "图片地址"
    //解决方案2:使用XMLHttpRequest对象
        //优:对整个请求过程有更好的监控,可以更好的控制传输过程。
        //缺:存在跨域问题
    //解决方案3:使用preload.js
    
    

重绘与回流

浏览器存储

浏览器缓存

服务端性能优化

上一篇下一篇

猜你喜欢

热点阅读