前端面试题(十)

51. 前端性能优化

在前端开发中,性能优化是面试中的一个常见话题。面试官通常会希望候选人具备识别性能瓶颈并提出相应解决方案的能力。以下是一些常见的前端性能优化面试题及其答案。

1. 前端性能优化有哪些常见手段?

前端性能优化的手段可以从多个维度考虑,主要包括:

  1. 减少 HTTP 请求

    • 合并 CSS、JavaScript 文件,使用雪碧图(sprite images),减少页面加载时的请求数量。
    • 使用 HTTP/2 以实现多路复用,提高请求效率。
  2. 资源压缩与优化

    • 使用工具压缩 HTML、CSS、JavaScript 文件,例如使用 UglifyJS 压缩 JavaScript,使用 CSSNano 压缩 CSS。
    • 对图片进行无损压缩,使用现代格式如 WebP。
    • 延迟加载非关键资源,例如延迟加载图片(Lazy Load)。
  3. 使用缓存

    • 合理配置缓存策略,使用 Cache-ControlExpires 头。
    • 使用 Service Worker 来实现离线缓存和资源预取。
  4. 异步加载资源

    • 使用 asyncdefer 来异步加载 JavaScript 文件,防止阻塞页面的渲染。
    • 将 CSS 文件放在 <head> 中,确保尽早加载,JavaScript 文件放在 <body> 底部,避免阻塞 HTML 渲染。
  5. DOM 操作优化

    • 减少 DOM 操作,批量更新 DOM,避免频繁触发回流和重绘。
    • 使用文档片段(Document Fragment)或虚拟 DOM 来减少操作真实 DOM 的次数。
  6. 提高首屏加载速度

    • 通过服务器端渲染(SSR)加快首屏渲染时间。
    • 使用懒加载和按需加载技术,只加载用户可视区域的资源。
  7. CDN 加速

    • 使用内容分发网络(CDN)加快静态资源的分发,减少服务器压力,缩短资源传输的物理距离。
2. 什么是回流 (Reflow) 和重绘 (Repaint)?如何避免?
  • 回流 (Reflow):当页面的布局、大小、位置或几何属性发生变化时,浏览器需要重新计算元素的布局。回流是一个非常耗时的过程,尤其当涉及到大量元素时,性能会显著下降。
  • 重绘 (Repaint):当页面元素的外观(如颜色、边框等)发生变化时,浏览器会重新绘制这些元素,但不影响布局,这个过程比回流更轻量。

避免回流和重绘的方法

  • 合理使用 CSS:避免频繁操作影响布局的属性,如 widthheightpaddingborder 等。
  • 减少 DOM 的操作:尽量批量更新 DOM,使用文档片段或一次性修改多个属性。
  • 使用 visibility: hidden 代替 display: nonedisplay: none 会触发回流,而 visibility 只会触发重绘。
  • 避免频繁读取导致回流的属性,如 offsetTopoffsetHeight 等。可以将这些值缓存起来,减少读取次数。
3. 如何提升网站的首屏加载速度?
  1. 压缩与合并资源

    • 对 HTML、CSS、JavaScript 进行压缩,减少文件体积。
    • 合并多个 CSS、JavaScript 文件,减少 HTTP 请求。
  2. CDN 加速

    • 使用 CDN 将静态资源部署到离用户最近的节点,减少资源的下载时间。
  3. 懒加载与按需加载

    • 对非首屏的图片、视频、脚本等资源进行懒加载,只在用户需要时加载这些资源。
  4. 预加载关键资源

    • 使用 <link rel="preload"> 提前加载关键资源,如字体、样式表和重要的脚本,确保它们尽快生效。
  5. 服务端渲染 (SSR)

    • 使用服务端渲染将页面 HTML 预生成,减少浏览器解析时间,加快首屏展示速度。
  6. Critical CSS

    • 把关键的 CSS 样式内联到 HTML 中,减少渲染阻塞,同时推迟加载其他非关键的 CSS 文件。
  7. 减少第三方库和插件

    • 尽量减少使用庞大的第三方库和插件,例如可以选择体积更小的库代替 jQuery 或者 Lodash,避免引入不必要的功能。
