【阿里前端面试题】聊聊前端性能优化的方案,解决过什么样的性能问题?

news2025/1/21 2:52:44

大家好,我是“寻找DX3906”。每天进步一点。日积月累,有朝一日定会厚积薄发!

前言:

前面已经和大家分享了4篇面试题:

             《【阿里前端面试题】浏览器的加载渲染过程》

             《【阿里前端面试题】客户端和服务器交互,为什么选用tcp协议建立链接?》

             《【阿里前端面试题】客户端和服务器交互的过程中,丢包是怎么产生的?》

             《【阿里前端面试题】知道了解浏览器渲染对自己有什么帮助?》

        从上面的面试题可以看出,面试官在从一个“浏览器的加载渲染”的问题,一步一步的引导和验证面试者的实际工作经验。

        前端性能优化在面试中出现概率很高。不了解前端的性能优化并不会影响你成为一名合格的前端工程师。但它是每一个优秀的前端工程师多多少少都需要知道的东西。

那我们就从浏览器渲染加载和交互的角度,来切入这个前端性能优化的话题。 

第一方案:使用函数节流和函数防抖-(接口数量多,重复调用)

       函数节流(Throttling)和函数防抖(Debouncing)是两种在JavaScript编程中常用的优化技术,它们主要用于控制函数的执行频率,提高程序的性能和用户体验。

函数节流(Throttling)

作用: 节流主要用于控制函数在一定时间内只能执行一次。这在处理诸如窗口大小调整、滚动等频繁触发的事件时非常有用。

优点:

  1. 频率控制:可以保证函数在指定的时间间隔内最多只执行一次,避免因事件频繁触发而导致的性能问题。
  2. 性能优化:减少函数执行次数,降低CPU占用率,提高应用响应速度。
  3. 适用性广:适用于任何需要限制事件触发频率的场景。

示例场景:

  • 浏览器窗口大小改变事件。
  • 滚动事件。
  • 连续的按键事件。
函数防抖(Debouncing)

作用: 防抖确保函数在事件触发后等待一定的延迟时间后才执行,如果在这段延迟时间内再次触发事件,则重新开始计算延迟时间。

优点:

  1. 延迟执行:可以延迟函数的执行,直到停止触发事件一段时间后。
  2. 避免抖动:适用于用户输入等场景,避免因用户操作未完成而导致的函数错误执行。
  3. 提高效率:减少因连续快速触发事件而导致的函数执行次数。

示例场景:

  • 用户输入搜索框。
  • 连续的点击事件。
  • 鼠标连续移动(如拖拽)。
总结
  • 节流:适合那些我们希望在触发事件后,每隔一定时间执行一次的场景。
  • 防抖:适合那些我们希望在触发事件操作完成后才执行一次的场景。

        两者都是为了优化性能和用户体验,选择使用哪一个取决于具体的应用场景和需求。在实际开发中,根据事件的特性和业务逻辑的需要,合理选择节流或防抖,有时也可以结合使用两者,以达到更好的效果。

具体解决方案,可以参考以前分享的文章:

《【解决方案】【最佳实践】测试小姐姐动了我的奶酪:JS前端节流与防抖》

第二方案:减少DOM重排和重绘-(页面DOM重复渲染)

性能影响:

         DOM重排可能导致性能问题,因为它需要浏览器进行大量的计算来重新布局页面。如果重排的元素较多或较复杂,这个过程可能会很耗时。

        相比DOM重排,重绘通常对性能的影响较小,因为它不需要计算布局变化,只是简单地“涂抹”像素。

最佳实践:

