前端性能优化

前言

性能优化这个问题,在面试的过程中问道的概率还挺大的,特别是对有前端开发经验的面试者来说,基本会被面试官问道关于性能优化的问题。但是在我们做项目的过程中,可能业务比较简单,并没有复杂到需要专门去优化的程度,复杂的业务呢,可能也优化不动。在被问到时可能会被问住(根本不需要优化…)。但是性能优化确实是值得关注的问题,并不是业务复杂到某种程度才去专门做优化。我觉得在平时的编码过程中有良好的习惯,时刻想着怎么写能更好一点,也能达到一种优化的作用。

如何优化代码

一说到优化可能一些比较官方的名词就来了,比如:

  1. 减少HTTP请求: 合并和压缩CSS、JavaScript文件,使用CSS Sprites或图标字体来减少图片请求,以及避免不必要的资源加载,从而减少页面加载时间。

  2. 使用浏览器缓存: 设置适当的缓存头,以便浏览器可以在下次访问时从缓存中加载资源,减少重复的网络请求。

  3. 压缩资源: 使用压缩算法(如Gzip)压缩传输的CSS、JavaScript和HTML文件,减少文件大小,从而降低带宽消耗和加载时间。

  4. 延迟加载: 将页面上不必要的内容延迟加载,如将图片、广告或其他不紧急的资源推迟加载,从而加快初始页面加载。

  5. 使用异步加载: 使用异步加载(例如asyncdefer属性)加载JavaScript,确保脚本不会阻塞页面的解析和渲染过程。

  6. 优化图片: 使用适当的图片格式(如WebP),调整图片质量和大小,使用响应式图片来适应不同屏幕尺寸,以减少图片加载时间。

  7. 最小化DOM操作: 减少对DOM的频繁操作,因为DOM操作通常会触发重排和重绘,影响页面性能。可以使用批量更新或虚拟DOM来优化。

  8. 减少重排和重绘: 避免频繁的样式更改,可以通过合并更改、使用CSS动画代替JavaScript动画等方式减少浏览器的布局和绘制操作。

  9. 代码拆分: 将代码拆分成多个模块或块,按需加载,以减少初始加载时间,特别是在较大的应用中。

  10. 使用CDN: 使用内容分发网络(CDN)来分发静态资源,这可以减少网络延迟,加快资源加载速度。

  11. 移除不必要的插件和库: 定期审查并移除不再使用的插件、库或功能,以减少页面的复杂性和加载时间。

  12. 性能监测和分析: 使用工具如Google PageSpeed Insights、Lighthouse、WebPageTest等来监测和分析页面性能,并根据建议进行优化。

  13. 服务端渲染(SSR)和预渲染: 对于某些应用场景,使用服务器端渲染或预渲染可以提前生成部分或全部页面内容,改善初始加载性能。

  14. 使用现代框架和技术: 现代前端框架如React、Vue等提供了优化性能的工具和技术,如虚拟DOM、组件化等。

  15. 优化移动端性能: 针对移动设备,考虑使用响应式设计、移动优化的图片和资源,以及避免不必要的操作和动画。

当然不止这些,这些方式肯定是一说到优化性能优化,就能想到的。其实在平时的业务开发中,用到这些也不是很多,我想说的是如何在平时的编码过程中如何尽可能的优化代码:

日常习惯

避免过多嵌套的DOM结构: 尽量保持浅层次的DOM结构,减少DOM元素的嵌套,从而提高渲染性能。

避免使用不必要的重复代码: 在代码中尽量避免重复的逻辑和代码块,可以考虑封装为函数或组件,以减少代码量和维护成本。

使用CSS Grid和Flexbox布局: 使用现代的布局技术,如CSS Grid和Flexbox,可以更轻松地创建复杂布局,减少额外的DOM元素。

利用浏览器缓存: 使用合适的缓存策略,充分利用浏览器的缓存机制,减少重复加载相同资源。

图片懒加载: 对于长页面或带有大量图片的页面,可以使用图片懒加载技术,只在图片进入视口时加载。

尽量减少使用JavaScript: 尽量使用HTML和CSS来实现一些效果,避免过多的JavaScript操作,从而减少性能开销。

精简第三方库: 如果你使用了第三方库,只导入你实际需要的功能,避免导入整个库。

减少DOM查询: 避免在循环中重复查询DOM元素,可以将查询结果缓存起来以提高性能。

