前端面试的性能优化部分(1)每篇10题

1. 懒加载的概念

懒加载(Lazy Loading)是一种优化技术,它用于延迟加载页面资源,只在需要时才加载特定的内容,而不是在页面初始加载时一次性加载所有资源。懒加载的目的是提高页面加载速度和性能,尤其对于单页应用(SPA)或包含大量图片和其他资源的网页来说尤为重要。

懒加载可以应用在多种场景中,包括但不限于以下几个方面:

  1. 图片懒加载: 在网页中加载大量图片时,可以先加载可视区域内的图片,当用户滚动页面时再动态加载其他图片。这样可以减少页面的初始加载时间,提高用户体验。

  2. 延迟加载非关键资源: 将非关键资源(如广告、社交媒体插件等)的加载推迟到页面其他内容加载完毕后再进行,从而提高页面的加载速度。

  3. 按需加载组件: 对于复杂的单页应用,可以根据用户的操作,动态加载所需的组件和模块,从而减少初始加载时间,提高页面响应速度。

  4. 按需加载字体和样式: 对于字体和样式等资源,可以在需要时再进行加载,而不是在页面初始加载时全部加载,从而减少不必要的网络请求。

懒加载的实现方式通常基于浏览器的事件,如监听页面滚动事件来判断元素是否进入可视区域,然后触发加载相应的内容。在前端开发中,可以使用JavaScript库(如Intersection Observer API)或自定义实现懒加载功能。懒加载是一种常用的前端性能优化技术,可以有效减少不必要的资源加载,提高页面加载速度和用户体验。

2. 懒加载的特点

懒加载具有以下特点:

  1. 减少初始加载时间: 懒加载可以将页面资源分成多个部分,只加载首屏可视区域内的内容,从而减少页面的初始加载时间。用户打开页面时只加载必要的资源,其他内容在用户需要时再进行加载,提高了页面的加载速度和响应性。

  2. 节省带宽和资源: 懒加载可以避免一次性加载所有资源,节省了不必要的带宽和服务器资源。特别是对于移动端用户或者网络状况较差的用户来说,懒加载可以减少页面的数据传输量,提高页面的加载效率。

  3. 优化用户体验: 懒加载可以让用户更快地访问页面内容,减少等待时间,提高用户体验。用户在滚动页面时,页面内容逐渐显示,给予用户逐步展示内容的感觉,增加了交互性和吸引力。

  4. 按需加载: 懒加载可以根据用户的操作和需要,按需加载相应的资源。对于复杂的单页应用或需要动态加载内容的场景,懒加载可以帮助按需加载组件、模块或其他资源,提高页面响应速度。

  5. 节省资源成本: 懒加载可以在一定程度上降低服务器的负载,因为只有在用户需要时才进行资源加载,避免了不必要的资源消耗。对于大型网站或高并发的应用,懒加载有助于优化资源利用,节省资源成本。

总的来说,懒加载是一种重要的前端优化技术,通过延迟加载页面资源,优化了页面的加载性能,提高了用户体验,同时节省了带宽和服务器资源。在现代的网页开发中,懒加载已经成为一种常用的优化手段,特别适用于需要处理大量资源或图片的页面。

3. 懒加载的实现原理

懒加载的实现原理通常基于浏览器的事件和一些JavaScript技术。主要的实现原理如下:

  1. 监听页面滚动事件: 在页面上注册滚动事件,当用户滚动页面时,触发相应的懒加载操作。

  2. 计算元素位置: 获取需要懒加载的元素的位置信息,比如元素的相对位置、可视区域的位置等。

  3. 判断元素是否进入可视区域: 根据页面滚动和元素位置信息,判断元素是否进入可视区域。如果元素进入了可视区域,表示用户可以看到该元素,即需要进行懒加载。

  4. 触发加载操作: 当元素进入可视区域时,触发加载操作,加载元素的内容,比如加载图片、组件、模块或其他资源。

  5. 延迟加载: 懒加载会延迟加载页面资源,即在页面初始加载时只加载必要的内容,其他内容在需要时再加载。这样可以提高页面的初始加载速度。

  6. 懒加载策略: 对于不同的页面元素,可以采取不同的懒加载策略。比如对于图片,可以使用<img>标签的data-src属性来存储真实的图片地址,在滚动时再将data-src属性的值赋给src属性,从而实现图片懒加载。