为了提高网页性能,可以采取以下措施减少DOM重排和重绘:

  1. 减少DOM操作:尽量一次性修改多个属性,而不是分开多次修改,这样可以减少浏览器的重排次数。
  2. 使用文档片段(Document Fragment):当需要添加多个节点到DOM时,使用文档片段来处理,然后再一次性将片段添加到文档中。
  3. 使用CSS变换(Transform):对于位置或尺寸的改变,使用CSS的transform属性可以避免触发重排,因为变换在合成层(合成器)上处理。
  4. 使用CSS动画(Animation):对于复杂的视觉效果,使用CSS动画而不是JavaScript动画,因为CSS动画可以更高效地利用浏览器的优化。
  5. 避免使用昂贵的CSS属性:有些CSS属性(如box-shadowborder等)会触发昂贵的重排或重绘,应谨慎使用。
  6. 使用requestAnimationFrame:在进行动画或连续的DOM更新时,使用requestAnimationFrame可以确保在浏览器的下一次重绘之前更新DOM,从而提高性能。
  具体解决方案,可以参考以前分享的文章:

【浏览器渲染机制】回流(Reflow)和重绘(Repaint)

第三方案:前端代码工程打包,开启GZIP压缩-(静态资源压缩,接口数据压缩)

     开启GZIP压缩在前端开发中带来的好处主要包括以下几点:
  1. 减少传输数据量:GZIP是一种通用的文件压缩算法,可以显著减少文件大小,这意味着在网络传输时需要发送的数据量减少。

  2. 加快加载速度:由于需要传输的数据量减少,文件加载速度会加快,这可以提升用户体验,尤其是在带宽有限或网络条件不佳的情况下。

  3. 减少服务器负载:压缩后的数据量减少,可以减轻服务器的负载,尤其是在高流量情况下。

  4. 提高缓存效率:压缩后的文件更小,缓存效率更高,这有助于提高页面的重复访问速度。

  5. 节省存储空间:在服务器上存储压缩后的文件可以节省存储空间。

  6. 提高搜索引擎优化(SEO):加载速度是搜索引擎排名的一个因素,开启GZIP压缩可以间接提高网站的SEO。

  7. 兼容性好:几乎所有现代浏览器都支持GZIP压缩,因此无需担心兼容性问题。

  8. 配置简单:在服务器上配置GZIP压缩通常很简单,许多服务器软件(如Apache、Nginx等)都支持GZIP压缩的配置。

  9. 自动处理:一旦配置好,GZIP压缩通常是自动处理的,无需开发者手动压缩每个文件。

  10. 支持多种文件类型:GZIP可以压缩多种类型的文件,包括HTML、CSS、JavaScript等。

开启GZIP压缩是一个简单且有效的方法,可以提升网站的性能和用户体验。不过,需要注意的是,压缩和解压过程会消耗服务器的CPU资源,因此在资源非常有限的服务器上,可能需要权衡压缩带来的性能提升和CPU资源消耗之间的关系。

具体解决方案,可以参考以前分享的文章:

【解决方案】前端React 、Vue工程如何开启GZIP压缩

第四方案:使用骨架屏-(页面加载,交互感知性能优化)

      当用户在浏览网页时,如果遇到长时间的加载过程,他们往往会感到不耐烦,甚至可能在页面完全加载前就选择离开。为了避免这种情况,除了采取压缩代码、利用缓存等技术手段来提升页面加载速度外,还可以通过引入一种称为“骨架屏”的界面设计来改善用户体验。这种设计通过展示一个页面的基本结构和布局,即使在内容完全加载之前,也能给用户一种页面正在积极加载的印象,从而减少用户的等待焦虑,提高他们对网站的整体满意度。

第五方案:正确使用defer或把javascript脚本放在最后加载

        脚本的下载和执行,会阻塞其他资源(样式文件或图片)的下载。因此,将<script>标签尽量尽可能放到<body>标签的底部。

        在传统的网页开发中,我们倾向于将<script>标签放置在HTML文档的底部,这样做的目的是为了让浏览器在解析HTML内容时不会被JavaScript的执行所干扰,从而提高页面的加载速度和用户体验。

        然而,如果出于某些原因,我们需要在文档的头部或者中间位置放置<script>标签,同时又希望避免JavaScript的加载和执行影响页面的渲染过程,我们可以使用defer属性来实现这一需求。

        使用defer属性的<script>标签可以保证JavaScript文件在下载时不会阻塞页面的解析过程,并且会在DOM完全构建完成以及CSS样式完全渲染之后,才开始执行脚本。这意味着,即使<script>标签位于HTML文档的前面,页面的渲染也不会因为JavaScript的加载而被延迟。

        简而言之,defer属性允许我们合理安排<script>标签的位置,同时确保页面的渲染流程不受影响,从而实现页面加载性能和脚本执行效率的双重优化。

