【面试题】2023年前端最新面试题-性能优化篇

news2024/11/24 18:32:54

原文见:语雀(https://www.yuque.com/deepstates/interview/xtt59x)

● 性能指标
● 分析工具
● 优化方式
○ 加载
○ 渲染
● 专题优化
○ 技术栈:react
○ 浏览器
○ 打包工具:webpack
● 项目
⭐️⭐️⭐️ 相关知识点参考:
性能指标
首屏和白屏时间如何计算?
一、首屏时间的计算,可以由 Native WebView 提供的类似 onload 的方法实现,在 ios 下对应的是 webViewDidFinishLoad,在 android 下对应的是onPageFinished事件。
二、白屏的定义有多种。可以认为“没有任何内容”是白屏,可以认为“网络或服务异常”是白屏,可以认为“数据加载中”是白屏,可以认为“图片加载不出来”是白屏。场景不同,白屏的计算方式就不相同。
方法1:当页面的元素数小于x时,则认为页面白屏。比如“没有任何内容”,可以获取页面的DOM节点数,判断DOM节点数少于某个阈值X,则认为白屏。
方法2:当页面出现业务定义的错误码时,则认为是白屏。比如“网络或服务异常”。
方法3:当页面出现业务定义的特征值时,则认为是白屏。比如“数据加载中”。

如何优化
优化方式
提升页面性能的方法有哪些?
一、加载页面和静态资源
1、静态资源压缩合并,减少http请求。
(1)减少http请求数量
(2)减少请求资源大小
2、非核心代码异步加载。
3、静态资源缓存:通过链接名称控制缓存,只有内容改变的时候,链接名称才会改变。
4、利用浏览器缓存
5、使用cdn让资源加载更快
6、预解析dns
7、使用ssr后端渲染,数据直接输出到html中(ssr:server site render)
二、页面渲染
1、css、js及放置位置
(1)尽量避免在HTML标签中写style属性
(2)css放前面,js放后面。
(3)避免使用CSS Expression
2、图片
(1)避免图片和iFrame等的空Src。空Src会重新加载当前页面,影响速度和效率
(2)懒加载(图片懒加载,下拉加载更多)

3、dom操作
(1)减少dom查询,对dom查询做缓存。

// 未缓存dom查询
var i;
for (i = 0; i < document.getElementsByTagName(‘p’).length; i++) {
// todo
}
// 缓存了dom查询
var pList = document.getElementByTagName(‘p’);
var i;
for (i = 0; i < pList.length; i++) {
// todo
}

(2)减少dom操作,多个操作尽量合并在一起执行。

var frag = document.createDocumentFragment(); // 片段,循环插入dom,改成先插入到片段,再append到文档流

(3)用innerHTML代替DOM操作,减少DOM操作次数,优化javascript性能
4、事件
(1)尽早执行操作(如DOMContentLoaded)
(2)事件节流

var textarea = document.getElementById(‘text’);
var timeoutId;
textarea.addEventListener(‘keyup’, function() {
if(timeoutId) {
clearTimeout(timeoutId);
}
timeoutId = setTimeout(function() {
// 触发change事件
}, 100)
})

5、代码细节优化
(1)用hash-table来优化查找
(2)多个变量声明合并
(3)少用全局变量
(4)避免全局查询
(5)避免使用with(with会创建自己的作用域,会增加作用域链长度)
(6)用setTimeout来避免页面失去响应
三、移动端性能优化
1、css
(1)不滥用Float。Float在渲染时计算量比较大,尽量减少使用
(2)不滥用Web字体。Web字体需要下载,解析,重绘当前页面,尽量减少使用。
(3)避免使用css3渐变阴影效果。
2、css动画
(1)尽量使用css3动画,开启硬件加速。
可以用transform: translateZ(0)来开启硬件加速。
CSS中的属性(CSS3 transitions、CSS3 3D transforms、Opacity、Canvas、WebGL、Video)会触发GPU渲染,请合理使用。过渡使用会引发手机过耗电增加
3、合理使用requestAnimationFrame动画代替setTimeout
4、适当使用touch事件代替click事件。

你有用过哪些前端性能优化的方法?

加载
预解析dns
预解析dns的方式?
1、

2、强制打开a标签的dns预解析

页面中所有a标签,默认打开了dns预解析,如果链接是https开头的,默认关闭dns预解析
非核心代码异步加载
异步加载的方式?
1、动态脚本加载
script标签,加入到body中
2、defer
加载js的时候,script标签加defer和async
3、async

异步加载的区别?
1、defer是在html解析完之后才会执行,如果是多个,按照加载的顺序依次进行。
2、async是在加载完之后立即执行,如果是多个,执行顺序和加载顺序无关。

渲染
什么是防抖和节流?有什么区别?如何实现??
防抖
触发高频事件后n秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算时间
思路:
每次触发事件时都取消之前的延时调用方法

function debounce(fn) {
let timeout = null; // 创建一个标记用来存放定时器的返回值
return function () {
clearTimeout(timeout); // 每当用户输入的时候把前一个 setTimeout clear 掉
timeout = setTimeout(() => { // 然后又创建一个新的 setTimeout, 这样就能保证输入字符后的 interval 间隔内如果还有字符输入的话,就不会执行 fn 函数
fn.apply(this, arguments);
}, 500);
};
}
function sayHi() {
console.log(‘防抖成功’);
}

var inp = document.getElementById(‘inp’);
inp.addEventListener(‘input’, debounce(sayHi)); // 防抖
节流
高频事件触发,但在n秒内只会执行一次,所以节流会稀释函数的执行频率
思路:
每次触发事件时都判断当前是否有等待执行的延时函数
function throttle(fn) {
let canRun = true; // 通过闭包保存一个标记
return function () {
if (!canRun) return; // 在函数开头判断标记是否为true,不为true则return
canRun = false; // 立即设置为false
setTimeout(() => { // 将外部传入的函数的执行放在setTimeout中
fn.apply(this, arguments);
// 最后在setTimeout执行完毕后再把标记设置为true(关键)表示可以执行下一次循环了。当定时器没有执行的时候标记永远是false,在开头被return掉
canRun = true;
}, 500);
};
}
function sayHi(e) {
console.log(e.target.innerWidth, e.target.innerHeight);
}
window.addEventListener(‘resize’, throttle(sayHi));

图片优化
一个页面上有大量的图片(大型电商网站),加载很慢,你有哪些方法优化这些图片的加载,给用户更好的体验 ?
● 图片懒加载,在页面上的未可视区域可以添加一个滚动条事件,判断图片位置与浏览器顶端 的距离与页面的距离,如果前者小于后者,优先加载。
● 如果为幻灯片、相册等,可以使用图片预加载技术,将当前展示图片的前一张和后一张优先 下载。
● 如果图片为 css 图片,可以使用 CSSsprite,SVGsprite,Iconfont、Base64 等技术。 如果图片过大,可以使用特殊编码的图片,加载时会先加载一张压缩的特别厉害的缩略图, 以提高用户体验。
● 如果图片展示区域小于图片的真实大小,则因在服务器端根据业务需要先行进行图片压缩, 图片压缩后大小与展示一致。

优化专题
技术栈
react

浏览器
针对浏览器做的优化?(阿里)
需要了解浏览器相关的原理,如缓存/存储、代理、SSR等
针对渲染引擎的工作内容想到的优化,如css解析会影响dom渲染、合成优化减少回流重绘、web worker、event loop等

打包工具
webpack

请求优化

项目
项目性能优化?
● 技术栈
● 浏览器
● 打包工具
● 针对具体的页面做了哪些优化,比如首页该做什么,首页最新指标
● 应用场景,项目中用到了哪些方法
● 针对中等项目、大型项目的性能选择

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

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

相关文章

如何隐藏电脑硬盘分区?

无论是个人还是公司的电脑我们都会储存一些重要的数据&#xff0c;有些甚至还是涉及个人隐私或公司的商业机密。为了更好地保护电脑磁盘中的重要资料&#xff0c;部分用户希望能将硬盘分区隐藏起来。那么怎么隐藏硬盘分区呢&#xff1f;方法一&#xff1a;使用磁盘管理隐藏硬盘…

将vscode打造为你的开发工具的首选

文章目录前言vscode主要配置vscode的两个主要快捷键Java配置JDK和Gradle环境主要插件常见的配置launch.json配置运行测试用例常见问题Python主要插件settings.json配置Javascript/typescript常用插件settings.json样例Golang参考前言 什么是IDE? IDE 文本编辑 搜索 代码导…

Matlab矩阵和数组的操作

一、矩阵的建立 1、直接输入法 将矩阵的元素用方括号括起来&#xff0c;按矩阵行的顺序输入各元素&#xff0c;同一行的各元素之间用空格或逗号分隔&#xff0c;不同行的元素之间用分号分隔。 A [16 3 2 13; 5 10 11 8; … 9 6 7 12; 4 15 14 1] A 16 3 2 13 5 10 11 8 9 6…

如何有效的增加 shopee 的流量?

很多卖家选择在跨境电商平台开店。说到跨境电商&#xff0c;大家首先想到的应该是亚马逊、易趣等电商平台&#xff0c;边肖会在shopee平台上给大家带来店铺。新店如何获得流量&#xff1f;有哪些方式&#xff1f;米贸搜为你整理如下&#xff1a;shopee店铺如何获取流量&#xf…

Python学习笔记——函数

函数是组织好的&#xff0c;可重复使用的&#xff0c;用来实现单一&#xff0c;或相关联功能的代码段。能提高应用的模块性&#xff0c;和代码的重复利用率。定义函数定义函数使用关键字def&#xff0c;后接函数名&#xff0c;再后接放在圆括号&#xff08;&#xff09;中的可选…

P1036 [NOIP2002 普及组] 选数————C++

题目 [NOIP2002 普及组] 选数 题目描述 已知 nnn 个整数 x1,x2,⋯,xnx_1,x_2,\cdots,x_nx1​,x2​,⋯,xn​&#xff0c;以及 111 个整数 kkk&#xff08;k<nk<nk<n&#xff09;。从 nnn 个整数中任选 kkk 个整数相加&#xff0c;可分别得到一系列的和。例如当 n4n4…

支持ITIL的IT帮助台

什么是ITIL 信息技术基础架构库 &#xff08;ITIL&#xff09; 是一套集成的最佳实践&#xff0c;旨在帮助企业向客户提供 IT 服务。ITIL是由中央设计的广泛采用的框架 计算机和电信局&#xff08;CCTA&#xff09;&#xff0c;英国的政府机构;它目前由AXELOS Ltd拥有。 ITIL…

【微信小程序】实用教程03-自定义底部导航(含自定义tabBar导航高亮需点击两次的解决方案)

开始前&#xff0c;请先完成底部导航的开发&#xff0c;详见 【微信小程序】实用教程01-注册登录账号&#xff0c;获取 AppID、下载安装开发工具、创建项目、上传体验 显然&#xff0c;纯文字的底部导航有点low&#xff0c;还是需要有图标的才酷&#xff0c;下面我们一起来实…

python的numpy的用法总结

本文总结Numpy的用法&#xff0c;建议先学习python的container 基础。numpy可以理解列表或数组。一个numpy数组是一个由不同数值组成的网格。网格中的数据都是同一种数据类型&#xff0c;可以通过非负整型数的元组来访问。维度的数量被称为数组的阶&#xff0c;数组的大小是一个…

五个了解自己天赋优势的分析工具(五)PDP性格测试

PDP性格测试 PDP的全称是Professional Dyna-Metric Programs⾏为特质动态衡量系统&#xff0c;它是⼀个⽤来衡量个⼈的⾏为特质、活⼒、动能、压⼒、精⼒及能量变动情况的系统。 PDP根据⼈的天⽣特质&#xff0c;将⼈群分为五种类型&#xff0c;包括&#xff1a;⽀配型、外向型…

项目部署 koa项目 (后端)

当你用node koa写好项目后&#xff0c;把它部署到服务器上使用 首先&#xff0c;你要买台服务器&#xff0c;链接到你的服务器上&#xff08;我前面部署前端项目有写&#xff0c;你可以参考&#xff09; 安装node 因为我们是node项目&#xff0c;所以先安装node dnf instal…

学习记录662@项目管理之项目整体管理

什么是项目整体管理 整体管理就是要决定在什么时间把工作量分配到相应的资源上&#xff0c;有哪些潜在的问题并在其出现问题之前积极处理&#xff0c;以及协调各项工作使项目整体上取得一个好的结果。项目整体管理包括选择资源分配方案、平衡相互竞争的目标和方案&#xff0c;…

LiveGBS流媒体平台GB/T28181功能-支持GB35114接入海康大华华为设备通过GB35114国标流媒体平台

LiveGBS流媒体平台GB/T28181功能-支持GB35114接入国标流媒体平台接入说明1、LiveNVR通过GB35114接入LiveGBS1.1、开启LiveGBS 35114功能1.2、 获取设备端证书给平台1.3、LiveGBS白名单中添加需要接入的国密设备1.4、导出LiveGBS平台端证书给设备&#xff08;双向认证需要&#…

嵌入式Linux-进程中常用的函数调用

1. execve()函数 系统调用 execve()可以将新程序加载到某一进程的内存空间&#xff0c;通过调用 execve()函数将一个外部的可执行文件加载到进程的内存空间运行&#xff0c;使用新的程序替换旧的程序&#xff0c;而进程的栈、数据、以及堆数据会被新程序的相应部件所替换&…

W13Scan 漏洞扫描器之XSS插件模块编写示例

一、背景 上周将W13Scan目录结构整理了一番&#xff0c;觉得要深入研究还得从代码层&#xff0c;于是尝试编写一下插件&#xff1b;框架本身已经集成了XSS扫描插件&#xff1b; 本篇文章的XSS插件的编写单纯是为了学习这个框架&#xff0c;所以只支持GET型&#xff0c;了解插…

一文解析企业网盘 带你寻找数据协作的“满分答案”

数据量急剧增长&#xff0c;线上办公逐渐成为常态。许多企业都会选择部署企业网盘来满足日益增长的数据管理与数据协作的需求。网盘市场乱花渐欲迷人眼&#xff0c;企业又该如何从中甄别最适合自己的企业网盘&#xff1f; 网盘&#xff0c;企业的数字基建 飞速发展的科技让企业…

[GIT] GIT拆分仓库--不丢git提交历史记录

背景 如果你的代码仓库里有多个目录&#xff0c;你想把其中一个目录拆分出去变成一个独立的代码仓库。重要的一点是拆分的过程中要保留git提交历史记录。 拆分步骤 1. 检查一下你的 repo 的根目录中。 进入根目录后&#xff0c;快速运行 ls 终端命令以确保列出所有子目录。…

ruoyi-vue版本框架(二)源码目录结构的讲解,与底层子项目的讲解

目录1 目录介绍2 ruoyi-common 子项目3 ruoyi-system 子项目4 配置文件5 ruoyi-framework6 数据库表7 druid 监控1 目录介绍 下载下来源码&#xff0c;后端一共有6个模块 其中 rouyi-admin这个子项目是整个若依框架的web项目&#xff0c;也就是我们要启动的后台就是这个子项目…

Django 第五章RESTFramework(DRF)框架初探以及认识serializers序列化器的增删改查

定义 Django REST framework (简称 DRF) 是一个强大灵活的wb api工具 功能完善&#xff0c;可快速开发api平台 官网地址 https://www.django-rest-framework.org/安装要求 pip3 install django3.2 pip3 install djangorestframework1.0 使用drf实现用户的增删改查 1.创建ap…

influxdb问题: unable to create database ‘mydb‘ 与 failed to send metrics to influx

[influx-metrics-publisher] ERROR i.m.i.InfluxMeterRegistry - [createDatabaseIfNecessary,117] - unable to create database mydb&#xff1b; [influx-metrics-publisher] ERROR i.m.i.InfluxMeterRegistry - [publish,161] - failed to send metrics to influx现象解决方…