面试官问你前端性能优化时,他想问什么?

news2024/11/16 6:25:43

一直以来,前端性能优化都是面试过程中考察的热点题目。

相关的技术博客也层不出穷,我们总是能找到很多这样的文章,

从一个应用的各个层面开始分析,优化的种种手段,取得的种种效果。

往往篇幅越长,讲得越细,越受欢迎。

但在面试的时候,问这类问题时,候选人经常答得不尽人意,大部分人会把自己能想起来的优化措施,给背一遍。

背得越多越好,对于候选人自己说,内心也发虚,背完之后面试官毫无表情,因为这并不是他们想要的答案。

我们不妨从面试官的角度来思考。

面试官想考察什么?

  • 这个很容易考察候选人技术的宽度和广度。
    • 可以从网络层面,打包层面,渲染层面问你对前端知识边界的了解。
    • 也可以就一个方面深入考察,比如http2,tcp的队头阻塞问题,webpack分包策略等等。
  • 考察一个人做事的能力和思考的方式。
    • 如果真的做过,那么是如何实施的,怎么和其他部门配合的,遇到了哪些问题,怎么解决的。
    • 如果没做过,那么会怎么来计划,推进这件事情。
  • 不至于让候选人无话可说。
    • 面试过程中很容易陷入一种,面试官问不出问题,候选人答不出问题的尴尬境地,这种性能优化的问题就可以让双方都有话可说。

当然,面试是门玄学,实际在面试过程中,根据面试官的状态,技术问题的侧重点也是不一样的。

那么作为候选人来说,如何回答,才能脱颖而出呢?

候选人如何回答?

首先第一个疑问就是,做过没做过呗?

如实回答即可,做过就讲自己做的过程,没做过就讲自己准备怎么做。

大的原则就是:稍带广度,突出深度。

两种情况我们需要分类讨论。

如果做过

或者你要假装自己做过。

明确范围

那就要明确你要进行前端优化的场景范围,或者说是要优化的应用是哪个种类。

  • 一个toC的纯H5,在浏览器和微信里使用
  • 一个toB的系统,或者说内部使用的运营系统
  • 嵌入app内使用的Hybrid
  • 公司官网
  • 跨端应用,小程序等等

以上每种类别优化的方式都是要根据场景采用的措施和手段是不一样的。

在回答的过程中,要明确这个基础。

比如说,对于一个离线加载的h5,应当从网络层面突出强调离线加载的好处,而不是说资源体积上的优化。

明确目标

性能优化需要目标,这个目标肯定是一个量化数据。

这就考察到了候选人对前端页面性能数据的掌握。

比如常问题目,你们在优化过程中,是如何制定目标,或者说如何排查阻塞问题的?

这个问题其实是在问你们如何采集页面数据。

性能数据采集分为两种

  • 实验室性能数据采集
    • google的lightHouse 帮助我们分析页面的六大属性
    • First contentful paint 首次内容绘制 (FCP)
    • Largest contentful paint 最大内容绘制 (LCP)
    • First input delay 首次输入延迟 (FID)
    • Time to Interactive 可交互时间 (TTI)
    • Total blocking time 总阻塞时间 (TBT)
    • Cumulative layout shift 累积布局偏移 (CLS)

    • 谷歌浏览器的性能面板,做具体链路阻塞的分析。
  • 线上真实数据采集
    • 线上接入入web-vitals做用户的数据收集
    • 接入sentry等一些三方SDK做性能数据的收集

确定方案

在分析整个前端页面性能优化的链路过程中,我们需要找到一个阻塞点,或者说切入点。

以一个app中webview中嵌套h5的场景来说

我们需要找到从用户点击跳转开始,到展现的过程中,经历了哪几个阶段,哪个阶段耗时多久,成为了阻塞页面的主要问题,然后针对问题再说实施了哪些优化。

比如下面这个问题,用户反馈APP内打开H5页面白屏时间过长,你应该怎么处理?

我们不能回答是用户网络不好吧。

针对这个问题,也有优化方式:

  1. 针对 WebView 初始化: 当客户端刚启动时,可以先提前初始化一个全局的 WebView 待用并隐藏
  2. 针对向后端发送接口请求:在客户端初始化 WebView 的同时,直接由 Native 开始网络请求数据,当页面初始化完成后,向 Native 获取其代理请求的数据。
  3. 针对加载的 js 动态拼接 html(单页面应用):可采用多页面打包, 服务端渲染,以及构建时预渲染等方式。
  4. 针对加载页面资源的大小:可采用懒加载等方式,将需要较大资源的部分分离出来,等整体页面渲染完成后再异步请求分离出来的资源,以提升整体页面加载速度。

当然我只是举个例子,在回答的过程中还是要突出重点,

如果对网络掌握较好,就说网络层面优化,

如果对打包工具熟悉,就说体积层面优化,