4. 什么是 Webpack?如何使用 Webpack 优化前端性能?

Webpack 是一个模块打包工具,它可以将项目中的各种资源(JavaScript、CSS、图片等)视作模块,并打包成可供浏览器运行的静态文件。

使用 Webpack 进行前端性能优化的方式有:

  1. 代码拆分 (Code Splitting)

    • Webpack 提供了代码拆分功能,可以将应用程序分割成多个较小的包,按需加载不同部分的代码,从而减少初始包的大小,提升页面加载速度。
    • 例如通过 import() 实现动态导入:
      import('./module').then(module => {
        // 模块加载完成后执行
      });
      
  2. Tree Shaking

    • Webpack 的 Tree Shaking 能够在打包时移除未使用的代码,这对于优化大型项目的包大小非常有效。确保使用 ES6 的模块系统 (import/export) 来支持 Tree Shaking。
  3. 文件压缩

    • 使用 Webpack 的 TerserPlugin 对 JavaScript 进行压缩,减少文件体积。
    • 对 CSS 使用 css-minimizer-webpack-plugin 进行压缩。
  4. 图片优化

    • 使用 Webpack 的 image-webpack-loader 插件自动压缩图片,生成适合网络传输的小体积图片。
  5. 缓存策略

    • Webpack 生成带有内容哈希的文件名,保证每次代码更新时文件名会变动,确保浏览器能够获取最新版本的资源。同时未变动的文件则可以通过缓存策略长期缓存,减少不必要的网络请求。
5. 为什么说 HTTP/2 有助于前端性能提升?

HTTP/2 相较于 HTTP/1.1 有多项改进,有助于提升前端性能:

  1. 多路复用 (Multiplexing):HTTP/2 允许在同一个 TCP 连接上并行处理多个请求和响应,解决了 HTTP/1.1 中的队头阻塞问题,大大提高了传输效率。
  2. 头部压缩 (Header Compression):HTTP/2 使用 HPACK 算法对请求和响应的头部进行压缩,减少了数据传输的体积,尤其对那些拥有大量重复头部信息的请求非常有效。
  3. 服务器推送 (Server Push):服务器可以在客户端请求前主动发送资源,减少客户端请求的等待时间。比如在用户请求一个 HTML 页面时,服务器可以提前推送该页面需要的 CSS 和 JavaScript 资源。
  4. 优先级控制 (Stream Prioritization):HTTP/2 允许客户端为请求分配优先级,服务器可以根据优先级安排资源的传输顺序,确保关键资源优先加载。
6. 如何通过减少 DOM 操作来优化性能?

频繁的 DOM 操作会触发回流和重绘,影响页面的性能。以下是减少 DOM 操作的几种常见方式:

  1. 使用虚拟 DOM:像 React 和 Vue 等框架使用虚拟 DOM,可以减少直接操作真实 DOM 的次数,提高渲染性能。
  2. 批量操作 DOM:将多次操作合并成一次,例如使用文档片段(Document Fragment)进行批量操作,然后一次性插入 DOM。
  3. 缓存 DOM 元素:避免多次查询相同的 DOM 元素,可以将查询结果缓存起来,减少重复的 DOM 查询操作。
  4. 减少频繁修改样式:一次性修改元素的多个样式属性,而不是每次操作都触发重绘。
  5. 避免读取会触发回流的属性:避免频繁读取 offsetTopoffsetHeight 等会触发回流的属性,可以通过将这些值缓存起来减少读取次数。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

探讨TikTok直播专线的必要性

随着社交媒体的迅速发展&#xff0c;短视频平台如TikTok&#xff08;在中国抖音&#xff09;已成为现代人生活中不可或缺的一部分。TikTok的直播功能因其即时性和互动性受到广泛喜爱&#xff0c;但在中国市场上&#xff0c;主播们在使用这一功能时面临不少挑战&#xff0c;其中…