第六方案:图片优化

       1.将png/jpg/gif图片替换为webp格式图片

        WEBP图片格式是一种先进的图像压缩技术,它在减少文件大小方面做得比传统的PNG和JPG格式更好。这意味着使用WEBP格式的图片可以更快地加载,节省网络流量,并且缩短用户等待页面加载的时间。

        WEBP还有一个优点,它提供了两种压缩方式:一种是有损压缩,类似于JPG,可以在保持较小文件大小的同时减少一些图像质量;另一种是无损压缩,类似于PNG,保持图像的完美质量,但文件大小也相对较大。

      如果你想要尝试WEBP格式的压缩效果,可以使用一个叫做Squoosh的在线工具来轻松实现,它是免费的,并且可以让你直观地比较压缩后的文件大小。

        关于浏览器的兼容性,现在大多数浏览器都支持WEBP格式,大约有95%的市场份额。对于那些少数不支持WEBP的浏览器,比如Internet Explorer,我们可以通过一些技术手段来确保它们也能正常显示图片,所以不需要太担心兼容性问题。

       2.图片懒加载

       我们打开一个网页,很多时候我们第一眼看到的只是页面的一小部分,也就是所谓的"首屏"。首屏之外的图片,如果我们一开始就全部加载,就好比买了很多可能用不到的东西,既浪费钱又占地方。

为了避免这种浪费,我们可以采取一种叫做"懒加载"的技巧。这个技巧的意思就是:我们先不给图片指定具体的存放位置,而是等到图片快要被我们看到的时候,才告诉浏览器去加载这张图片。

具体来说,就是:

  1. 占位符:一开始,我们先给图片的位置放一个"占位符",比如一个空白的框或者一个小图标,表示这里有一张图片。

  2. 等待时机:然后,我们等待用户滚动页面,当图片快要进入我们的视线时,我们再告诉浏览器去加载这张图片。

  3. 加载图片:一旦图片的位置被我们看到,浏览器就会收到指令,开始加载这张图片,然后图片就会显示出来。

这样做的好处是:

  • 节省资源:不需要一开始就加载所有的图片,节省了带宽和加载时间。
  • 加快速度:页面打开的速度会更快,因为减少了一开始需要加载的内容。
  • 提升体验:用户可以更快地看到页面的内容,不需要等待所有的图片都加载完成。

总的来说,懒加载就像是我们去超市购物,只买我们真正需要的东西,而不是一次性把所有可能用到的东西都买回家。这样既节省了钱,又让家里看起来更整洁。

       3.采用svg图片或者字体图标

        字体图标和SVG图像是由代码构建的矢量图形,它们就像数字世界里的变形金刚,无论放大多少倍,都能保持清晰,不丢失细节。使用时,它们跟文字一样灵活,可以随意调整大小、颜色等属性,就像给文字换颜色和大小一样简单。更赞的是,这些图标文件小巧玲珑,不会占用太多空间,让网页加载更快,体验更流畅。

第七方案:SSR服务端渲染

        采用服务端渲染(SSR)技术,可以大幅提升页面首次加载速度,因为它只加载首页,对搜索引擎优化(SEO)也很有利。不过,SSR可能导致服务器负载增加,且页面数据更易被爬虫获取。

        目前,nuxt.js和next.js是两个广泛使用的SSR框架,它们帮助开发者便捷地实现SSR功能。

