前端性能优化【前端必备】(含懒加载,手写防抖、节流等)

简介: 前端性能优化【前端必备】(含懒加载,手写防抖、节流等)

前端性能优化方向

  • 减少网络加载耗时
  • 减少 CPU 计算量

都可以考虑用空间换时间

让加载更快

减少资源体积

清理冗余的代码、图片和视频等无效资源

优化代码结构

将重复的代码提炼为公共组件、公共样式、全局变量和函数等。

打包构建时,将代码和资源进行压缩

减少访问服务器的次数

合并代码,减少代码文件数量

使用 SSR 服务器端渲染

将网页和数据一起加载,一起渲染,如早先的 JSP ASP PHP,现在的 vue React SSR

非 SSR(前后端分离) : 先加载网页,再加载数据,再渲染数据

以 webpack 打包构建的 hash 命名机制为例:

  • 静态资源加 hash 后缀,根据文件内容计算 hash
  • 文件内容不变,则 hash 不变,则 ur 不变
  • ur 和文件不变,则会自动触发 http 缓存机制,返回 304

使用更快的网络

使用 CDN 加载静态资源(通用的 js ,css 文件,图片,视频等)

让渲染更快

CSS 放在 head 里

<head>
    <meta charset="UTF-8">
    <title>网页标题</title>
    
    <!-- 引入外部 CSS 文件 -->
    <link rel="stylesheet" href="styles.css">
    
    <!-- 内联 CSS 样式 -->
    <style>
        body {
            background-color: #f1f1f1;
            font-family: Arial, sans-serif;
        }
        
        h1 {
            color: blue;
        }
    </style>
</head>

Js 放在 body 最下面

<body>
     <!-- 此处省略了其他HTML内容 -->
     
     <!-- 将JavaScript代码放置在body标签的最后部分 -->
     <script src="your_js_file.js"></script>
</body>

尽早执行JS,用DOMContentLoaded 触发

window.addEventListener("load", function () {
  // 页面的全部资源加载完才会执行,包括图片视频等
});
document.addEventListener("DOMContentLoaded", function () {
  // DOM 渲染完即可执行,此时图片、视频可能还没有加载完
});

使用懒加载

监听页面的滚动,当资源(如图片/视频)即将进入视口(用户可见的网页区域)时,再加载资源。

具体实现方法可参考

缓存DOM 查询

频繁的DOM 操作,合并到一起插入 DOM 结构

节流 throttle

含义:节省流量,即减少高频事件内操作的执行频率。

目标:让高频事件内的操作,按预期的频率触发

功效场景

  • 拖拽元素时,避免 drag 事件内的操作过于频繁的执行

原理:见下图

代码 : 需能手写

// 节流
function throttle(fn, delay = 100) {
    let timer = null

    return function () {
        if (timer) {
            return
        }
        timer = setTimeout(() => {
            fn.apply(this, arguments)
            timer = null
        }, delay)
    }
}

使用

const div1 = document.getElementById('div1')
div1.addEventListener('drag', throttle(function (e) {
    console.log(e.offsetX, e.offsetY)
}))

防抖 debounce

含义:防止抖动,即防止高频事件内的操作重复触发

目标:让高频事件内的操作等待高频事件结束时触发一次

功效:降低了高频事件内操作的频率,避免了性能的浪费,有效降低页面卡顿的风险。

场景

  • 监听用户输入,实时搜索(如百度搜索),用防抖来等待用户停止输入时,执行一次查询操作。
  • 不断地调整浏览器窗口大小会不断的触发 window 的 resize 事件,用防抖来等待用户停止调整浏览器窗口大小时,执行一次 resize 事件内的操作。

原理:见下图

代码 : 需能手写

// 防抖
function debounce(fn, delay = 500) {
    // timer 是闭包中的
    let timer = null

    return function () {
        if (timer) {
            clearTimeout(timer)
        }
        timer = setTimeout(() => {
            fn.apply(this, arguments)
            timer = null
        }, delay)
    }
}

使用

const input1 = document.getElementById('input1')
input1.addEventListener('keyup', debounce(function (e) {
    console.log(input1.value)
}, 600))


选择性能更优的页面渲染方案

动画渲染

  • 需实时更新的动画,使用 RAF
  • 简单的静态或者中等复杂度的动画,用 CSS
  • 若使用的 setTimeout 实现的动画,建议改用 CSS 或 RAF 进行优化!
    js 实现动画的两种方案对比:setTimeout vs RAF
目录
相关文章
|
4月前
|
前端开发 UED 开发者
颠覆你的前端知识:防抖与节流的区别及实战解析!
【8月更文挑战第23天】在Web前端开发中,处理用户界面交互产生的事件可能会影响性能。为此,我们有两种优化方法:防抖(debounce)和节流(throttle)。防抖确保函数仅在事件停止触发一段时间后执行一次,适用于如搜索自动补全场景。而节流则确保函数按固定时间间隔执行,不管用户操作频率如何。本篇技术博客将深入解析两者差异并提供示例代码,帮助开发者更好地理解和应用这些技巧以提升应用性能和用户体验。
91 0
|
1月前
|
前端开发 JavaScript 搜索推荐
前端懒加载:提升页面性能的关键技术
前端懒加载是一种优化网页加载速度的技术,通过延迟加载非首屏内容,减少初始加载时间,提高用户访问体验和页面性能。
|
2月前
|
前端开发
前端常用方法防抖(debounce)和节流(throttle)的示例演示及应用场景说明
前端常用方法防抖(debounce)和节流(throttle)的示例演示及应用场景说明
38 0
|
3月前
|
缓存 边缘计算 前端开发
关于前端性能优化问题,认识网页加载过程和防抖节流
该文章详细探讨了前端性能优化的方法,包括理解网页加载过程、实施防抖和节流技术来提升用户体验和性能。
|
7月前
|
前端开发 JavaScript UED
【前端面经】快手二面:节流和防抖知道吗?
【前端面经】快手二面:节流和防抖知道吗?
55 0
|
7月前
|
前端开发 UED
【Web 前端】防抖与节流的区别
【4月更文挑战第22天】【Web 前端】防抖与节流的区别
|
2月前
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
190 2
|
2月前
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
56 0
|
2月前
|
人工智能 自然语言处理 运维
前端大模型应用笔记(一):两个指令反过来说大模型就理解不了啦?或许该让第三者插足啦 -通过引入中间LLM预处理用户输入以提高多任务处理能力
本文探讨了在多任务处理场景下,自然语言指令解析的困境及解决方案。通过增加一个LLM解析层,将复杂的指令拆解为多个明确的步骤,明确操作类型与对象识别,处理任务依赖关系,并将自然语言转化为具体的工具命令,从而提高指令解析的准确性和执行效率。
|
2月前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。