常见的懒加载实现方式包括使用Intersection Observer API、手动监听滚动事件、使用第三方懒加载库等。Intersection Observer API是浏览器提供的一种现代的懒加载实现方式,它可以监听元素是否进入可视区域,并触发相应的回调函数。手动监听滚动事件需要开发者自行计算元素位置并判断是否进入可视区域,较为复杂。第三方懒加载库(如LazyLoadLozad.js等)提供了简单易用的接口,可以快速实现懒加载功能。

懒加载是一种重要的前端优化技术,通过延迟加载页面资源,提高了页面的加载性能和用户体验。在开发中,根据项目需求和性能优化目标,选择合适的懒加载方式来实现延迟加载,从而提升网页性能。

4. 回流与重绘的概念及触发条件

回流(Reflow)和重绘(Repaint)是浏览器渲染页面时的两个重要概念。

**回流(Reflow)**是指当DOM结构发生变化或者元素的样式发生改变时,浏览器重新计算元素的几何属性(比如位置、大小),并重新布局页面,使得页面的结构发生改变。回流是比较耗费性能的操作,因为它需要重新计算和布局整个页面。

**重绘(Repaint)**是指当元素的样式发生改变,但不影响其几何属性时,浏览器只需要重新绘制元素的外观,而无需重新计算和布局页面。重绘的性能开销较小,比回流要快。

触发条件:

  1. 回流触发条件:

    • 添加或删除DOM元素。
    • 元素位置、尺寸、内容发生改变。
    • 浏览器窗口大小变化。
    • 元素字体大小变化。
    • 激活CSS伪类(如:hover)。
    • 添加或删除样式表。
    • 设置元素的style属性。
  2. 重绘触发条件:

    • 元素的颜色、背景色等外观样式发生改变,但不影响元素的几何属性。

优化策略:

由于回流和重绘操作会消耗较多的性能,因此在前端开发中,我们应该尽量避免频繁的触发回流和重绘操作,以提高页面性能。以下是一些优化策略:

  • 使用transform属性代替topleft等位置属性来移动元素,因为transform不会触发回流。
  • 使用visibility: hidden代替display: none,因为前者只会触发重绘,而后者会触发回流。
  • 使用classList一次性添加或删除多个class,避免多次回流。
  • 使用documentFragment来批量操作DOM,减少回流次数。
  • 将频繁发生改变的DOM元素脱离文档流,改变其样式后再插入文档,减少回流次数。

通过合理优化页面结构和样式,尽量减少回流和重绘的触发,可以提高页面性能,提升用户体验。

5. 如何避免回流与重绘?

避免回流和重绘是优化页面性能的重要手段。以下是一些方法可以帮助我们尽量避免回流和重绘:

1. 使用transformopacity属性: transformopacity属性不会触发回流,可以使用它们来实现动画效果而不影响页面布局。

2. 批量修改DOM: 使用documentFragmentinnerHTML等方式,将多次DOM操作合并成一次,减少回流次数。

3. 使用虚拟DOM: 一些前端框架(如React、Vue)使用虚拟DOM来优化页面更新过程,通过对比虚拟DOM和真实DOM的差异,最小化更新操作,减少回流和重绘。

4. 使用display: none 尽量避免在频繁变动的元素上使用display: none,因为它会导致回流。可以使用visibility: hidden代替,因为它只触发重绘。

5. 使用position: absolute 在一些情况下,将元素的position设置为absolute,可以将其脱离文档流,减少对其他元素的影响,避免回流。

6. 避免频繁读取样式信息: 多次读取样式信息会导致多次回流,尽量避免频繁读取样式信息。可以使用缓存或将样式信息保存在变量中,减少回流次数。

7. 使用requestAnimationFrame 使用requestAnimationFrame来优化动画效果,它可以在浏览器下一次重绘之前执行动画更新,避免频繁的重绘。

8. 使用CSS动画: CSS动画使用GPU来执行动画效果,可以避免触发回流,提高动画性能。

