如何通过性能API测量页面加载时间,以及这些指标在实际优化中的应用方法有哪些?

Performance API通过navigation和resource类型数据及PerformanceObserver,精准分析页面加载各阶段耗时与用户体验指标。

如何通过性能api测量页面加载时间,以及这些指标在实际优化中的应用方法有哪些?

说起网站性能,大家最直观的感受往往就是“快不快”。而“快”这个词背后,其实藏着一整套精密的测量体系。Performance API,在我看来,就是前端开发者手里的那把瑞士军刀,它能让我们不只是凭感觉说页面慢,而是能精确地拆解页面加载的每一个环节,从网络请求到DOM渲染,每一步耗时多少,一目了然。这些细致入微的数据,正是我们识别性能瓶颈、制定优化策略的根本依据。没有它,我们的优化可能就是盲人摸象,有了它,我们才能真正做到有的放矢。

解决方案

那么,具体怎么用这把“瑞士军刀”呢?最核心的,莫过于

performance.getEntriesByType('navigation')

performance.getEntriesByType('resource')

这两个方法,再加上

PerformanceObserver

来监听一些更现代的指标。

navigation

类型的条目,它记录了整个文档从发起请求到完全加载的所有关键时间点。这就像一张详细的航海日志,记录了你的船从港口出发到靠岸的每一步。

// 随便找个地方运行这段代码,比如控制台,就能看到一些基础数据const navEntries = performance.getEntriesByType('navigation');if (navEntries.length > 0) {    const navTiming = navEntries[0];    console.log('--- 页面导航主要时间点 ---');    console.log(`页面总加载时间 (从导航开始到load事件结束): ${(navTiming.loadEventEnd - navTiming.startTime).toFixed(2)} ms`);    console.log(`DNS查询耗时: ${(navTiming.domainLookupEnd - navTiming.domainLookupStart).toFixed(2)} ms`);    console.log(`TCP连接耗时: ${(navTiming.connectEnd - navTiming.connectStart).toFixed(2)} ms`);    console.log(`请求响应耗时 (TTFB - Time To First Byte): ${(navTiming.responseStart - navTiming.requestStart).toFixed(2)} ms`);    console.log(`DOM内容加载完成 (DOMContentLoaded): ${(navTiming.domContentLoadedEventEnd - navTiming.startTime).toFixed(2)} ms`);    console.log(`所有资源加载完成 (loadEventEnd): ${(navTiming.loadEventEnd - navTiming.startTime).toFixed(2)} ms`);} else {    console.log('当前页面没有导航性能条目,可能不是主文档加载。');}

这段代码揭示了从用户点击链接(或者直接输入URL)那一刻起,到页面所有内容(包括图片、CSS、JS等)都加载并执行完毕的整个过程。你会看到DNS解析花了多久,TCP握手用了多久,服务器响应第一个字节用了多久(TTFB),以及DOM树构建和所有资源加载完毕的时间。

光看整体还不够,有时候我们需要知道是哪个具体资源拖了后腿。这时候,

performance.getEntriesByType('resource')

就派上用场了。它会列出页面加载的所有外部资源,比如图片、脚本、样式表、字体等等,以及它们各自的加载耗时。