第八方案:合理使用浏览器缓存策略

       浏览器缓存策略是一种优化网页加载速度的技术,它通过减少服务器请求和重复数据传输来提高网页的加载效率。以下是浏览器缓存策略的几个关键点:

  1. 强缓存(HTTP缓存)

    • 浏览器在首次请求资源后,会根据HTTP响应头中的Cache-ControlExpires字段来决定是否可以从本地缓存中读取数据,而无需再次请求。
    • 强缓存适用于不经常变动的资源,如CSS、JavaScript文件和图片。
  2. 协商缓存

    • 当资源有可能发生变化时,浏览器会使用ETagLast-Modified字段来与服务器进行验证。
    • 如果资源未发生变化,服务器会返回304 Not Modified状态码,告诉浏览器可以使用本地缓存的版本。
  3. Service Workers

    • Service Workers是一种运行在浏览器后台的脚本,可以拦截网络请求并返回缓存的响应。
    • 开发者可以编写自定义的缓存策略,控制哪些请求可以被缓存,哪些需要从网络获取。
  4. 浏览器行为

    • 不同的浏览器可能对缓存的处理方式略有不同,但大多数现代浏览器都遵循HTTP规范。
    • 用户可以通过清除浏览器缓存来手动刷新页面资源。
  5. 缓存更新

          开发者可以通过设置合适的HTTP头来控制资源的缓存行为,比如通过Cache-Control: no-cache强制浏览器每次都检查资源是否更新。
  6. 缓存位置

           浏览器缓存通常分为内存缓存和磁盘缓存。内存缓存读取速度快,但关闭浏览器后缓存会丢失;磁盘缓存则可以持久存储。
  7. 缓存粒度

           可以针对单个资源设置缓存策略,也可以针对整个网站或特定类型的资源进行设置。
  8. 性能影响

           合理配置缓存策略可以显著提高网页的加载速度和用户体验,减少服务器的负载。

通过这些策略,浏览器能够智能地决定何时从本地缓存读取数据,何时从服务器获取最新数据,从而平衡加载速度和数据的实时性。

前端性能优化检测工具:

前端性能优化的检测工具有很多,可以帮助开发者定位和解决性能问题,以下是一些常用的性能检测工具:

  1. Lighthouse

    • 由Google开发,是一个开源的自动化工具,用于改进网络应用的质量。
    • 可以作为Chrome扩展程序运行,或从命令行运行。
    • 能够生成有关页面性能的详细报告,包括加载性能、SEO、PWA等多个方面。
  2. WebPageTest

    • 一个在线工具,可以测试网站的加载速度和性能。
    • 提供详细的瀑布流图表,帮助分析网络请求和响应时间。
    • 支持从不同地理位置和网络条件下进行测试。
  3. Chrome DevTools

    • 内置于Google Chrome浏览器的一套开发者工具。
    • 提供性能分析、网络分析、内存分析等功能。
    • 可以记录页面的帧率、CPU使用情况和网络请求等信息。
  4. PageSpeed Insights

    • 由Google提供的在线服务,用于分析网页在移动设备和桌面设备上的性能。
    • 根据Google的算法给出性能评分,并提供优化建议。
  5. GTmetrix

    • 一个在线分析工具,提供网站性能的详细报告。
    • 结合了Google PageSpeed Insights和YSlow的规则进行评分。
  6. Pingdom

    • 一个在线网站性能测试工具,提供加载速度测试和分析。
    • 可以分析页面的HTML、CSS、JavaScript等资源的加载时间。
  7. Load Impact

    一个性能测试工具,可以模拟多用户访问网站,测试其负载能力。
  8. WebPagetest Chrome扩展

    基于WebPageTest的Chrome扩展,方便在浏览器中直接进行性能测试。
  9. Calibre

    由Calibre App团队开发,提供性能分析和优化建议。
  10. AutoWebPerf

    一个模块化工具,可以从多个来源自动收集性能数据。

这些工具可以帮助开发者从不同角度分析和优化前端性能,提升用户体验。开发者可以根据具体需求选择合适的工具进行性能测试和优化。

结语

🔥如果此文对你有帮助的话,欢迎💗关注、👍点赞、⭐收藏、✍️评论,支持一下博主~ 

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

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