综合运用上述方法,我们可以有效地避免回流和重绘,提高页面性能,提升用户体验。在开发过程中,需要综合考虑页面结构和样式,以及动画效果的优化,从而减少不必要的回流和重绘操作。

6. 如何优化动画?

优化动画是为了提高页面性能和用户体验。以下是一些优化动画的方法:

1. 使用CSS动画: 尽量使用CSS动画而不是JavaScript动画。CSS动画可以使用GPU加速,比JavaScript动画更高效。可以使用transitionanimation等CSS属性来实现动画效果。

2. 使用transform和opacity: 对于需要改变元素位置和透明度的动画,尽量使用transformopacity属性。它们不会触发回流,性能更好。

3. 使用requestAnimationFrame: 使用requestAnimationFrame来优化动画更新。它会在浏览器下一次重绘之前执行动画更新,避免频繁的重绘操作。

4. 避免频繁的样式改变: 尽量避免在短时间内频繁改变元素样式,因为这会导致多次回流和重绘。可以使用classList一次性添加或删除多个class,来优化样式的改变。

5. 合理设置动画时长: 动画时长不宜过长,也不宜过短。过长的动画会影响页面加载速度和用户体验,而过短的动画可能无法让用户完整地感知动画效果。

6. 避免在影响性能的元素上使用动画: 尽量避免在影响性能的元素(如较大的图片、复杂的DOM结构)上使用动画,因为这会导致动画性能下降。

7. 使用硬件加速: 可以使用will-change属性来告诉浏览器一个元素将要被改变,从而启用硬件加速,提高动画性能。

8. 压缩动画资源: 对于使用视频或大型图片的动画,可以压缩资源来减小文件大小,提高加载速度。

9. 使用虚拟DOM: 在使用前端框架时,可以使用虚拟DOM来优化页面更新过程,最小化DOM操作,减少重绘次数。

10. 避免动画阻塞主线程: 如果动画执行时间较长,可以将动画放在Web Worker中执行,避免阻塞主线程。

综合运用上述方法,可以优化动画效果,提高页面性能,让用户体验更加流畅和舒适。在进行动画开发时,需要注意性能问题,并根据具体情况采取相应的优化措施。

7. documentFragment 是什么?用它跟直接操作 DOM 的区别是什么?

DocumentFragment是DOM中的一个接口,它表示一个轻量级的文档片段。它可以包含多个节点,类似于一个虚拟的文档容器,但不会直接插入到页面中,不会影响页面的回流和重绘。

使用DocumentFragment可以实现高效的DOM操作,特别是在需要频繁插入多个DOM节点的情况下,可以显著提高性能。

区别:

  1. 性能: 直接操作DOM节点会导致页面的回流和重绘,而DocumentFragment不会直接插入到页面中,可以避免这些性能问题。

  2. 插入次数: 直接操作DOM节点每次插入都会触发页面的回流和重绘,而DocumentFragment可以将多个节点一次性插入到页面中,减少了插入的次数,提高了性能。

  3. 代码简洁性: 使用DocumentFragment可以将多个DOM操作合并成一次,使代码更加简洁和易于维护。

使用DocumentFragment的示例代码如下:

// 直接操作DOM节点
function insertNodesDirectly() {const parent = document.getElementById('parent');for (let i = 0; i < 1000; i++) {const node = document.createElement('div');node.textContent = 'Node ' + i;parent.appendChild(node);}
}// 使用DocumentFragment
function insertNodesWithFragment() {const parent = document.getElementById('parent');const fragment = document.createDocumentFragment();for (let i = 0; i < 1000; i++) {const node = document.createElement('div');node.textContent = 'Node ' + i;fragment.appendChild(node);}parent.appendChild(fragment);
}

在上面的例子中,insertNodesDirectly函数每次循环都直接插入一个节点到页面中,会触发1000次回流和重绘。而insertNodesWithFragment函数使用了DocumentFragment,将所有节点一次性插入到页面中,只触发一次回流和重绘,性能明显更好。

8. 对节流与防抖的理解

节流(Throttle)和防抖(Debounce)都是用来优化函数执行频率的技术,特别在处理一些频繁触发的事件(如滚动、拖拽、窗口大小调整等)时非常有用。

