粥里有勺糖

vuePress-theme-reco 粥里有勺糖    2018 - 2023
粥里有勺糖 粥里有勺糖

Choose mode

  • dark
  • auto
  • light
关于我
备战春秋
  • 心得总结
  • 校招考点汇总
  • 面经汇总
  • 复习自查
技术笔记
  • 技术教程
  • 模板工程
  • 源码学习
  • 技术概念
  • 个人作品
  • 学习笔记
计算机基础
  • 算法与数据结构
  • 操作系统
  • 计算机网络
  • 设计模式
  • 剑指offer
大前端
  • javascript
  • vue
  • html
  • css
  • 🌏浏览器专题
  • Web性能优化
  • regexp
  • node
面试
  • 问解
  • javascript
  • css
  • 手撕代码
  • 性能优化
  • 综合问题
  • 面经汇总
  • 小程序
手撕代码
  • 数据结构与算法
  • javascript
  • css
个人站点
  • GitHub (opens new window)
  • 博客园 (opens new window)
  • 掘金 (opens new window)
线上作品
  • 轻取(文件收集) (opens new window)
  • 个人图床 (opens new window)
  • 考勤小程序 (opens new window)
  • 时光恋人 (opens new window)
  • 在线简历生成 (opens new window)
留言板
Github (opens new window)
author-avatar

粥里有勺糖

285

文章

40

标签

关于我
备战春秋
  • 心得总结
  • 校招考点汇总
  • 面经汇总
  • 复习自查
技术笔记
  • 技术教程
  • 模板工程
  • 源码学习
  • 技术概念
  • 个人作品
  • 学习笔记
计算机基础
  • 算法与数据结构
  • 操作系统
  • 计算机网络
  • 设计模式
  • 剑指offer
大前端
  • javascript
  • vue
  • html
  • css
  • 🌏浏览器专题
  • Web性能优化
  • regexp
  • node
面试
  • 问解
  • javascript
  • css
  • 手撕代码
  • 性能优化
  • 综合问题
  • 面经汇总
  • 小程序
手撕代码
  • 数据结构与算法
  • javascript
  • css
个人站点
  • GitHub (opens new window)
  • 博客园 (opens new window)
  • 掘金 (opens new window)
线上作品
  • 轻取(文件收集) (opens new window)
  • 个人图床 (opens new window)
  • 考勤小程序 (opens new window)
  • 时光恋人 (opens new window)
  • 在线简历生成 (opens new window)
留言板
Github (opens new window)
  • Performance

    • 性能优化
    • 网络层面优化
    • CDN的缓存与回源机制
    • DNS 预解析
    • 图片优化
    • 懒加载与执行
    • 监控
    • 资源预加载
    • 页面预渲染
    • 服务端渲染
    • 节流与防抖

懒加载与执行

vuePress-theme-reco 粥里有勺糖    2018 - 2023

懒加载与执行

粥里有勺糖 2020-04-14 大前端性能优化

# 懒加载与执行

# 懒执行

将某些逻辑延迟到使用时再计算。

可以用于首屏优化,对于某些耗时逻辑并不需要在首屏就使用,就可以使用懒执行。

懒执行需要唤醒,可以通过定时器或者事件的调用来唤醒。

# 懒加载

懒加载就是将不关键的资源延后加载。

懒加载的原理就是只加载自定义区域(通常是可视区域,也可以是即将进入可视区域的资源)内需要加载的资源。

对于图片来说,先设置图片标签的 src 属性为一张占位图,将真实的图片资源放入一个自定义属性中,当进入自定义区域时,就将自定义属性替换为 src 属性,这样图片就会去下载资源,实现了图片懒加载。

懒加载不仅可以用于图片,也可以使用在别的资源上。比如进入可视区域才开始播放视频等等。

简单实现

let doc = document.createDocumentFragment()

// 屏幕可见高度 
const screenHeight = window.innerHeight || document.documentElement.clientHeight
/**
* 节流函数
*/
function throttle(fn, delay) {
    let start = Date.now()
    return function () {
        if (start + delay >= Date.now()) {
            return
        }
        start = Date.now()
        fn.apply(this, [...arguments])
    }
}

// 加载真实图片
function loadImg() {
    let imgs = Array.from(document.querySelectorAll('img[lazy]'))
    for (img of imgs) {
        let { top, bottom } = img.getBoundingClientRect()
        // 如果默认图片还没加载完成就等一会儿在判断
        if (top === bottom) {
            setTimeout(() => {
                loadImg()
            }, 100)
            return
        }
        if ((top >= 0 && top < screenHeight) || (bottom >= 0 && bottom < screenHeight)) {
            img.src = img.getAttribute('lazy')
            img.removeAttribute('lazy')
        }
    }
}
// 生成测试数据
function init() {
    let i = 100
    while (i--) {
        let img = document.createElement('img')
        img.src = 'https://img.cdn.sugarat.top/mdImg/MTU4MzM5NzA0NzA5OA==583397047098'
        img.setAttribute('lazy', 'https://img.cdn.sugarat.top/mdImg/MTU4MzM5NzEyNTYzOA==583397125638')
        doc.appendChild(img)
    }
    document.body.append(doc)
}
init()
document.onscroll = throttle(loadImg, 200)
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

CodePen:示例 (opens new window)

Edit this page (opens new window)
Last Updated: 2022/5/15 12:46:34