当前位置: 首页 > news >正文

前端性能优化 - 华为面试题

前端性能优化面试题

前端性能优化总体来说分为 优化请求、打包优化、代码优化 。

文章目录

      • 前端性能优化面试题
        • Ⅰ、如何优化请求
          • 图片方面
          • ① 精灵图
          • ② 小图标 Base64
          • ③ 图片懒加载
          • ④ 图标库 采用 svg
          • 请求内容方面
          • ① 减少请求内容大小
          • ②更改请求方式
          • ③ 防抖节流
          • ④ 利用存储
        • Ⅱ、代码优化
          • ① 事件委托
          • ② 减少dom操作
          • ③ 页面结构优化
          • ④ css 优化
        • Ⅲ、框架和打包
          • ① SSR 服务端渲染
          • ② CDN 加速
          • ③ tree-shaking (摇树优化)
          • ④ js 最小拆包
          • ⑤ 路由懒加载
          • ⑥ 异步组件,异步Js

Ⅰ、如何优化请求

图片方面
① 精灵图

通过 background-position 来取每个图标位置,最后每个图标
===>
优势 :
一次请求,多次利用 减少请求频率
👇
在这里插入图片描述


② 小图标 Base64

虽然 内存没有减小 ,存储为超长的字符串码
但是不用请求各种小图标 减少请求频率
应用 (webpack 打包配置)
下载插件:👇
npm i -D url-loader
配置打包: 👇

module: {
  rules: [
       {
        test: /\.(jpeg|jpg|png|svg|gif)$/,
        use: {
          loader: 'url-loader', // 默认使用的是es6模块
          options: { // 配置 
            esModule: false, // 使用common.js规范
            outputPath: 'images', // 输出的文件目录
            name: 'images/[contenthash:4].[ext]',
            limit: 10*1024 // 小于10k转为base64
          }
        }
      }
  ]
}

③ 图片懒加载

电商系统,最为常用;
原理: 👇
滚动到图片位置,再去请求图片
这样浏览多少,加载多少 按需请求
简单实现: 👇

<body>
    <img data-a="./img/1.jpg" alt="">
    <img data-a="./img/2.jpg" alt="">
    <img data-a="./img/3.jpg" alt="">
    <img data-a="./img/4.jpg" alt="">
    <img data-a="./img/5.jpg" alt="">
 </body>
<script>
        const imgs = document.getElementsByTagName('img');
	  	window.onload = window.onscroll = function () { 
            gundong(imgs);
        }
		function gundong(imgs) {
            let height = document.documentElement.clientHeight;
          	let s = document.documentElement.scrollTop || document.body.scrollTop;	
            for (let i = 0; i < imgs.length; i++) {
                if (hight + s > getTop(imgs[i])) {
                    imgs[i].src = imgs[i].getAttribute('data-a');
                }
            }
        }
        function getTop(e) {  //计算到浏览器顶部的距离
            let ss = e.offsetTop;
            while(e = e.offsetParent) {
               ss += e.offsetTop;
            }
            return ss;
        }
 </script>

④ 图标库 采用 svg

svg 是 HTML5 新增的 矢量图 减少请求
svg 图标占用内存非常小
将图标库,选择svg类型图标库
推荐: 👇
Iconify 图标库 ( 包含 Antd、Element ui …的图标 )
安装:👇
npm i -D @iconify/json
地址:👇
点击跳转(开源免费)


请求内容方面
① 减少请求内容大小

每次请求的数据不要太大
表格和列表 类型 后端分页 👇
— 分页尽量后端处理
— 前端传参 ,每次请求每页数据 加快请求响应速度


②更改请求方式