优选拼团平台架构解析与关键代码逻辑概述

一、系统架构设计 唐古拉优选拼团平台采用多层架构设计&#xff0c;主要包括前端展示层、业务逻辑层、数据访问层及数据存储层。 前端展示层&#xff1a;负责用户界面的展示和交互&#xff0c;包括商品列表、拼团详情、订单管理等页面。前端采用现代前端框架&#xff08;如Vue…

【Linux】图解详谈HTTPS的安全传输

文章目录 1.前置知识2.只使用对称加密3.只使用非对称加密 因为私钥加密只能公钥解开&#xff0c;公钥加密只能私钥解开4.双方都是使用非对称加密5.非对称加密 对称加密6.非对称加密对称加密CA认证&#xff08;一&#xff09;CA认证&#xff08;二&#xff09;https &#xff0…

信息学奥赛的最佳启蒙阶段是小学还是初中?

信息学奥赛&#xff08;NOI&#xff09;近年来越来越受家长和学生的关注&#xff0c;尤其是在编程教育不断升温的背景下&#xff0c;信息学竞赛成为了许多家庭的教育选择之一。家长们往往关心的是&#xff1a;孩子应该在什么年龄段开始接触信息学竞赛&#xff0c;才能打下坚实的…

ArcEngine C#二次开发图层处理:根据属性分割图层(Split)

需求&#xff1a;仅根据某一属性&#xff0c;分割图层&#xff0c;并以属性值命名图层名称保存。 众所周知&#xff0c;ArcGIS ArcToolbox中通过Split可以实现图形分割一个图层&#xff0c;以属性值命名图层&#xff0c;如下图所示。 本文仅仅依据属性值&#xff0c;将一个shp…

统信服务器操作系统【qcow2 镜像空间扩容】方案

使用 qcow2 镜像安装系统,当默认安装系统存储空间不够用时,进行自定义扩容 文章目录 准备环境扩容步骤一、检查环境信息1.查看镜像信息2.查看镜像分区信息3.确认需要扩容的分区名二、扩容1.备份镜像2.创建新的镜像文件,并指定空间3.将系统扩容到新的镜像三、扩容 lvm 分区四…

自然语言处理实战项目:从理论到实现

一、引言 自然语言处理&#xff08;NLP&#xff09;是计算机科学、人工智能和语言学交叉的领域&#xff0c;旨在让计算机能够理解、处理和生成人类语言。随着互联网的飞速发展&#xff0c;大量的文本数据被产生&#xff0c;这为自然语言处理技术的发展提供了丰富的素材&#xf…

从响应到预见:前瞻性客户服务策略的实践与探索

在快速变化的商业环境中&#xff0c;客户服务已不再是简单的需求响应与问题解决&#xff0c;它正逐步演变为企业竞争力的核心要素之一。传统的“响应式”服务模式虽能满足基本的客户需求&#xff0c;但在追求极致客户体验和构建长期忠诚度的今天&#xff0c;显然已显不足。因此…

使用 Puppeteer-Cluster 和代理进行高效网络抓取: 完全指南

文章目录 一、介绍&#xff1f;二、什么是 Puppeteer-Cluster&#xff1f;三、为什么代理在网络抓取中很重要&#xff1f;四、 为什么使用带代理的 Puppeteer-Cluster&#xff1f;五、分步指南&#xff1a; 带代理的 Puppeteer 群集5.1. 步骤 1&#xff1a;安装所需程序库5.2. …

ERROR:start workflow error,dolphinscheduler log重复刷屏(死循环)直至磁盘存满

在使用ds过后发现&#xff0c;我虚拟机中的磁盘内存全部沾满了 查看目录下大于100M的文件&#xff1a; find / -size 100M 查看后发现问题在于ds产生的日志文件特别大而且多&#xff0c; 查看日志后发现日志中一直都在死循环错误&#xff1a;start workflow error 等 其中文件…

命令行gcc -v和g++ -v输出版本不一致