相关文章

店匠科技亮相VivaTech,新零售解决方案引关注

在中法建交60周年之际,两国关系持续发展并共同推动双方在人工智能和全球治理领域达成重要合作。同时,浙江-法国高新产业创新合作对接会在巴黎顺利举行,进一步促进了中法两国在高新技术领域的交流与合作。 紧跟此次访问的步伐,众多中国科技创新企业齐聚巴黎,于5月22日至25日在法…

热更新简述

只要实现了进程级别的无状态(或在重启时恢复状态),除了跨过"重启期间"的连接会受到影响这个问题之外,我们还可以通过重启进程的方式实现热更新 优雅的进程切换 在热更新期间,新旧经常会同时运行,旧进程处理旧的请求,等处理完全部请求之后,再退出,而新进程则负责处理…

通用多物理场仿真PaaS平台伏图(Simdroid)5.0发布 | 试用

伏图&#xff08;Simdroid&#xff09;是云道智造自主研发的通用多物理场仿真PaaS平台&#xff0c;历经十年打磨&#xff0c;已迭代至5.0版本&#xff0c;实现“工程可用”。 通用多物理场仿真PaaS平台伏图(Simdroid)5.0 伏图5.0具备自主可控的固体力学、流体力学、电动力学、热…

个人参与场外期权交易的最全指南

个人参与场外期权交易的最全指南 一、引言 场外期权作为金融市场中的一大亮点&#xff0c;为个人投资者提供了多样化的风险管理及投资策略选择。本文将详细探讨个人如何安全、有效地参与场外期权交易。 文章来源/&#xff1a;财智财经 二、理解场外期权 场外期权是双方通过协…

CSS双飞翼布局

双飞翼布局是一种经典的CSS布局模式&#xff0c;主要用于实现左右两列固定宽度&#xff0c;中间列自适应的布局。 比如&#xff1a;写一个左中右布局占满全屏&#xff0c;其中左、右两块固定宽 200px&#xff0c;中间自适应&#xff0c;要求先加载中间块。 <!DOCTYPE html…

智能工厂总体设计方案

近年来&#xff0c;中国制造业长久以来依靠的劳动力优势正在逐步丧失。廉价的劳动力大军&#xff0c;曾是中国制造业发展的主动力&#xff0c;如今已不如往昔那么庞大和廉价&#xff0c;企业还面临不断恶化的用工短缺问题。因此&#xff0c;对于大规模制造生产&#xff0c;并想…

【langchain手把手3】使用示例选择器构建Prompt

【langchain手把手3】使用示例选择器构建Prompt Example selector 示例选择器实现用于选择示例以将其包括在提示中的逻辑。这使我们能够选择与输入最相关的示例。core内置的有以下3种示例选择器&#xff1a; LengthBasedExampleSelector&#xff1a;MaxMarginalRelevanceExamp…

【leetcode--文本对齐(还没整理完)】

根据题干描述的贪心算法&#xff0c;对于每一行&#xff0c;我们首先确定最多的是可以放置多少单词&#xff0c;这样可以得到该行的空格个数&#xff0c;从而确定该行单词之间的空格个数。 根据题目中填充空格的细节&#xff0c;我们分以下三种情况讨论&#xff1a; 当前行是…

JVM学习-详解类加载器(一)

类加载器 类加载器是JVM执行类加载机制的前提 ClassLoader的作用 ClassLoader是Java的核心组件&#xff0c;所有的Class都是由ClassLoader进行加载的&#xff0c;ClassLoader负责通过各种方式将Class信息的二进制数据流读入JVM内部&#xff0c;转换为一个与目标类型对应的ja…

大模型时代的具身智能系列专题(九)

NYU Lerrel Pinto团队 Lerrel Pinto是NYU Courant的计算机科学助理教授&#xff0c;也是用机器人和人工智能实验室(CILVR小组)的一员。在加州大学伯克利分校读博士后&#xff0c;在CMU机器人研究所读博士&#xff0c;在印度理工学院古瓦哈蒂读本科。研究目标是让机器人在我们生…

