美文网首页
前端性能优化(二)

前端性能优化(二)

作者: Sommouns | 来源:发表于2019-05-05 11:06 被阅读0次

首先让我们看看html的渲染过程:


image.png

我们发送请求后,服务器返回我们html文档,浏览器的parser从上而下进行token分析,一点点生成dom树,当碰到link之类的并发去请求css文件,然后同时加载CSSOM,挂载到dom上,js也是类似,从而当CSSOM和DOM渲染完后,就开始渲染树,这时候就开始渲染页面了。

HTML的渲染过程

  • 顺序执行 通过nextToken一个个进行词法分析
  • 并发加载,并发加载依赖的资源比如css,js。但是一个域名下的并发加载数是有限制的,所以会造成一定的阻塞。
  • 阻塞,css阻塞js的执行,但不阻塞加载,html的加载阻塞js等等,因为js要操作dom对象,然后修改样式。总而言之,加载不会阻塞,执行会阻塞
  • 依赖关系,比如有时候页面的css还没加载出来,就会出现一下闪屏,这是css和dom的依赖,然后另一个就是js之间的相互依赖

这边顺便补充下 async 和 defer,这两种js的下载都会和html解析同时进行,只是执行的时机不一样,async的话会在下载完后执行,然后阻断html的解析,而defer会在html解析完后执行。


image.png

懒加载和预加载

懒加载(Lazyload)

  • 实现原理: 判断当前页面中某个元素距离Page顶部的高度是不是小于屏幕高度,小于的话,就把当前img的data-original属性替换到现在img的src上。
    原生实现方法:
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
        }
        rect = item.getBoundingClientRect() // 获取当前元素的位置信息

        if (rect.bottom >= 0 && rect.top < viewHeight) {
            !function() {
                var img = new Image()
                img.src = item.dataset.original
                img.onload = function() {
                    item.src = img.src
                }
                item.removeAttribute('data-ogiginal')
                item.removeAttribute('lazyload')
            }()
        }
    })
}

lazyload() // 解决首屏加载的问题

document.addEventListener('scroll', lazyload)

然后各个框架一般也都有自己的实现方法。

预加载(Preload)

  • 第一种方式,就是直接通过html标签,然后设置display为none
  • 第二种方法,就是new 一个Image对象,然后设置src
  • 第三种方法,使用XHR,优点是过程更加可控,但是会有跨域问 题
  • 第三方库,比如Preload.js

相关文章

  • 前端性能优化(中)

    性能优化调研系列文章 《前端性能优化(上)》 《前端性能优化(中)》 《前端性能优化(下)》 《前端性能优化(上)...

  • 前端性能优化(下)

    性能优化调研系列文章 《前端性能优化(上)》 《前端性能优化(中)》 《前端性能优化(下)》 《前端性能优化(中)...

  • 前端性能优化(上)

    性能优化调研系列文章 《前端性能优化(上)》 《前端性能优化(中)》 《前端性能优化(下)》 为什么要进行前端性能...

  • 前端面试必问及加分点---性能优化篇

    如何进行网站性能优化 你有用过哪些前端性能优化的方法? 谈谈性能优化问题 代码层面的优化 前端性能优化最佳实践

  • 前端性能优化

    对于前端的性能优化,主要有分为加载优化和性能优化。在Google官方文档中,给出了性能优化有哪些好处。前端优化的最...

  • 常用的后端性能优化六种方式:缓存化+服务化+异步化等

    性能优化专题 前端性能优化 数据库性能优化 jvm和多线程优化 架构层面优化 缓存性能优化 常用的后端性能优化六大...

  • 关于前端性能优化问题详解

    关于前端性能优化问题详解 出处:http://segmentfault.com/blogs 前端性能优化指南 AJ...

  • 前端性能优化

    前端性能优化 下面是我认知的前端性能优化的策略,本书主要着手 JavaScript 优化展开阐述。 JavaScr...

  • 2019-10-22

    2018 前端性能优化清单

  • 2020-04-11

    前端工程化相关 前端动画相关 优化前端性能

网友评论

      本文标题:前端性能优化(二)

      本文链接:https://www.haomeiwen.com/subject/hdkcoqtx.html