console.log('n--- 页面资源加载详情 ---');performance.getEntriesByType('resource').forEach(resource => {    // 过滤掉一些不那么重要的或者AJAX请求,专注于页面渲染相关的资源    if (!['xmlhttprequest', 'fetch', 'beacon', 'img', 'script', 'link', 'css', 'font'].includes(resource.initiatorType)) {        return;    }    // 简单展示,实际可以根据需求筛选和排序    console.log(`资源: ${resource.name.substring(0, 80)}..., 类型: ${resource.initiatorType}, 耗时: ${resource.duration.toFixed(2)} ms`);});

但话说回来,这些指标虽然精确,却不总是和用户感受完全同步。用户可不会等到

loadEventEnd

才觉得页面“加载完成”了。他们更关心的是,什么时候能看到内容?什么时候能交互?这就引出了像FCP(First Contentful Paint)和LCP(Largest Contentful Paint)这样的用户体验指标。这些需要通过

PerformanceObserver

来监听。

if ('PerformanceObserver' in window) {    const observer = new PerformanceObserver((list) => {        list.getEntries().forEach(entry => {            if (entry.name === 'first-contentful-paint') {                console.log(`n首次内容绘制 (FCP): ${entry.startTime.toFixed(2)} ms - 用户首次看到页面内容的时间点`);            } else if (entry.name === 'largest-contentful-paint') {                console.log(`最大内容绘制 (LCP): ${entry.startTime.toFixed(2)} ms - 页面主要内容(通常是最大图片或文本块)渲染完成的时间点`);            }        });    });    // 观察'paint'事件获取FCP,观察'largest-contentful-paint'获取LCP    observer.observe({ entryTypes: ['paint', 'largest-contentful-paint'] });} else {    console.log('当前浏览器不支持PerformanceObserver或相关指标。');}

这些指标共同构成了一幅完整的页面加载图景

以上就是如何通过性能API测量页面加载时间,以及这些指标在实际优化中的应用方法有哪些?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/59274.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月10日 13:21:40
下一篇 2025年11月10日 13:25:25

相关推荐

  • 使用 Remotion、Nextjs 和 Tailwind CSS 构建基于 Web 的视频编辑器

    如果您曾经想创建自己的强大的基于网络的视频编辑器(类似于 veed.io 或 descript 等流行工具),那么您来对地方了!在本分步指南中,我们将向您展示如何使用 remotion、next.js 和 tailwind css 构建视频编辑器。最后,您将为开发自己的基于浏览器的视频编辑工具奠定坚…

    2025年12月19日
    000
  • Tom and Jerry Light code

    Hut Light Effect /* Internal CSS */ body { margin: 0; display: flex; justify-content: center; align-items: center; height: 100vh; background: #333; } …

    2025年12月19日
    000
  • 通过正确的 标签放置优化页面性能

    <img src="https://img.php.cn/upload/article/000/465/014/172584203024406.jpg" alt="通过正确的 标签放置优化页面性能”> 标签放置优化页面性能” /&gt…

    2025年12月19日
    000
  • 免费接龙

    很久以前,在同一个星系中,我开始尝试制作 freecell,作为学习 angular 1.3 的一种方式。 我已经走了这么远,然后我就被其他事情分散了注意力,就像副项目一样。 我最近有一些空闲时间(我知道,我也没想到),所以我想我应该再试一次。 我基本上是从头开始,因为我对 angular 1.3 …

    好文分享 2025年12月19日
    000
  • 使用 React 构建笑话生成器

    介绍 在本教程中,我们将指导您使用 react 构建一个简单而有趣的笑话生成器。这个项目非常适合想要练习在 react 中处理 api 请求并管理功能组件中的状态的初学者。 项目概况 这个笑话生成器从 api 中获取随机笑话,并在用户单击按钮时将其显示在屏幕上。它具有干净简约的用户界面,使其易于交互…

    2025年12月19日 好文分享
    000
  • 星球大战主题太阳系指南 – 魅力我的标记:

    这是前端挑战 v24.09.04 的提交,Glam Up My Markup: Space 我建造了什么 探索太阳系:受星球大战启发的银河之旅 想象一下,偶然发现一本来自遥远星系的传奇旅游手册——一本关于被称为太阳系的神秘恒星系统的指南。本着星球大战宇宙的精神,这个项目将我们自己的天体社区变成了冒险…

    2025年12月19日
    000
  • 使用 React 构建密码验证器

    介绍 在本教程中,我们将指导您使用 react 构建一个简单有效的密码验证器。这个项目非常适合想要在 react 中练习表单验证和处理用户输入的初学者。 项目概况 密码验证器实时检查用户密码的强度,并提供有关密码是否符合强密码标准的反馈。反馈显示在输入字段下方,鼓励用户创建更安全的密码。 特征 实时…

    2025年12月19日
    000
  • 完整的 Redux 工具包(第 1 部分)

    redux 工具包的用途 我们已经知道 redux 是 javascript 应用程序的一个强大的状态管理库,特别是在使用 react 时。但是使用 redux 很困难,因为它设置 redux 的代码很繁重。这使得维护和调试变得困难。这就是 redux toolkit 可以提供帮助的地方。 redu…

    2025年12月19日
    000
  • 用一个简单的属性来加速你的 CSS

    您知道吗,您可以通过使用 all: unset; 来大幅减小 css 文件大小?这会重置元素上的所有属性,一次性清除所有继承的样式,使您的 css 更精简且更易于管理。 尝试一下,看看你的代码变得多么干净!如何管理继承的样式? 以上就是用一个简单的属性来加速你的 CSS的详细内容,更多请关注创想鸟其…

    2025年12月19日
    000
  • 编写您的第一个 Web 组件(学习 Modulojs – 第 f 部分

    ? 欢迎所有新订阅者和返回的组件编码者!我即将开始一个新的 10 部分教程系列。虽然我的其他教程使用 modulo.js 构建特定的、有趣的小应用程序,例如口袋妖怪舞会、复古挤压文本编辑器或视频游戏画廊,但本教程系列将建立在基本原则上,从第一部分开始:什么是 web 组件吗? html 和 css …

    2025年12月19日
    000
  • 如何使用 Tailwind CSS 和 JavaScript 创建图像比较滑块

    好奇如何以流畅且交互式的方式显示“之前和之后”图像?今天,我们将仅使用 JavaScript 和 Tailwind CSS 创建一个出色的图像比较滑块。 这个方便的工具非常适合展示更改 – 无论是调整照片、更新产品还是并排比较两个图像。它易于构建,并可为任何项目增添专业气息。让我们深入研…

    2025年12月19日
    000
  • 前端尝试

    这是前端挑战 v24.09.04 的提交内容,美化我的标记:space 我建造了什么 我构建了一个以太空为主题的登陆页面,提供有关太空探索的信息。目标是创造一个有吸引力的简约设计,突出太空历史、当前任务、未来任务等的关键方面。该页面包括主页、关于、历史、当前任务、未来任务、调查问卷和联系信息等部分。…

    2025年12月19日 好文分享
    000
  • 教程:如何将密钥集成到 Nuxtjs 中

    介绍 在本教程中,我们将指导您完成将密钥身份验证集成到 nuxt.js 应用程序中的过程。我们将涵盖从设置 nuxt.js 项目到实现 corbado ui 组件以实现无缝密钥登录体验的所有内容。 如果您想直接跳到代码中,可以在我们的 github 存储库中找到完整的示例。 在此处阅读完整的博客文章…

    2025年12月19日
    000
  • 利用 JavaScript 的集合和映射实现高效的内容管理系统

    javascript 提供了几种强大的数据结构来处理数据集合。其中,map 和 set 对于某些类型的任务特别有用。在本博客中,我们将探讨使用 map 和 set 解决常见编程问题的现实示例。 理解地图和集合在深入示例之前,让我们快速回顾一下 javascript 中的 map 和 set 是什么。…

    2025年12月19日
    000
  • 在当今时代使用 Nextjs:现代 Web 开发框架

    在当今快速发展的数字环境中,Web 开发变得比以往更加复杂和动态。开发人员不断寻找能够简化工作流程、提高性能和增强用户体验的工具。在各种可用的框架中,Next.js 已成为开发人员的最佳选择,因其易用性、灵活性和强大的功能而广受欢迎。 Next.js 构建于 React 之上,通过提供用于构建现代 …

    2025年12月19日
    000
  • 优化 Web 性能:最佳实践和技术

    简介说明:加载缓慢的网站和加载快速的网站之间的比较,突出显示对用户参与度的影响。 在当今快节奏的数字环境中,网络性能是直接影响用户体验、参与度和转化率的关键因素。加载缓慢的网站可能会导致更高的跳出率、更低的用户满意度,并最终导致收入损失。另一方面,经过良好优化的网站可以增强用户体验、提高搜索引擎排名…

    2025年12月19日 好文分享
    000
  • 使用 Nextjs Prisma、TailwindCSS 和 Next Auth 进行旅行预订

    旅行预订应用程序 使用 next.js 14、tailwind css、typescript 和 prisma 进行中的旅行应用程序。允许用户注册、游览浏览、预订和评论提交。对开发过程中的所有贡献开放。 入门 克隆存储库:git clone https://github.com/saidmounai…

    2025年12月19日
    000
  • 了解如何在

    模数教程回来了! 大家好!暑假结束后,我带着 modulo 教程回来了。我正在制作更多教程 – 请继续关注。也就是说,如果您对我的下一个主题有任何特别的想法,请务必在评论中告诉我! 我的上一篇教程是关于 api 驱动的 pokémon dance party 组件的超级快速且有趣的“仅 …

    2025年12月19日 好文分享
    000
  • 如何使用 Tailwind CSS 和 JavaScript 创建持久选项卡

    今天是星期一,这意味着又到了教程的时间了!今天,我们正在构建一个持久选项卡组件,但这次我们将使用 JavaScript 和 Tailwind CSS,而不是像上一个教程中那样使用 Alpine JS。 为什么要持久化标签页? 持久选项卡通过保存用户最后选择的选项卡来增强 Web 应用程序,确保页面重…

    2025年12月19日
    000
  • Loadr,一种在 HTML 中无缝加载大图像的高效解决方案

    它是如何工作的: 它首先从 img src 加载低分辨率图像,然后在 hr-src atrbute 中加载高分辨率图像,一旦加载,就会用高分辨率图像替换低分辨率图像。 查看仓库,如果有星星就太棒了 演示 立即学习“前端免费学习笔记(深入)”; 安装 cdn 使用 cdn 导入 loadr。 inde…

    2025年12月19日
    000

发表回复

登录后才能评论
关注微信