命令行gcc -v和g -v输出版本不一致 前言&#xff1a;本文初编辑于2024年9月27日 CSDN主页&#xff1a;https://blog.csdn.net/rvdgdsva 博客园主页&#xff1a;https://www.cnblogs.com/hassle 博客园本文链接&#xff1a;https://www.cnblogs.com/hassle/p/18435916 赞美大…

Java ERP管理系统源码解析:微服务架构实践Spring Cloud Alibaba与Spring Boot

在当今数字化浪潮的推动下&#xff0c;企业对于高效、稳定且易于扩展的管理系统需求日益增长。为了满足这一需求&#xff0c;我们精心打造了一款基于Java技术的鸿鹄ERP&#xff08;Enterprise Resource Planning&#xff09;管理系统。该系统充分利用了Spring Cloud Alibaba、S…

局域网广域网,IP地址和端口号,TCP/IP 4层协议,协议的封装和分用

前言 在古老的年代&#xff0c;如果我们要实现两台机器进行数据传输&#xff0c; A员工就得去B员工的办公电脑传数据&#xff08;B休息&#xff0c;等A传完&#xff09;&#xff0c;这样就很浪费时间 所以能不能不去B的工位的同时&#xff0c;还能传数据。这时候网络通信就出来…

一文彻底掌握inout双向端口

inout端口信号在FPGA中应用还是很广泛的&#xff0c;特别是一些总线通信、数据交互的场景&#xff0c;比如i2c、spi等等。 一、inout的基本概念 Inout 端口的实现基础是三态门。 三态门具有三种输出状态&#xff0c;即高电平、低电平以及高阻态&#xff08;Z&#xff09;。 …

K8S:开源容器编排平台,助力高效稳定的容器化应用管理

云计算de小白 Kubernetes&#xff08;简称K8s&#xff09;是一个开源容器编排平台&#xff0c;用于自动化部署、扩展和管理容器化应用程序。 K8S诞生于Google&#xff0c;基于其多年在生产环境运行容器的经验&#xff0c;目前已成为现代微服务架构和云原生应用的核心技术。 图…

Leetcode 707. 设计链表

1.题目基本信息 1.1.题目描述 你可以选择使用单链表或者双链表&#xff0c;设计并实现自己的链表。 单链表中的节点应该具备两个属性&#xff1a;val 和 next 。val 是当前节点的值&#xff0c;next 是指向下一个节点的指针/引用。 如果是双向链表&#xff0c;则还需要属性…

代码随想录冲冲冲 Day58 图论Part9

47. 参加科学大会&#xff08;第六期模拟笔试&#xff09; 根据昨天的dijkstra进行堆优化 使用的原因是点多但边少 所以直接对于边进行操作 1.对于priority_queue来说 这是最小堆, 小于的话就是最大堆 之后由于是根据边来说的 所以新建一个Edge并且初始化一下 之后由于使用…

数字孪生赋能BMS:开启电池管理新纪元

这几天&#xff0c;全世界的媒体几乎都在报道黎巴嫩爆炸案。原本此类地缘冲突的影响力是较为有限的&#xff0c;但是这次的事件不太一样&#xff1a;这次爆炸的&#xff0c;是几千个传呼机。 这一事件迅速引发了全球范围内对于电子设备安全性的广泛关注&#xff1a;随着社会日…

[EBPF] 实时捕获DM数据库是否存在SQL阻塞

1. 介绍 eBPF&#xff08;extened Berkeley Packet Filter&#xff09;是一种内核技术&#xff0c;它允许开发人员在不修改内核代码的情况下运行特定的功能。eBPF 的概念源自于 Berkeley Packet Filter&#xff08;BPF&#xff09;&#xff0c;后者是由贝尔实验室开发的一种网…

如何选择数据库架构

选择合适的数据库架构是一个复杂的过程&#xff0c;它取决于多种因素&#xff0c;包括应用程序的需求、数据量的大小、并发访问量、数据一致性要求、预算以及技术团队的熟悉程度等。以下是一些关键的步骤和考虑因素&#xff0c;帮助你选择合适的数据库架构&#xff1a; 1. 分析…