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

前端性能优化全面指南

  • 前端性能优化是提升用户体验的关键,页面加载速度、响应时间和交互流畅度直接影响用户的留存率和满意度。以下是常用的前端性能优化方法,从网络层、资源加载、JavaScript 执行、渲染性能等方面进行全方位优化。

减少 HTTP 请求

  • 合并文件:将多个 CSS 和 JS 文件合并,减少请求次数。
  • 使用图像精灵:将多个小图标合并到一张图片,通过 CSS 的 background-position 定位,减少图片请求数量。

文件压缩与打包

  • 压缩代码:使用工具(如 Webpack、Gulp、UglifyJS 等)去除代码中的空格、注释等无关内容。
  • 图片压缩:通过工具(如 TinyPNG、ImageOptim)优化图片文件大小。

启用浏览器缓存

  • 通过设置 HTTP 头中的 Cache-Control 或 Expires,允许浏览器缓存静态资源,减少重复加载。

异步加载 JS 和 CSS

  • JS 异步加载:使用 async 或 defer 属性异步加载脚本,避免阻塞页面渲染。
  • CSS 资源加载优化:将关键 CSS 写入 HTML 的 ,非关键样式表异步加载。

减少 DOM 操作

  • 频繁的 DOM 操作开销较大,尽量批量修改 DOM 或使用虚拟 DOM(如 React 中的 Virtual DOM)进行优化

使用现代浏览器特性

  • 利用浏览器的预加载、预解析功能,如 prefetch、preload,提前加载后续可能需要的资源。

提升 CSS 选择器性能

  • 尽量使用简单、高效的 CSS 选择器,避免使用层级过深的选择器。

减少重绘和回流

  • 尽量减少对 DOM 的频繁修改,尤其是影响布局的修改,避免引发页面重绘(Repaint)和回流(Reflow)。

使用 HTTP/2

  • 相较于 HTTP/1.1,HTTP/2 可以实现多路复用,提升传输效率。

服务端渲染 (SSR) 和静态生成 (SSG)

  • 对于复杂的 JavaScript 框架(如 React、Vue 等),前端渲染可能导致首屏白屏时间过长。
    可以考虑:
  • SSR (Server-Side Rendering):在服务器端预先渲染页面,用户访问时直接看到 HTML 内容,减少客户端的渲染负担。Next.js 和 Nuxt.js 是常用的支持 SSR 的框架。
  • SSG (Static Site Generation):生成静态 HTML 文件用于服务,适合于内容不经常变动的网站,如博客等。

减少 JavaScript 运行时开销

过多的 JavaScript 会导致页面运行时性能下降,尤其是在低端设备上。可以通过以下方式优化:

  • 减少第三方库的使用:许多第三方库(如 lodash)可能只用到其中一小部分功能,但引入整个库会造成代码冗余。可以通过 Tree Shaking 或按需引入解决:
import { debounce } from 'lodash'; // 仅引入特定功能
  • 惰性初始化:将一些不必要的逻辑推迟到实际需要时再初始化,避免页面加载时的开销。
  • 避免长任务:长时间运行的 JavaScript 会阻塞主线程,影响页面交互。可以使用 requestIdleCallback 或将任务分批次执行。
window.requestIdleCallback(() => {// 在浏览器空闲时执行任务
});

优化图片和视频

  • 响应式图片:使用 srcset 和 sizes 标签为不同设备提供不同尺寸的图片,确保移动设备不会加载过大的图片。
  • 延迟加载非关键图片和视频:使用 loading=“lazy” 属性实现懒加载,或者结合 Intersection Observer API 延迟加载
<img src="image.jpg" loading="lazy" />

图片转 base64 格式

  • 将小图片转换为 base64 编码字符串,并写入 HTML 或者 CSS 中,减少 http 请求
  • 转 base64 格式的优缺点:
    1)它处理的往往是非常小的图片,因为 Base64 编码后,图片大小会膨胀为原文件的 4/3,如果对大图也使用 Base64 编码,后者的体积会明显增加,即便减少了 http 请求,也无法弥补这庞大的体积带来的性能开销,得不偿失
    2)在传输非常小的图片的时候,Base64 带来的文件体积膨胀、以及浏览器解析 Base64 的时间开销,与它节省掉的 http 请求开销相比,可以忽略不计,这时候才能真正体现出它在性能方面的优势