节流(Throttle):
节流是指在一定时间间隔内只执行一次函数。当事件频繁触发时,节流会让函数在每个时间间隔内只执行一次,不会被高频率的触发事件影响。

实现节流的方式有多种,其中一种比较简单的实现方式是使用setTimeout延时执行函数。具体步骤如下:

  1. 在事件触发时设置一个定时器,延时执行函数。
  2. 如果在定时器的等待时间内,事件再次触发,清除之前的定时器,重新设置新的定时器。

防抖(Debounce):
防抖是指当事件频繁触发时,在规定时间间隔内,只执行最后一次触发的事件。如果在规定时间间隔内再次触发事件,则会重新计时。

防抖的实现方式也有多种,其中一种简单的实现方式是使用setTimeoutclearTimeout来延时执行函数。具体步骤如下:

  1. 在事件触发时设置一个定时器。
  2. 如果在定时器的等待时间内再次触发事件,清除之前的定时器,重新设置新的定时器。

应用场景:
节流适用于在频繁触发的事件中,需要在固定的时间间隔内处理,比如窗口调整大小、滚动事件。

防抖适用于在频繁触发的事件中,只需要处理最后一次触发的事件,比如搜索框输入、按钮点击等,可以防止重复提交或者频繁请求。

综上所述,节流和防抖都是优化事件处理的方法,通过合理地控制函数执行的频率,提高页面性能和用户体验。选择使用哪种方法取决于具体的场景和需求。

9. 实现节流函数和防抖函数

实现节流函数和防抖函数可以通过闭包和定时器来实现。下面分别给出节流函数和防抖函数的实现代码:

节流函数的实现:

function throttle(func, delay) {let lastTime = 0;return function (...args) {const now = Date.now();if (now - lastTime >= delay) {func.apply(this, args);lastTime = now;}};
}// 示例用法
function handleScroll() {console.log('Scroll event is throttled.');
}window.addEventListener('scroll', throttle(handleScroll, 200));

防抖函数的实现:

function debounce(func, delay) {let timer;return function (...args) {clearTimeout(timer);timer = setTimeout(() => {func.apply(this, args);}, delay);};
}// 示例用法
function handleInput() {console.log('Input event is debounced.');
}const debouncedInputHandler = debounce(handleInput, 500);
document.getElementById('searchInput').addEventListener('input', debouncedInputHandler);

在节流函数中,通过比较当前时间和上次执行函数的时间来控制函数执行的频率,在规定的时间间隔内只会执行一次。

在防抖函数中,通过设置一个定时器,在规定的时间间隔内如果再次触发事件,则会重新设置定时器,直到规定时间间隔内没有再次触发事件,然后执行函数。

使用这两个函数可以有效地优化频繁触发的事件,提高页面性能和用户体验。

10. 如何对项目中的图片进行优化?

对项目中的图片进行优化是提高网页性能的重要一环。优化图片可以减小页面加载时间,减少网络带宽消耗,提升用户体验。以下是对项目中图片进行优化的一些常见方法:

  1. 选择合适的图片格式: 根据图片的特点选择合适的格式。一般情况下,JPEG 格式适用于照片和复杂图像,PNG 格式适用于透明背景的图像,而 GIF 格式适用于简单动画。

  2. 压缩图片: 使用压缩工具(如 TinyPNG、ImageOptim)对图片进行压缩,减小图片文件的大小,但要注意保持图片质量不至于过度压缩导致失真。

  3. 使用雪碧图: 将多个小图标合并成一个雪碧图,减少 HTTP 请求次数,优化加载速度。

  4. 使用响应式图片: 对于不同尺寸的设备,使用适应不同屏幕大小的图片,可以节省带宽并提高加载速度。

  5. 懒加载: 对于页面上需要滚动才能看到的图片,可以使用懒加载技术,延迟加载图片,节省初次加载时的流量。

  6. 使用 WebP 格式: WebP 是一种支持有损和无损压缩的图片格式,它比 JPEG 和 PNG 格式更高效,可以显著减小图片文件大小。

  7. CDN 加速: 使用内容分发网络(CDN)来加速图片的加载,将图片缓存在全球各地的服务器上,减少加载时间。

  8. 适当的尺寸: 使用合适的图片尺寸,不要在网页上显示超过实际需要的图片大小。

  9. 图片懒加载: 对于长页面或有大量图片的页面,可以使用图片懒加载技术,只在图片进入可视区域时加载图片,而不是一次性加载全部图片。