延迟加载非必要的脚本: 将不必要的脚本标记为延迟加载,让页面能更快地呈现。

使用WebP格式图片: 如果浏览器支持,使用WebP格式图片,它通常比JPEG和PNG格式更小,加载更快。

使用字体图标或SVG代替图片: 字体图标和SVG图像通常比位图图像更小,同时可以在不失真的情况下进行缩放。

优化路由: 比如路由组件异步加载。对于单页应用,优化路由可以减少不必要的加载和渲染。

防抖与节流: 对于一些频繁的操作使用防抖或节流。

缓存: vue中频繁切换的组件使用KeepAlive进行缓存。react中比如memo,useMemo、useCallback等

使用内联样式: 对于页面上仅需要一次性使用的样式,可以考虑使用内联样式而不是外部CSS文件,减少额外的HTTP请求。

使用网络预取和预加载: 使用和来在空闲时间预取和预加载将来可能需要的资源。

**虚拟列表:**避免大数据量导致 DOM 操作量大。

**取消重复请求:**同一个接口多次请求时取消上一次没有完成的请求。

**loading加载:**对于一些确实比较慢的接口使用loading或骨架屏.

**卸载与取消:**组件卸载时取消事件的监听、取消组件中的定时器、销毁一些三方库的实例。

总结

总之,在日常写代码的过程中,无论业务复杂与否,养成好的习惯以及有固化的优化思想,一定很不错。在排查bug,或者后续的维护中能省力不少。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/62469.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c#接口(interface)

概述: 在C#中,接口是一种定义了一组相关方法、属性和事件的规范。接口可以被类或结构体实现,以提供一种方式来定义类之间的契约或协议。 接口定义了一组成员,这些成员没有具体的实现。实现接口的类必须提供这些成员的具体实现。…

linuxdeploy安装CentOS7搭建django服务

目录 一、busybox安装 二、linuxdeploy安装 三、linuxdeploy软件设置及安装 四、CentOS基础环境配置 五、CentOS7 上安装Python3.8.10 六、systemctl的替代品 七、CentOS7 上安装mysql5.2.27数据库 八、CentOS7 上安装Nginx服务 九、Django项目应用部署 参考文献: 一…

《Python入门到精通》webbrowser模块详解,Python webbrowser标准库,Python浏览器控制工具

「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:小白零基础《Python入门到精通》 webbrowser模块详解 1、常用操作2、函数大全webbrowser.open() 打开浏览器webbro…

线程同步与互斥

目录 前言:基于多线程不安全并行抢票 一、线程互斥锁 mutex 1.1 加锁解锁处理多线程并发 1.2 如何看待锁 1.3 如何理解加锁解锁的本质 1.4 CRAII方格设计封装锁 前言:基于线程安全的不合理竞争资源 二、线程同步 1.1 线程同步处理抢票 1.2 如何…

Python爬虫(十七)_糗事百科案例

糗事百科实例 爬取糗事百科段子,假设页面的URL是: http://www.qiushibaike.com/8hr/page/1 要求: 使用requests获取页面信息,用XPath/re做数据提取获取每个帖子里的用户头像连接、用户姓名、段子内容、点赞次数和评论次数保存到json文件内…

实现不同局域网文件共享的解决方案:使用Python自带HTTP服务和端口映射

文章目录 1. 前言2. 本地文件服务器搭建2.1 python的安装和设置2.2 cpolar的安装和注册 3. 本地文件服务器的发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 数据共享作为和连接作为互联网的基础应用,不仅在商业和办公场景有广泛的应用…

2023.8.26-2023.9.3 周报【3D+GAN+Diffusion基础知识+训练测试】

目录 学习目标 学习内容 学习时间 学习产出 学习目标 1. 3D方向的基础知识 2. 图像生成的基础知识(GAN \ Diffusion) 3. 训练测试GAN和Diffusion 学习内容 1. 斯坦福cv课程-3D (网课含PPT) 2. sjtu生成模型课件 3. ge…

TCP--半连接队列和全连接队列

原文地址:https://plantegg.github.io/2020/04/07/%E5%B0%B1%E6%98%AF%E8%A6%81%E4%BD%A0%E6%87%82TCP–%E5%8D%8A%E8%BF%9E%E6%8E%A5%E9%98%9F%E5%88%97%E5%92%8C%E5%85%A8%E8%BF%9E%E6%8E%A5%E9%98%9F%E5%88%97–%E9%98%BF%E9%87%8C%E6%8A%80%E6%9C%AF%E5%85%AC%E…

