优化用户体验:关键 Web 性能指标的获取、分析、优化方法

前言

在当今互联网高速发展的时代用户对于网页的加载速度和响应时间越来越敏感。一个性能表现不佳的网页不仅会影响用户体验,还可能导致用户流失。
因此,了解和优化网页性能指标是每个开发者的必修课。今天我们就来聊聊常见的网页性能指标以及如何获取这些指标。

常见的 Web 页面性能指标

1. 页面加载时间(Load Time)

页面加载时间指的是从用户开始请求网页到页面完全加载完成所花费的时间。这个指标直接影响用户对网站的第一印象。

2. 首次内容绘制(First Contentful Paint, FCP)

FCP 指的是浏览器从开始加载网页到页面上任何内容(例如文本、图片、SVG)的首次绘制时间。这个指标反映了用户看到第一个内容的时间。

3. 首次有意义绘制(First Meaningful Paint, FMP)

FMP 是浏览器从开始加载网页到页面主要内容绘制完成的时间。这个指标主要体现了用户看到主要内容的时间。

4. 完全加载时间(Load Event End)

完全加载时间是指页面所有资源(图片、CSS、JS等)加载完成后的时间。这个指标对整体的用户体验影响较大。

5. 交互时间(Time to Interactive, TTI)

TTI 是指页面从开始加载到用户可以与页面进行交互的时间这个指标对用户体验非常关键,因为它直接影响到用户能否快速操作页面。

6. 页面资源加载时间(Resource Load Time)

页面资源加载时间指的是页面中的各个资源(如图片、JavaScript、CSS文件等)的加载时间。这个指标帮助开发者了解各个资源的加载效率。

获取 Web 页面性能指标的方法

Performance API 是一种浏览器原生的 API,专门用于获取高精度的时间数据,并帮助我们分析网页性能。我们可以使用 Performance API 来获取各种时间点,然后计算各个性能指标。以下是一些常见性能指标的计算方法:

window.addEventListener('load', () => {const performanceData = window.performance.timing;// 页面加载时间const pageLoadTime = performanceData.loadEventEnd - performanceData.navigationStart;// 首次内容绘制 (FCP)const [firstContentfulPaintEntry] = performance.getEntriesByName('first-contentful-paint');const fcp = firstContentfulPaintEntry ? firstContentfulPaintEntry.startTime : 0;// 首次有意义绘制 (FMP)// 注意:FMP 是一个比较复杂的指标,通常需要特殊工具或浏览器支持。const [firstMeaningfulPaintEntry] = performance.getEntriesByName('first-meaningful-paint');const fmp = firstMeaningfulPaintEntry ? firstMeaningfulPaintEntry.startTime : 0;// 交互时间 (TTI)const [timeToInteractiveEntry] = performance.getEntriesByName('interactive');const tti = timeToInteractiveEntry ? timeToInteractiveEntry.startTime : 0;// 页面完全加载时间const loadEventEnd = performanceData.loadEventEnd;const performanceMetrics = {pageLoadTime,fcp,fmp,tti,loadEventEnd};console.log('Performance Metrics:', performanceMetrics);});
  1. 获取页面加载时间:

    const pageLoadTime = performanceData.loadEventEnd - performanceData.navigationStart;
    

    navigationStart 表示导航开始的时间点,loadEventEnd 表示页面加载完成的时间点。

  2. 获取首次内容绘制时间 (FCP):

    const [firstContentfulPaintEntry] = performance.getEntriesByName('first-contentful-paint');
    const fcp = firstContentfulPaintEntry ? firstContentfulPaintEntry.startTime : 0;
    

    使用 performance.getEntriesByName('first-contentful-paint') 获取 FCP 事件的时间。

  3. 获取首次有意义绘制时间 (FMP):

    const [firstMeaningfulPaintEntry] = performance.getEntriesByName('first-meaningful-paint');
    const fmp = firstMeaningfulPaintEntry ? firstMeaningfulPaintEntry.startTime : 0;
    

    FMP 计算相对复杂,可能需要浏览器特殊支持或使用工具。

  4. 获取交互时间 (TTI):

    const [timeToInteractiveEntry] = performance.getEntriesByName('interactive');
    const tti = timeToInteractiveEntry ? timeToInteractiveEntry.startTime : 0;
    

    使用 performance.getEntriesByName('interactive') 获取 TTI 事件的时间。

提高 Web 页面性能的方法

了解了如何获取和分析 Web 页面性能指标后,接下来我们来探讨一下具体的优化方法。针对不同的性能指标,我们可以采取不同的优化策略。

1. 优化页面加载时间(Load Time)

  1. 压缩资源文件:使用工具如 UglifyJS、CSSNano 等来压缩 JavaScript 和 CSS 文件,减少文件体积。
  2. 图像优化:使用工具如 ImageOptim、TinyPNG 等来压缩图片,尽量使用现代图片格式如 WebP。
  3. 启用浏览器缓存:在服务器配置中添加缓存策略,减少重复请求。
  4. 使用内容分发网络(CDN):通过 CDN 加速静态资源的分发,缩短传输距离和时间。

2. 提升首次内容绘制时间(FCP)

  1. 减少关键请求数量:尽量减少阻塞渲染的 CSS 和 JavaScript 文件,将非关键资源异步加载。
  2. 内联关键 CSS:将关键的 CSS 直接内联到 HTML 中,减少外部资源请求。
  3. 延迟加载非关键资源:使用 asyncdefer 属性来延迟加载非关键的 JavaScript 文件。

3. 提升首次有意义绘制时间(FMP)

  1. 确保快速加载关键内容:优先加载用户直接可见的内容,延迟加载其他非关键内容。
  2. 优化字体加载:使用 font-display: swap 属性,使文本在字体加载失败时仍然可见。

4. 优化完全加载时间(Load Event End)

  1. 简化 HTML 结构:减少 DOM 元素的数量,优化 HTML 结构。
  2. 减少重定向:尽量减少 301 和 302 重定向,减少不必要的 HTTP 请求。
  3. 启用 HTTP/2:使用 HTTP/2,可以在一个连接中并行加载多个资源,减少延迟。

5. 提升交互时间(TTI)

  1. 分解长任务:将长任务分解成更小的任务,避免阻塞主线程。
  2. 减少 JavaScript 执行时间:优化 JavaScript 代码,减少计算量,避免不必要的 DOM 操作。
  3. 使用 Web Workers:将复杂的计算任务移到 Web Workers 中,避免阻塞主线程。

6. 优化页面资源加载时间(Resource Load Time)

  1. 按需加载资源:使用动态导入(Dynamic Imports)来按需加载模块和资源。
  2. 预加载关键资源:使用 <link rel="preload"> 来预加载关键资源,减少加载时间。
  3. 合并请求:将多个小文件合并成一个大文件,减少 HTTP 请求的数量。

监控和持续优化

1. 持续监控

定期监控网页性能是确保优化效果持久的关键。以下是一些持续监控的方法:

  1. 设置定期自动化测试:使用工具如 Lighthouse CI 或 WebPageTest API 定期对网站性能进行测试,并生成报告。
  2. 使用性能监控工具:如 New Relic、Google Analytics 的站点速度报告等,实时监控网站性能。
  3. 日志记录和分析:记录用户的实际性能数据,分析用户在不同设备和网络状况下的体验。

2. 持续优化

性能优化是一个持续的过程,需要不断的监控和调整。以下是一些持续优化的建议:

  1. 定期审查代码:定期进行代码审查,发现和解决性能问题。
  2. 保持依赖项更新:保持依赖项(如框架、库)的更新,以利用最新的性能优化和漏洞修复。
  3. 用户反馈:定期收集用户反馈,了解用户在实际使用中的体验,做出针对性的优化。

总结

通过深入了解和分析 Web 页面性能指标,并采取相应的优化措施,我们可以显著提升网页的加载速度和用户体验。无论是压缩资源文件、优化关键内容加载,还是使用现代技术如 HTTP/2 和 Web Workers,每一步的优化都将为用户带来更快、更流畅的浏览体验。

优化网页性能不是一蹴而就的事情,而是一个需要持续关注和不断改进的过程。希望通过本文的介绍,你能更好地理解 Web 页面性能指标,并运用各种工具和方法,不断优化你的网页性能。

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

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

相关文章

vs code配置 c/C++

1、下载VSCode Visual Studio Code - Code Editing. Redefined 安装目录可改 勾选创建桌面快捷方式 安装即可 2、汉化VSCode 点击确定 下载MinGW 由于vsCode 只是一个编辑器&#xff0c;他没有自带编译器&#xff0c;所以需要下载一个编译器"MinGW". https://…

Kotlin关键字`when`的详细用法

Kotlin关键字when的详细用法 在Kotlin中&#xff0c;when是一个强大的控制流语句&#xff0c;相当于其他语言中的switch语句&#xff0c;但更加强大且灵活。本文将详细讲解when的用法及其常见场景&#xff0c;并与Java的switch语句进行对比。 一、基本语法 基本的when语法如…

MFCday01、模式对话框

对话框类和应用程序类。 MFC中 Combo Box List Box List Control三种列表控件&#xff0c;日期控件Date Time Picker

接口测试笔记

4、接口测试自动化 接口自动化概述 HttpClient HttpClient开发过程 创建Java工程 新建libs库目录 HttpClient 工具下载及引入 https://hc.apache.org/index.html工程中引入jar包 Get请求 HttpGet方法---发起Get请求 创建HttpClient对象 CloseableHttpClient httpclient …

查找sql中涉及的表名称

import pandas as pd import datetime todaystr(datetime.date.today())filepath/Users/kangyongqing/Documents/kangyq/202303/分析模版/sql表引用提取/ file101试听课明细.txt newfilefile1.title().split(.)[0]with open(filepathfile1,r) as file:contentfile.read().lower…

如何在Ubuntu上构建编译LLVM和ISPC,以及Ubuntu上ISPC的使用方法

之前一直在 Mac 上使用 ISPC&#xff0c;奈何核心/线程太少了。最近想在 Ubuntu 上搞搞&#xff0c;但是 snap 安装的 ISPC不知道为什么只能单核&#xff0c;很奇怪&#xff0c;就想着编译一下&#xff0c;需要 Clang 和 LLVM。但是 Ubuntu 很搞&#xff0c;他的很多软件版本是…

【Spring IOC/AOP】

IOC 参考&#xff1a; Spring基础 - Spring核心之控制反转(IOC) | Java 全栈知识体系 (pdai.tech) 概述&#xff1a; Ioc 即 Inverse of Control &#xff08;控制反转&#xff09;&#xff0c;是一种设计思想&#xff0c;就是将原本在程序中手动创建对象的控制权&#xff…

电感与电容的具体应用

文章目录 一、电感应用1.​电源滤波&#xff1a;2. 储能——平滑“电流波浪”​ ​3. 调谐——校准“频率乐器”​4. 限流——防止“洪水灾害”​二、电容应用1.核心特性理解2.应用场景 三.电容电感对比 一、电感应用 1.​电源滤波&#xff1a; ​场景&#xff1a;工业设备中…

前端面试:axios 请求的底层依赖是什么?

在前端开发中&#xff0c;Axios 是一个流行的 JavaScript 库&#xff0c;用于发送 HTTP 请求。它简化了与 RESTful APIs 的交互&#xff0c;并提供了许多便利的方法与配置选项。要理解 Axios 的底层依赖&#xff0c;需要从以下几个方面进行分析&#xff1a; 1. Axios 基于 XML…

springboot 3 集成Redisson

maven 依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.12</version></parent><dependencies><dependency><groupId>org.red…

C#中继承的核心定义‌

1. 继承的核心定义‌ ‌继承‌ 是面向对象编程&#xff08;OOP&#xff09;的核心特性之一&#xff0c;允许一个类&#xff08;称为‌子类/派生类‌&#xff09;基于另一个类&#xff08;称为‌父类/基类‌&#xff09;构建&#xff0c;自动获得父类的成员&#xff08;字段、属…

Deep research深度研究:ChatGPT/ Gemini/ Perplexity/ Grok哪家最强?(实测对比分析)

目前推出深度研究和深度检索的AI大模型有四家&#xff1a; OpenAI和Gemini 的deep research&#xff0c;以及Perplexity 和Grok的deep search&#xff0c;都能生成带参考文献引用的主题报告。 致力于“几分钟之内生成一份完整的主题调研报告&#xff0c;解决人力几小时甚至几天…

Android SharedPreference 详解

前提&#xff1a;基于 Android API 30 1. 认识 SharedPreference SharedPreference 是 Android 提供的轻量级的&#xff0c;线程安全的数据存储机制&#xff0c;使用 key-value 键值对的方式将数据存储在 xml 文件中&#xff0c;存储路径为 /data/data/yourPackageName/share…

自动化测试脚本语言选择

测试人员在选择自动化测试脚本语言时面临多种选项。Python、Java、C#、JavaScript 和 Ruby 都是常见选择&#xff0c;但哪种语言最适合&#xff1f;本文将详细分析这些语言的特点、适用场景和优劣势&#xff0c;结合行业趋势和社会现象&#xff0c;为测试人员提供全面指导。 选…

【Java项目】基于JSP的KTV点歌系统

【Java项目】基于JSP的KTV点歌系统 技术简介&#xff1a;采用JSP技术、B/S结构、MYSQL数据库等实现。 系统简介&#xff1a;KTV点歌系统的主要使用者分为管理员和用户&#xff0c;实现功能包括管理员&#xff1a;个人中心、用户管理、歌曲库管理、歌曲类型管理、点歌信息管理&a…

element-plus文档解析之Layout布局(el-row,el-col)

前言 这是element-plus提供的响应式布局组件。可以非常方便的实现响应式布局以及快速按比例分块。 例如实现下面的效果&#xff1a; 第一行&#xff1a;宽度占100% 第二行&#xff1a;宽度1&#xff1a;1 第三行&#xff1a;1&#xff1a;1&#xff1a;1 第四行&#xff1a;1…

【Java】——数据类型和变量

个人主页&#xff1a;User_芊芊君子 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 文章目录&#xff1a; 1.Java中的注释1.1.基本规则1.2.注释规范 2.标识符3.关键字4.字面常量5.数据类型6.变量6.1变量的概念6.2语法6.3整型变量6.3.1整型变量6.3.2长整…

串口数据记录仪DIY,体积小,全开源

作用 产品到客户现场出现异常情况&#xff0c;这个时候就需要一个日志记录仪、黑匣子&#xff0c;可以记录产品的工作情况&#xff0c;当出现异常时&#xff0c;可以搜集到上下文的数据&#xff0c;从而判断问题原因。 之前从网上买过&#xff0c;但是出现过丢数据的情况耽误…

JVM中是如何定位一个对象的

在 Java 中&#xff0c;对象定位指的是如何通过引用&#xff08;Reference&#xff09;在堆内存中找到对象实例及其元数据&#xff08;如类型信息&#xff09;。JVM 主要通过 直接指针访问 和 句柄访问 两种方式实现&#xff0c;各有其优缺点和应用场景&#xff1a; 一、直接指…

Mac 如何在idea集成SVN

在windows系统上面有我们最为熟悉的小乌龟TortoiseSVN&#xff0c;在mac系统上面则没有什么好用的svn的工具&#xff0c;而且大部分都付费&#xff0c;需要各种渠道找PJ版&#xff0c;费事费力&#xff0c;作为程序员&#xff0c;大部分人应该都会安装开发工具&#xff0c;本文…