综合使用这些优化方法,可以有效地减小图片文件大小,提高网页加载速度,优化用户体验。在开发过程中,要注意图片的优化,并定期检查和更新优化措施,以确保网页性能保持在一个良好的水平。

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

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

相关文章

React之路由

React之路由 背景&#xff1a; react: 18.2.0 路由&#xff1a;react-router-dom: 6.14.2 1、路由表配置 src下新建router/index.ts import React, { lazy } from react import { Navigate } from react-router-dom import Layout from /layout/Index import { JSX } from rea…

#P1007. [NOIP2007提高组] 矩阵取数游戏

题目描述 帅帅经常跟同学玩一个矩阵取数游戏&#xff1a;对于一个给定的 n \times mnm 的矩阵&#xff0c;矩阵中的每个元素 a_{i,j}ai,j​ 均为非负整数。游戏规则如下&#xff1a; 每次取数时须从每行各取走一个元素&#xff0c;共 nn 个。经过 mm 次后取完矩阵内所有元素&…

stm32内存杂记

从上图中可以看出SRAM空间用来存放&#xff1a;1.各个文件中声明和定义的全局变量、静态数据和常量&#xff1b;2.未初始化的全局变量&#xff1b;3.HEAP区&#xff1b;4.STACK区 这是在.map文件中&#xff0c;双击工程target打开 堆栈是处于以0x2000xx地址处的 EQU伪代码&…

学C的第三十一天【通讯录的实现】

相关代码gitee自取&#xff1a;C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a; 学C的第三十天【自定义类型&#xff1a;结构体、枚举、联合】_高高的胖子的博客-CSDN博客 通讯录需求&#xff1a; 实现一个通讯录&#xff0c; 通讯录中存放保存人的信息&#xff1…

【ChatGPT】相关解读

ChatGPT 背后的“功臣”——RLHF 技术详解 Meta 发布开源可商用模型 Llama 2&#xff0c;实际体验效果如何&#xff1f; Llama 2线上试用地址&#xff1a;replicate.com/a16z-infr…

华为鸿蒙4本周发布:官方海报大有玄机!告别“人工智障”!

一年一度的华为开发者大会2023(HDC.Together)将于8月4日至8月6日在东莞松山湖举办。相比去年&#xff0c;今年的华为开发者大会足足提前了三个月&#xff0c;而本次大会主角之一无疑是全新国产操作系统鸿蒙4&#xff08;HarmonyOS 4&#xff09;。 官方之前用了三个词来形容鸿蒙…

C#文件操作从入门到精通(1)——INI文件操作

点击这里:微软官方文档查看writePrivateProfileString函数定义 常见错误: 1、中文路径写入失败,为啥? 2、文件不是全路径,只有文件名也会写入失败: 3、GetLastError怎么使用? GetLastError错误代码含义: (0)-操作成功完成。 (1)-功能错误。 (2)- 系统找不到指定的文件…

3个命令定位CPU飙高

top 指令找出消耗CPU最厉害的那个进程的pid top -H -p 进程pid 找出耗用CPU资源最多的线程pid printf ‘0x%x\n’ 线程pid 将线程pid转换为16进制 结合jstack 找出哪个代码有问题 jstack 进程pid | grep 16进制的线程pid -A 多少行日志 jstack 进程pid | grep 16进制的线程…

C语言指针进阶-1

本篇文章带来 1. 字符指针 2. 数组指针 3. 指针数组的相关知识详细讲解&#xff01; 如果您觉得文章不错&#xff0c;期待你的一键三连哦&#xff0c;你的鼓励是我创作的动力之源&#xff0c;让我们一起加油&#xff0c;一起奔跑&#xff0c;让我们顶峰相见&#xff01;&#…

04 http连接处理(上)