如果对浏览器熟悉,就说渲染层面的优化,

如果你对三方面都熟悉,那么应该不会看这篇文章。

如果没做过

如果没做过,但肯定了解过吧。

如果不了解,看完这篇文章吧。

主要从三个方面回答

传输

  • 使用CDN,对静态资源进行缓存。
    • 那么CDN回源和预热是什么回事?
    • 使用CDN和不使用CDN有什么区别?
    • 如何判断当前资源命中了CDN?
    • 你们项目中如何使用CDN的。
  • 使用http2,多路复用的特性,头部压缩,请求优先级
    • http2 是怎么解决http1.1的头部阻塞问题的?
    • http2 彻底解决了队头阻塞问题了吗?他还有哪些问题?
    • nginx如何配置使之生效
    • http3 有了解吗?
  • 充分利用浏览器缓存策略
    • 强缓存和协商缓存的区别
    • nginx中应该如何配置缓存字段
    • 分包加载,如何避免一行代码修改导致整个 bundle 的缓存失效

体积

  • 开启gzip压缩,对文本资源处理
    • 除了gzip压缩,还有哪些压缩方案
    • 如何配置gzip压缩
  • 压缩JS资源
    • 如何压缩js资源,有哪些库。
    • 压缩后的代码和未压缩之前有什么区别
    • sourcemap线上环境,测试环境,本地环境有什么区别
  • 图片大小的优化
    • 使用webp格式替换原有的png/jepg
  • 三方库的按需加载,按需打包
    • 编译代码中,如何支持tree-shaking?
    • 没有按需打包之前,有什么问题?

渲染

要说渲染呢,就要理解渲染过程,我们的前端代码如何在浏览器中展示出来的。

  • 从html解析成DOM树
  • 从CSS解析成CSS树
  • 结合DOM树木和CSS树,合并渲染树
  • 根据渲染树,确定DOM 树的位置布局信息
  • 然后再将每个节点渲染在浏览器中

所以需要减少渲染的次数,也就是我们所说的重绘,重排

加快html和css 的解析速度。

其实这能展开说的点就很多了,需要结合具体场景去分析。

  • 对关键资源的预加载,对非关键资源的延后加载
    • preload 和 prefecth 的使用区别
    • async 和 defer 的使用区别
    • dns-prefetch 对域名做预解析的作用
  • 请求的缓存,避免短期内切换页面反复请求接口
    • 缓存在哪里,你知道有哪些缓存方式,应该使用哪种缓存方式
  • 防抖和节流,减少渲染次数。
    • 解释一下防抖节流的使用场景
    • 要不,来手写个防抖函数

最后

其实我在文章中,也没有说任何题目的答案。

只是提供了一条思路,顺着性能优化这条思路,我们可以去学习计算机网路方面的知识,浏览器缓存方面,nginx配置方面,webpack的分包策略,页面解析渲染方面,图片优化方面,离线加载方面的知识。

这道题想要答得出彩,应当还是找到一两个方面深入研究。

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

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

相关文章

jQuery 框架学习笔记(基础)

What jQuery 是一种快速、简洁跨游览器的 JavaScript 函数库,其宗旨是“Write less, Do more”,它封装JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作、事件处理、动画设计和Ajax交互。 注意&…

浏览器清除所有断点

浏览器清除所有断点 问题分析 问题 谷歌浏览器清除所有断点 分析 在打断点的 Source 栏下 1、右键Breakpoints下的内容。 2、弹出选项,点击remove all breakpoints。

MySQL常用函数集锦 --- 字符串|数值|日期|流程函数总结

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【MySQL学习专栏】🎈 本专栏旨在分享学习MySQL的一点学习心得,欢迎大家在评论区讨论💌 目录 一、字符…

请问一下就是业务概念模型和业务逻辑模型有啥关系

请问一下就是业务概念模型和业务逻辑模型有啥关系? 业务概念模型和业务逻辑模型是业务建模的两个关键组成部分,两者密切相关但又有所不同。 1.业务概念模型:这是对业务术语、定义和关系的一种抽象表示。它是从业务专家那里获得的知识&#…

ES6的代理模式 | Proxy

🎬 岸边的风:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 正文 语法 Handler 对象常用的方法 handler.get 可撤消的Proxy Proxy的应用场景 校验器 私有属性 为什么要…

nacos安装和入门

Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 一、Nacos在mac环境的服务搭建 1、首先进入Nacos官网,链接 2、点击前往Github,点击红色链接。 3、选择相应版本下载。 4、下载之后解压。 5、在终端执行以下命令启动Nacos…

为什么 InfiniBand 网络在高性能计算数据中心如此重要?

随着数据分析和机器学习等高数据吞吐量应用的快速扩展,对高带宽和低延迟互连的需求也扩展到更广阔的市场。为更好应对这一需求,越来越多的高性能计算数据中心选择采用InfiniBand技术。相较于以太网,InfiniBand是一种专为高速互连而设计的网络…