使用字体图标

  • Tree shaking 的作用:消除无用的 JS 代码,减少代码体积
  • tree-shaking 原理:
    1)依赖于 ES6 的模块特性,ES6 模块依赖关系是确定的,和运行时的状态无关,可以进行可靠的静态分析,这就是 tree-shaking 的基础
    2)静态分析就是不需要执行代码,就可以从字面量上对代码进行分析。ES6 之前的模块化,比如 CommonJS 是动态加载,只有执行后才知道引用的什么模块,就不能通过静态分析去做优化,正是基于这个基础上,才使得 tree-shaking 成为可能

合理使用 Tree shaking

内容传递网络 (CDN)

  • CDN:利用全球分布的边缘服务器缩短请求路径,提升资源加载速度。CDN 还可以自动进行图片压缩和优化,提供不同设备适配的资源。

性能监控与分析工具

要持续优化前端性能,必须使用监控工具分析性能瓶颈:

  • Lighthouse:Google 提供的开源工具,可以分析网页的性能、可访问性、SEO 等,并给出优化建议。
  • Performance API:浏览器内置的性能 API,可以在代码中插入时间戳,记录任务执行时间:
performance.mark('startTask');
// 任务执行
performance.mark('endTask');
performance.measure('taskDuration', 'startTask', 'endTask');
  • Webpack Bundle Analyzer:用于分析打包后文件的大小和组成,找到性能瓶颈,删除不必要的依赖。

预加载和预渲染 (Prefetching/Prerendering)

  • Prefetch:提前加载用户可能访问的资源(如下一页所需的 JS、CSS、图片等),减少未来页面跳转时的加载时间。
<link rel="prefetch" href="next-page.html" />
  • Prerender:提前在后台渲染用户可能访问的页面,当用户访问时能立即呈现内容。
<link rel="prerender" href="next-page.html">

路由懒加载

  • SPA 项目,一个路由对应一个页面,如果不做处理,项目打包后,会把所有页面打包成一个文件,当用户打开首页时,会一次性加载所有的资源,造成首页加载很慢,降低用户体验
    加载前提的实现:ES6 的动态地加载模块——import()

  • 调用 import() 之处,被作为分离的模块起点,意思是,被请求的模块和它引用的所有子模块,会分离到一个单独的 chunk 中。

  • 要实现懒加载,就得先将进行懒加载的子模块分离出来,打包成一个单独的文件 webpackChunkName 作用是 webpack 在打包的时候,对异步引入的库代码(lodash)进行代码分割时,设置代码块的名字。webpack 会将任何一个异步模块与相同的块名称组合到相同的异步块中

骨架屏优化白屏时长

  • 使用骨架屏,可以缩短白屏时间,提升用户体验。国内大多数的主流网站都使用了骨架屏,特别是手机端的项目
  • SPA 单页应用,无论 vue 还是 react,最初的 html 都是空白的,需要通过加载 JS 将内容挂载到根节点上,这套机制的副作用:会造成长时间的白屏
  • 常见的骨架屏插件就是基于这种原理,在项目打包时将骨架屏的内容直接放到 html 文件的根节点中
requestAnimationFrame 制作动画
  • requestAnimationFrame 是浏览器专门为动画提供的 API,它的刷新频率与显示器的频率保持一致,使用该 api 可以解决用 setTimeout/setInterval 制作动画卡顿的情况

  • setTimeout/setInterval、requestAnimationFrame 三者的区别:

  • 1)引擎层面
    setTimeout/setInterval 属于 JS 引擎,requestAnimationFrame 属于 GUI 引擎
    JS 引擎与 GUI 引擎是互斥的,也就是说 GUI 引擎在渲染时会阻塞 JS 引擎的计算

  • 2)时间是否准确
    requestAnimationFrame 刷新频率是固定且准确的,但 setTimeout/setInterval 是宏任务,根据事件轮询机制,其他任务会阻塞或延迟 js 任务的执行,会出现定时器不准的情况

  • 3)性能层面
    当页面被隐藏或最小化时,setTimeout/setInterval 定时器仍会在后台执行动画任务,而使用 requestAnimationFrame 当页面处于未激活的状态下,屏幕刷新任务会被系统暂停