对于获取 表格、或列表内容 ,尽量 get 请求
获取表格, 一般只会传 页码和大小、类型 ( 不会涉及重要参数
get 请求的 速度 > post 请求 速度


③ 防抖节流

防抖:👇例子
表单 点击按钮提交时,然后 几秒内,按钮 不能被点击或点击无效,避免过快重复点击
、、、
节流:👇 例子
搜索框匹配内容时,用户 停止输入到 几秒时去搜索,而不是输入一个 触发一次


④ 利用存储

本地存储 :
cookie、localStorage、sessionStorage
场景:👇
1、第一次请求后,存储到本地,下次发送请求,后端判断数据是否更新,如果不更新不返回数据;
2、用户登录 将token 存储 cookie ,再访问改网页token未过期,则不需要重新登录;


Ⅱ、代码优化

① 事件委托

父标签 绑定点击事件
点击 子标签 同样会执行该函数
举个简单的例子: 👇

<body>
	<ul onclick="fun(event)">
    	<li>111</li>
    	<li>222</li>
    	<li>333</li>
	</ul>
</body>
<script>
function fun(e){
    console.log(e.target.innerHTML);
}
</script>
② 减少dom操作

少 通过 document 来获取对象 如:👇
document.getElementsByClassName( ‘content’ ).innerHTML = 123
因为同时操作多个标签 => 大量的 重绘 重排
可以使用流行的框架 👇
如: vue 、react 都采用 虚拟dom多次操作一次渲染

③ 页面结构优化

将script标签放到最后面可以提前解析DNS资源。

④ css 优化

选择器准确可以减少匹配的时间。
如 : .box>.header_box>.content{ … }
lesssass 可以层级嵌套 会 加快匹配时间
如 👇

<style lang="less">
.box{
	...
	.header_box{
		...
		.content{
			...
		}
	}
}
</style>

Ⅲ、框架和打包

① SSR 服务端渲染

页面在服务端直接渲染成 HTML 字符串,作为服务端响应返回给浏览器,最后在浏览器端将生成静态的 HTML
优势:

  • 首次加载速度快 ,利于SEO

劣势:

  • 不支持路由懒加载 ,
  • 适合页面较少 ,
  • 服务端压力过大

nuxt 是一个SSR 最为流行的框架之一 基于vue 👇
点击了解 nuxt


② CDN 加速

CDN 加速就是将 依赖部署在其他站点上,而不是把资源打包到项目中 。
不需要 npm 或 yarn 下载 ,只需要html 文件的 头部去导入 👇

<body>
    <div id="app"></div>
    <script src="https://cdn.bootcdn.net/ajax/libs/vue/3.1.5/vue.global.min.js"></script>
</body>
// webpack.config .js
module.exports = {
    chainWebpack: config => {
       config.externals({
           'vue': 'Vue',
       })
     },
}

优势:

  • 这种 非常适合带宽比较小的服务器
  • 打包会更加小

劣势:

  • 如果 服务器不差,CDN 加速反而会变慢
  • 请求的依赖包是全量的,没有按需加载

③ tree-shaking (摇树优化)

摇树优化 :顾名思义就是要掉,身上多余的东西
就是打包的时候 ,依赖中没用到的功能,就不打进去
让生产环境的包足够小 👇
向vue 、react 都自带这种功能


④ js 最小拆包

进入每个子页面加载每次用到的 js 逻辑
可以通过 webpack 和 vite 的配置实现


⑤ 路由懒加载

在进入那个路由,加在对应的逻辑
在 vue 和 react 中 应用 👇

vue 采用 () => import('/...') 来导入
---
react 采用 React.lazy(() => import('/...'))

⑥ 异步组件,异步Js

如果有的组件,是通过点击 和 操作之后出现的
这时就可以通过 异步组件和异步Js
实现 功能按需加载 已vue 为例:👇

import { defineAsyncComponent } from 'vue'
const Foo = defineAsyncComponent(() => import('./Foo.vue'))
function loadLazy() {
  return import('./lazy.js')
}

相关文章:

  • netsh命令设置IP地址/DNS服务器地址(域设置)
  • 【Python 小白到精通 | 课程笔记】第三章:数据处理就像侦探游戏(函数和包)
  • 以太坊未来⼗年的的破局之路:区块链模块化+合并成功后,以太坊交易者需要读懂这些数据
  • 使用Vue和SpringBoot开发实验室耗材智能运维系统
  • kubernetes(9)集群安全机制
  • Google Earth Engine (GEE) ——加载2015年乌干达MODIS的LST并绘制时序图
  • 【Linux初阶】Linux下用户的新建和删除 | 查看服务器用户数、在线数、当前用户
  • 2022华为杯研究生数学建模赛题思路分析
  • PTA 3+2 转段考试 数据库mysql(3篇)
  • 【C语言进阶】函数栈帧的创建和销毁(内功修炼)
  • 结构体数组与结构体指针
  • PTA 3+2 转段考试 数据库 mysql(3篇)
  • 技术创新助力港口自动化与智能化
  • 【Day22】力扣LeetCode算法刷题[811. 子域名访问计数]
  • LinkedList - 链表
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • Android Studio:GIT提交项目到远程仓库
  • cookie和session
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • ES学习笔记(12)--Symbol
  • git 常用命令
  • HTTP中GET与POST的区别 99%的错误认识
  • Java比较器对数组,集合排序
  • Markdown 语法简单说明
  • 安装python包到指定虚拟环境
  • 番外篇1:在Windows环境下安装JDK
  • 容器服务kubernetes弹性伸缩高级用法
  • 一份游戏开发学习路线
  • Mac 上flink的安装与启动
  • 阿里云ACE认证学习知识点梳理
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​如何防止网络攻击?
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • $GOPATH/go.mod exists but should not goland
  • (4)Elastix图像配准:3D图像
  • (6)设计一个TimeMap
  • (floyd+补集) poj 3275
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (四)汇编语言——简单程序
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)shell调试方法
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .gitattributes 文件
  • .libPaths()设置包加载目录
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • .net下的富文本编辑器FCKeditor的配置方法
  • .NET正则基础之——正则委托
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • ?.的用法
  • @AliasFor注解
  • @Autowired @Resource @Qualifier的区别