SpringBoot项目实现自定义注解方式的接口限流

一&#xff0c;实现原理 该限流方式使用的是令牌桶算法&#xff0c;令牌桶算法是基于漏桶算法的一种改进&#xff0c;主要在于令牌桶算法能够在限制服务调用的平均速率的同时&#xff0c;还能够允许一定程度内的突发调用。 系统以固定的速率向桶中添加令牌当有请求到来时&#…

微信小程序实现图生图(AI动漫特效)效果代码(触站API)

1.效果 触站AI图生图 2.本次用的是触站平台的API,我申请的适用积分,有水印(博主没钱)。如果需要没有水印的可以去买他们的资源包 3.首先我们需要去触站官网平台注册/登录账号(已注册可跳过该步骤) 4.开通API权限 我们可以在主页看到自己免费获取的500积分,用于接口调用…

SHA-3算法:新一代的哈希函数标准

在信息安全领域&#xff0c;哈希函数是不可或缺的工具之一&#xff0c;它能够将任意长度的数据转换为固定长度的字符串&#xff0c;通常用于数据完整性验证、数字签名、密码存储等场景。随着计算能力的提升和攻击技术的发展&#xff0c;原有的哈希算法如SHA-1和SHA-2系列逐渐显…

数据结构之归并排序算法【图文详解】

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 博主主页&#xff1a;LiUEEEEE                        …

金属切削机床5G智能工厂工业物联数字孪生,推进制造业数字化转型

金属切削机床5G智能工厂工业物联数字孪生&#xff0c;推进制造业数字化转型。随着工业4.0时代的到来&#xff0c;制造业正面临着前所未有的变革与挑战。在这场变革中&#xff0c;金属切削机床智能工厂工业物联数字孪生平台正成为推动制造业数字化转型的重要力量。 数字孪生是指…

Ego微商项目部署(小程序项目)(全网最详细教程)

1.项目部署前的准备 1.1获取APPID和APPSecret&#xff08;微信小程序&#xff09; 微信小程序注册流程及APPID&#xff0c;APPSecret获取-CSDN博客 把获取到的APPID&#xff0c;APPSecret复制粘贴&#xff0c;保存下来&#xff0c;等会要用到 1.2测试工具 navicat&#xf…

ps怎么设置立体字

一. 输入文字并调整大小和位置。 二. 使用CtrlAlt和T键复制并自由变换文字图层。 三. 通过键盘的方向键将复制的图层向左、向上各移动一个像素&#xff0c;多次重复操作以创建立体效果。 更多实用教程: 点击进入

PS系统教程11

HUD拾色器 作用&#xff1a;它可以帮助使用者更加高效地选择和使用颜色&#xff0c;从而提高工作效率和设计质量。 先确定色相值改变饱和度改变亮度使用HUD拾色器选中画笔工具画笔模式-正常shiftAlt右键 色相轮 上下移动从黑到白亮度变化左右移动从浅到深饱和度的变化选中颜…

Linux 35.5 + JetPack v5.1.3@FUEL编译安装

Linux 35.5 JetPack v5.1.3FUEL编译安装 1. 源由2. 编译&安装Step 1&#xff1a;依赖库安装Step 2&#xff1a;建立工程Step 3&#xff1a;编译工程Step 4&#xff1a;安装工程 3. 问题汇总3.1 fuel_planner/exploration_manager - dw3.2 fuel_planner/plan_env - OpenCV库…

IDEA的使用配置Maven(及selenium+webdriver的下载配置)

一. 下载maven 1. maven官网下载链接 2.​​安装第二行第一列的zip压缩包 ​​​​​​​​ 二. 配置环境变量 1.新建环境变量 2.在系统变量Path环境变量中添加%Maven_HOME%\bin 三.验证环境变量是否配置成功 winr >cmd>mvn -v 如果出现Maven的版本信息&#xff0…