使用jupyter运行sympy库

1.首先下载sympy插件: (1)在下图这里输入cmd (2)pip install sympy 若出现不信任此资源错误,改成pip install sympy--trusted-host pypi.tuna.tsinghua.edu.cn (3)检查是否安装成功 python import sympy sympy.__version__&#…

PCB走线规则

1、线间距。 这里应该遵循3W规则,所谓3W就是为了减少线间串扰,应保证线间距足够大,当线中心不少于3倍线宽,则可 保持70%的电场不互相干扰。如要达到98%的电场不互相干扰,可使用10W的间距。——这是查阅华为PCB布线规则…

UDP与TCP报头介绍,三次握手与四次挥手详谈

先介绍我们UDP/TCP协议缓冲区 在UDP和TCP在数据传输和介绍时有有缓冲区概念的。 UDP缓冲区 UDP没有真正意义上的 发送缓冲区. 调用sendto会直接交给内核, 由内核将数据传给网络层协议进行后 续的传输动作; UDP具有接收缓冲区. 但是这个接收缓冲区不能保证收到的UDP报的顺序…

repmgr管理pg高可用

repmgr用于管理 PostgreSQL 服务器集群内的复制和故障转移,类似dg-broker,可以实现swichover和failover。 整体架构 repmgr架构图如下: 每个节点都可通过 repmgrd 守护进程来监控节点数据库状态;每个节点元数据表可独立维护&…

Stream流处理快速上手最佳实践 | 京东物流技术团队

一 引言 JAVA1.8得益于Lambda所带来的函数式编程,引入了一个全新的Stream流概念Stream流式思想类似于工厂车间的“生产流水线”,Stream流不是一种数据结构,不保存数据,而是对数据进行加工处理。Stream可以看作是流水线上的一个工…

深度解析NLP文本摘要技术:定义、应用与PyTorch实战

目录 1. 概述1.1 什么是文本摘要?1.2 为什么需要文本摘要? 2. 发展历程2.1 早期技术2.2 统计方法的崛起2.3 深度学习的应用2.4 文本摘要的演变趋势 3. 主要任务3.1 单文档摘要3.2 多文档摘要3.3 信息性摘要 vs. 背景摘要3.4 实时摘要 4. 主要类型4.1 抽取…

【Linux进行时】进程状态

进程状态: ❓假设我们在上课,在B站上上课,请问我们的B站是不是一直运行呢?💡不是的! ❓假设我们同时打开了B站和PDF阅读器时,是怎么运行的呢? 💡每一个进程在CPU跑一会&a…

Layui快速入门之第十三节 日期与时间选择器

目录 一:基本用法 API 渲染 属性 弹出提示 2.8 获取实例 2.8 解除实例绑定 2.8 关闭日期面板 2.7 获取某月的最后一天 二:常规用法 三:多类型选择器 四:范围选择 五:直接静态显示 六:更多功能…

Vue入门--vue的生命周期

一.什么是Vue 二.Vue的简介 官方网址 特点 三. 前后端的分离 重大问题 优势 4.Vue入门 定义一个管理边界 ​编辑 测试结果 vue的优势 ​编辑 测试结果 5.Vue的生命周期 vue的生命周期图 ​编辑建立一个html 测试结果 一.什么是Vue Vue是一种流行的JavaScript前端框…

华为云云耀云服务器L实例评测|使用宝塔10分钟部署一个围猫猫小游戏

目录 前言一、选择华为云云耀云服务器L实例的原因二、华为云云耀云服务器的优势三、快速部署一个小游戏(1)终端部署1、使用Termius工具连接终端2、安装Nginx3、上传打包文件 (2)宝塔可视化面板部署1、进入宝塔2、宝塔菜单3、上传代…

【实训项目】你好,教练-校园私教平台的设计与开发

1.设计摘要 随着社会的进步,人们的健康意识逐渐提高,越来越多的人选择在闲暇时间健身,在大学生群体中,这一现象犹为明显。在大学城内,有多家健身房供同学选择,也有许多同学选择在操场或者宿舍内自己健身&a…

使用Seata实现分布式事务

Seata 一:故事背景二:使用方法2.1 下载安装Seata2.4 修改对应配置文件。2.4.1 配置中心2.4.1 注册中心2.4.2 日志保存模式 2.3 启动Seata2.4 项目中集成2.5 数据库内新建undo_log 表进行日志记录2.6 编写代码测试Seata提供的分布式事务功能 三&#xff1…

带你熟练使用list

🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻强烈推荐优质专栏: 🍔🍟🌯C的世界(持续更新中) 🐻推荐专栏1: 🍔🍟🌯C语言初阶 🐻推荐专栏2: 🍔…