长列表虚拟滚动

  • 首页中不乏有需要渲染长列表的场景,当渲染条数过多时,所需要的渲染时间会很长,滚动时还会造成页面卡顿,整体体验非常不好
  • 虚拟滚动——指的是只渲染可视区域的列表项,非可见区域的不渲染,在滚动时动态更新可视区域,该方案在优化大量数据渲染时效果是很明显的

相关链接

演示地址
获取更多
源码地址

相关文章:

前端性能优化全面指南

前端性能优化是提升用户体验的关键&#xff0c;页面加载速度、响应时间和交互流畅度直接影响用户的留存率和满意度。以下是常用的前端性能优化方法&#xff0c;从网络层、资源加载、JavaScript 执行、渲染性能等方面进行全方位优化。 减少 HTTP 请求 合并文件&#xff1a;将多…...

JavaScript-API(倒计时的实现)

基础知识 1.时间对象的使用 1.1 实例化 要获取一个时间首先需要一个关键词new了实例化 const time new Date&#xff08;&#xff09; 如果是获取具体的具体的时间 const time new Date(2024-6-1 16:06:44) 1.2 日期对象方法 方法作用说明getFullYear()获得年份获得4…...

【C++】——继承【上】

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 博主主页&#xff1a;Yan. yan.                        …...

SpringBoot 整合 阿里云 OSS图片上传

一、OOS 简介 ‌阿里云OSS&#xff08;Object Storage Service&#xff09;是一种基于云存储的产品&#xff0c;适用于存储和管理各种类型的文件&#xff0c;包括图片、视频、文档等。‌ 阿里云OSS具有高可靠性、高可用性和低成本等优点&#xff0c;因此被广泛应用于各种场景&…...

内核编译 设备驱动 驱动程序

内核编译 一、内核编译的步骤 编译步骤&#xff1a; (linux 内核源码的顶层目录下操作 ) 1. 拷贝默认配置到 .config cp config_mini2440_td35 .config 2. make menuconfig 内核配置 make menuconfig 3. make uImage make u…...

自由学习记录

约束的泛型通配符? Java中的泛型 xiaomi和byd都继承了car&#xff0c;但是只是这两个类是car的子类而已&#xff0c;而arraylist<xiaomi> ,arraylist<byd> 两个没有半毛钱继承关系 所以传入的参数整体&#xff0c;是car的list变形&#xff0c;里面的确都能存car…...

在 C# 中使用 LINQ 查询文件列表并找出最大文件

文章目录 1. 环境准备2. 创建项目3. 引入命名空间4. 示例代码5. 运行代码6. 进阶&#xff1a;异常处理7. 总结 在现代 C# 开发中&#xff0c;LINQ (Language Integrated Query) 提供了一种强大而优雅的方式来处理集合数据。本文将详细介绍如何使用 LINQ 查询文件系统中的文件&a…...

数学建模算法与应用 第6章 微分方程建模及其求解方法

目录 6.1 微分方程建模概述 6.2 发射卫星与三阶火箭建模 Matlab代码示例&#xff1a;火箭发射模拟 6.3 微分方程数值解法 Matlab代码示例&#xff1a;欧拉法与龙格-库塔法 6.4 放射性废料的处理 Matlab代码示例&#xff1a;放射性衰变 6.5 初值问题的Matlab数值求解 习…...

数据库的相关知识

数据库的相关知识 1.数据库能够做什么&#xff1f; 存储大量数据&#xff0c;方便检索和访问保持数据信息的一致、完整共享和安全通过组合分析&#xff0c;产生新的有用信息 2.数据库作用&#xff1f; 存储数据、检索数据、生成新的数据 3.数据库要求&#xff1f; 统一、…...

Python cachetools常用缓存算法汇总

文章目录 cachetools介绍缓存操作设置数据生存时间&#xff08;TTL&#xff09;自定义缓存策略缓存装饰器缓存清理cachetools 超过缓存数量maxsize cachetools 使用示例 cachetools介绍 cachetools : 是一个Python第三方库&#xff0c;提供了多种缓存算法的实现。缓存是一种用于…...

java类和对象_成员变量方法修饰符局部变量this关键字-cnblog