基础知识&#xff1a;epoll、http报文格式、状态码和有限状态机 代码&#xff1a;对服务端处理http请求的全部流程进行简要介绍&#xff0c;然后结合代码对http类及请求接收进行详细分析。 epoll epoll_create函数 #include <sys/epoll.h> int epoll_create(int size)…

【业务功能篇55】Springboot+easyPOI 导入导出

Apache POI是Apache软件基金会的开源项目&#xff0c;POI提供API给Java程序对Microsoft Office格式档案读和写的功能。 Apache POI 代码实现复杂&#xff0c;学习成本较高。 Easypoi 功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员 就可以方便的写出Excel导出…

C#匿名函数,lambda表达式笔记

一.匿名函数 匿名函数是一种定义时不起函数名的技术&#xff0c;因此无法直接调用&#xff0c;通常用来赋值给委托后被委托调用。在匿名方法中您不需要指定返回类型&#xff0c;它是从方法主体内的 return 语句推断的 它的语法形式为&#xff1a;delegate (input-parameters)…

【计算机网络】408统考2014年题36

题目描述 【2014年题36】主机甲与主机乙之间使用后退N帧(GBN)协议传输数据&#xff0c;甲的发送窗口尺寸为1000&#xff0c;数据帧长为1000字节&#xff0c;信道带宽为100Mbps&#xff0c;乙每收到一个数据帧就立即利用一个短帧&#xff08;忽略其传输延迟&#xff09;进行确认…

C++相关容器篇章

内容链接vector点击链接stack和queue的函数用法点击链接优先队列priority_queue

Banana Pi BPI-KVM – 基于 Rockchip RK3568 SoC 的 KVM over IP 解决方案

Banana Pi 已经开始开发基于 Rockchip RK3568 SoC 的 BPI-KVM 盒&#xff0c;但它不是迷你 PC&#xff0c;而是 KVM over IP 解决方案&#xff0c;旨在远程控制另一台计算机或设备&#xff0c;就像您在现场一样&#xff0c;例如能够打开和关闭连接的设备、访问 BIOS 等。 商业…

eda、gnm、anm究竟是个啥?

安装prody pip install prody -i https://pypi.tuna.tsinghua.edu.cn/simpleeda、anm、gnm eda(essential dynamics analysis) 另一个名字PCA(Principal Component Analysis) 或 NMA(Normal Mode Analysis)。 eda分析可以帮助人们理解生物大分子基本的运动模式和构象变化。…

面试典中典之线程池的七大参数

文章目录 一、七大元素解释1.corePoolSize&#xff08;核心线程数&#xff09;&#xff1a;2.maximumPoolSize&#xff08;最大线程数&#xff09;&#xff1a;3.keepAliveTime&#xff08;线程空闲时间&#xff09;&#xff1a;4.unit&#xff08;时间单位&#xff09;&#x…

Elasticsearch:使用 ELSER 释放语义搜索的力量:Elastic Learned Sparse EncoderR

问题陈述 在信息过载的时代&#xff0c;根据上下文含义和用户意图而不是精确的关键字匹配来查找相关搜索结果已成为一项重大挑战。 传统的搜索引擎通常无法理解用户查询的语义上下文&#xff0c;从而导致相关性较低的结果。 解决方案&#xff1a;ELSER Elastic 通过其检索模型…

【数据结构与算法】常用排序算法对比

常用排序算法对比 相关术语解释&#xff1a; 稳定&#xff1a;如果 a 原本在 b 前面&#xff0c;而 a b&#xff0c;排序之后 a 仍然在 b 的前面。不稳定&#xff1a; 如果 a 原本在 b 前面&#xff0c;而 a b&#xff0c;排序之后 a 可能出现在 b 的后面。内排序&#xff…

安全渗透初级知识总结-2

CIA三原则&#xff1a;保密性&#xff0c;完整性&#xff0c;可用性 https:解决了安全传输问题 核心技术&#xff1a;用非对称加密传输对称加密的秘钥&#xff0c;然后用对称秘钥通信 抓包&#xff1a;Wireshark、tshark、tcpdump valueof方法是一个所有对象都拥有的方法&am…