【OpenCL基础 · 一】因源

文章目录 前言一、单核标量处理器的瓶颈1.提升时钟频率2.提升指令级并行能力 二、多核和向量化1.多核2.向量化 三、异构并行和OpenCL1.GPGPU2.CUDA和OpenCL 前言 随着人工智能的发展以及大部分场景中实时性的要求,人们对于计算机算力要求逐渐增加。为了提高计算速度…

网络性能的四大指标:带宽、时延、抖动、丢包

原文链接:https://www.eet-china.com/mp/a82420.html 怎么去描述网络性能的好坏? 你如果说这个网络很好,那里的网络有点差!这无异于看这风景美如画,本想吟诗赠天下,怎奈自己没文化,只能卧槽浪好大。 我们得用专业的术语去描述它…

【ES】笔记-Promise基本使用

笔记-基本使用 一、初始Promise1. 抽象表达:2. 具体表达:为什么要用 Promise?promise的基本流程 二、fs读取文件三、AJAX请求四、Promise封装fs模块五、util.promisify方法六、Promise封装AJAX操作 一、初始Promise 1. 抽象表达: 1. Promise 是一门新的技术(ES6 规范) 2. Pr…

短视频矩阵系统接口部署技术搭建

前言 短视频矩阵系统开发涉及到多个领域的技术,包括视频编解码技术、大数据处理技术、音视频传输技术、电子商务及支付技术等。因此,短视频矩阵系统开发人员需要具备扎实的计算机基础知识、出色的编程能力、熟练掌握多种开发工具和框架,并掌握…

C++(17):异常处理

异常处理机制允许程序中独立开发的部分能够在运行时就出现的问题进行通信并做出相应的处理。 异常使得能够将问题的检测与解决过程分离开来:程序的一部分负责检测问题的出现,然后解决该问题的任务传递给程序的另一部分。检测环节无须知道问题处理模块的…

Python算法——滑动窗口问题

关于滑动窗口的概念,请自行到网上搜索相关资料,了解清楚再看本博客。 一、子组数最大平均数 LeetCode 第643题:https://leetcode.cn/problems/maximum-average-subarray-i/ 给你一个由 n 个元素组成的整数数组 nums 和一个整数 k 。 请你…

数据结构入门 — 栈

本文属于数据结构专栏文章,适合数据结构入门者学习,涵盖数据结构基础的知识和内容体系,文章在介绍数据结构时会配合上动图演示,方便初学者在学习数据结构时理解和学习,了解数据结构系列专栏点击下方链接。 博客主页&am…

【C++】关于using namepace xxx 使用命名空间和冲突

官方定义 namespace是指 标识符的各种可见范围。命名空间用关键字namespace来定义。 命名空间是C的一种机制,用来把单个标识符下的大量有逻辑联系的程序实体组合到一起。此标识符作为此组群的名字。 基本使用 编译及执行命令: g test.cpp -o test ./…

汽车制造行业,配电柜如何实施监控?

工业领域的生产过程依赖于高效、稳定的电力供应,而配电柜作为电力分配和控制的关键组件,其监控显得尤为重要。 配电柜监控通过实时监测、数据收集和远程控制,为工业企业提供了一种有效管理电能的手段,从而确保生产的连续性、安全性…

Python程序化交易接口批量获取数据源码

小编举例下面是一个简单的示例代码,展示如何使用Python的程序化交易接口批量获取数据,例如开发文档参考:MetaTradeAPI (metatradeapi) - Gitee.com 签名 int Init(); 功能 API 初始化 参数 无 返回值 授权成功的交易账户数量 返回值 &…

实战系列(一)| Dubbo和Spring Cloud的区别,包含代码详解

目录 1. 概述2. 核心功能3. 代码示例4. 适用场景 Dubbo 和 Spring Cloud 都是微服务架构中的重要框架,但它们的定位和关注点不同。Dubbo 是阿里巴巴开源的一个高性能、轻量级的 RPC 框架,主要用于构建微服务之间的服务治理。而 Spring Cloud 是基于 Spri…

学术加油站|基于端到端性能的学习型基数估计器综合测评

编者按 本文系东北大学李俊虎所著,也是「 OceanBase 学术加油站」系列第 11 篇内容。 「李俊虎:东北大学计算机科学与工程学院在读硕士生,课题方向为数据库查询优化,致力于应用 AI 技术改进传统基数估计器,令数据库选…