java类和对象 成员变量 权限修饰符 变量类型 变量名; 成员变量可以是任意类型,整个类是成员变量的作用范围 成员变量 成员方法 权限修饰符 返回值类型 方法名() 成员方法可以有参数&#xff0c;也可以有返回值&#xff0c;用return声明 权限修饰符 private 只能在本类…...

海信和TCL雷鸟及各大品牌智能电视测评

买了型号为32E2F(9008)的海信智能的电视有一段时间了&#xff0c;要使用这个智能电视还真能考验你的智商。海信电视有很多优点&#xff0c;它的屏幕比较靓丽&#xff0c;色彩好看&#xff0c;遥控器不用对着屏幕就能操作。但也有不少缺点。 1. 海信智能电视会强迫自动更新操作…...

Linux 基本系统命令及其使用详解手册(六)

指令&#xff1a;mesg   使用权限:所有使用者   使用方式:mesg [y|n]   说明 &#xff1a; 决定是否允许其他人传讯息到自己的终端机介面   把计 :   y:允许讯息传到终端机介面上。   n:不允许讯息传到终端机介面上 。   如果没有设定,则讯息传递与否则由终端机界…...

Oracle架构之段管理和区管理

文章目录 1 段1.1 简介1.1.1 定义1.1.2 分类 1.2 段空间的管理模式1.2.1 手工段空间管理&#xff08;Manual Segment Space Management&#xff09;1.2.2 自动段空间管理&#xff08;Auto Segment Space Management&#xff09; 1.3 段空间的手工管理&#xff08;Manual Segmen…...

mybatis-plus转换数据库json类型数据为java对象

JacksonTypeHandler JacksonTypeHandler 可以实现把json字符串转换为java对象。同一类型的handler有: Fastjson2TypeHandlerFastjsonTypeHandlerGsonTypeHandlerJacksonTypeHandler 至于需要哪一个选一个用就好了 使用方式 在实体类中加入注解 TableName(value "table_…...

Java | Leetcode Java题解之第467题环绕字符串中唯一的子字符串

题目&#xff1a; 题解&#xff1a; class Solution {public int findSubstringInWraproundString(String p) {int[] dp new int[26];int k 0;for (int i 0; i < p.length(); i) {if (i > 0 && (p.charAt(i) - p.charAt(i - 1) 26) % 26 1) { // 字符之差为…...

诺贝尔物理奖与化学奖彰显AI力量,探索智能新边界

在今年的诺贝尔物理学奖和化学奖的颁奖典礼上&#xff0c;人工智能&#xff08;AI&#xff09;再次成为耀眼的明星。两位物理学奖得主约翰J霍普菲尔德和杰弗里E辛顿因在人工神经网络和机器学习领域的开创性工作而获奖&#xff0c;而化学奖则颁给了在蛋白质结构设计和预测方面做…...

基于京东:HotKey实现自动缓存热点Key!!!

一.引言 某些热点数据&#xff0c;我们提前如果能够预判到的话&#xff0c;可以提前人工给数据加缓存&#xff0c;也就是缓存预热&#xff0c;将其缓存在本地或者Redis中&#xff0c;提高访问性能同时&#xff0c;减低数据库压力&#xff0c;也减轻后端服务的压力。但是&#…...

★ 算法OJ题 ★ 二分查找算法

Ciallo&#xff5e;(∠・ω< )⌒☆ ~ 今天&#xff0c;塞尔达将和大家一起做几道二分查找算法算法题 ~ ❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️ 澄岚主页&#xff1a;椎名澄嵐-CSDN博客 算法专栏&#xff1a;★ 优选算法100天 ★_椎名澄嵐的博客-CSDN博客…...

RTSP RTP RTCP SDP基础知识

理论 流&#xff08;Streaming &#xff09; 是近年在 Internet 上出现的新概念&#xff0c;其定义非常广泛&#xff0c;主要是指通过网络传输多媒体数据的技术总称。 流式传输分为两种 顺序流式传输 (Progressive Streaming) 实时流式传输 (Real time Streaming) ​​​​​…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...

wpf在image控件上快速显示内存图像

wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像&#xff08;比如分辨率3000*3000的图像&#xff09;的办法&#xff0c;尤其是想把内存中的裸数据&#xff08;只有图像的数据&#xff0c;不包…...