”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 提升 Web 性能:前端开发人员指南

提升 Web 性能:前端开发人员指南

发布于2024-11-08
浏览:963

Boosting Web Performance: A Guide for Frontend Developers

大家好!自从我上次写博客以来已经有一段时间了,我承认,这让我有点难过。现实是,有太多东西需要学习,有时感觉永远没有足够的时间来深入了解所有内容。我在跟谁开玩笑呢?事实是,我最近拖延得很厉害。

但最近,我一直在探索网络性能——这对于任何前端开发人员来说都是一个至关重要的话题——我很高兴分享我所学到的东西。 性能优化是其中之一,如果做得正确,可以使用户体验您的网站或网络应用程序的方式发生巨大变化。它不仅可以改善用户体验,还可以提高搜索引擎优化,甚至可以影响转化率。

那么,让我们开始吧!

为什么 Web 性能很重要

在当今快节奏的世界中,用户期望网站能够快速加载并顺利交互。如果您的网站速度很慢,用户就会离开——就这么简单。研究表明,即使是几秒钟的延迟也会导致更高的跳出率和更低的参与度。作为前端开发人员,我们有责任确保我们的应用程序不仅看起来不错,而且在各种条件下都表现良好。

在衡量性能方面,Google 通常被认为是黄金标准。 Google 提供了一组称为 Core Web Vitals 的关键指标,可帮助开发人员跟踪和提高其网站的性能。让我们来分解一下:

按照大人的说法Google这些事情对性能很重要

  • FCP(首次内容绘制)
  • LCP(最大内容涂料)
  • CLS(累积布局偏移)
  • TTI(交互时间)
  • INP(与下一个绘画的交互)

让我们更仔细地探索它们

FCP(首次内容绘制)

测量内容: FCP 测量用户导航到您的页面后第一个内容(文本、图像等)出现在屏幕上所需的时间。这是一个关键指标,因为它向用户提供页面正在加载的反馈。 FCP越快,用户体验越好。

如何改进 FCP:

最小化渲染阻塞资源:减少或消除阻塞页面渲染的资源,例如同步 JavaScript 或 CSS。对关键资源使用

延迟非关键 JavaScript: 对非必要脚本使用 deferasync 属性,以确保它们不会阻止初始绘制。

*使用服务器端渲染 (SSR):* SSR 有助于更快地交付初始 HTML,特别是对于动态内容,以便用户可以更快地看到有意义的内容。

优化CSS交付:最小化CSS和内联关键CSS的大小,以便浏览器可以更快地渲染内容。

使用内容交付网络 (CDN): 从 CDN 提供静态资产以减少延迟并加快资源交付。

LCP(最大内容涂料)

测量内容: LCP 重点关注最大元素(通常是英雄图像、大文本块或视频)在视口中完全渲染所需的时间。这是感知加载速度的一个很好的指标,因为一旦加载了最大的内容,用户就会认为页面已准备好。旨在将 LCP 保持在 2.5 秒以下 以获得快速体验。

如何改进 LCP:

优化和压缩图像:使用WebP等现代图像格式,压缩图像,并确保使用srcset和sizes属性提供正确的图像尺寸。

延迟加载首屏图像:对不能立即可见的图像实施延迟加载,以优先加载首屏内容。

预加载重要资源:使用标签更快地加载重要资源,如字体、英雄图像或大型媒体文件。

最小化阻碍渲染的 CSS: 就像使用 FCP 一样,尽量减少使用可能阻碍渲染的大型 CSS 文件。

减少第三方脚本:第三方广告、分析或其他脚本可能会减慢 LCP 的速度。推迟或异步加载非必要的脚本。

CLS(累积布局偏移)

测量内容: CLS 测量页面的视觉稳定性。您是否曾经在阅读某些内容时,突然布局发生变化,导致您迷失了位置或点击了错误的按钮?这是一个糟糕的 CLS 分数。 CLS 跟踪加载过程中页面上有多少元素发生意外移动。低 CLS 对于流畅的用户体验至关重要,尤其是在移动设备上。

如何改进 CLS:

设置图像和视频的尺寸:始终在图像上包含宽度和高度属性,或使用 CSS 宽高比框在加载媒体元素之前为其保留空间。

避免在现有内容之上插入内容:除非绝对必要(例如广告),否则避免在现有内容之上动态添加内容。

使用字体加载策略:加载自定义字体时,使用font-display: swap;以避免字体加载引起的布局变化。

避免在没有空间的情况下注入新广告或弹出窗口:确保在布局空间中考虑动态加载的广告、横幅或弹出窗口,以避免意外的变化。

使用与图像相同空间的图像占位符或加载器

TTI(交互时间)

测量内容: TTI 测量页面完全交互所需的时间。这意味着所有按钮、输入和链接都可用,并且主线程可以自由响应用户输入。快速的 TTI 可确保用户可以快速与您的内容互动,而不会感觉网站缓慢或无响应。

如何提高 TTI:

减少 JavaScript 执行时间: 分解大型 JavaScript 包并仅加载第一次交互所需的必要脚本。在 React 中使用代码拆分(使用 React.lazy())或在 JavaScript 中使用动态导入。
使用 Web Workers: 将繁重的非 UI 阻塞任务卸载给 Web Workers,以保持主线程响应。
延迟长任务: 将长 JavaScript 任务拆分为较小的任务,以避免阻塞主线程太长时间。
预加载关键资源: 确保预加载交互所需的基本资源(脚本、样式),以避免 TTI 延迟。
优化 CSS 和 JavaScript: 缩小、压缩基本代码并确定其优先级。使用树摇动来消除死代码并确保更快的脚本执行。使用GZIP或BROTLI压缩机制

INP(与下一个绘画的交互)

测量内容: INP 是一个相对较新的指标,它跟踪页面响应用户交互(如单击按钮、滚动或键入)并相应更新 UI 所需的时间。它有助于衡量初始负载之外的整体交互性,确保您的应用程序在整个用户会话期间保持敏捷。

如何提高INP:

减少输入延迟: 通过避免阻塞主线程的长 JavaScript 任务,确保快速处理用户输入(点击、按键)。

优先考虑输入响应性:使用 requestAnimationFrame 或 requestIdleCallback 在空闲时间处理非紧急工作,让主线程保持开放状态以进行交互处理。

使用去抖动和限制:处理频繁的用户交互(如滚动或打字)时,对事件处理程序进行去抖动或限制以防止 UI 变得无响应。

延迟加载非关键代码: 将非关键功能的加载推迟到初始交互之后。
例如,您可以使用 React.lazy() 和 Suspense 在 React 中延迟加载组件。

通过遵循这些策略,您可以显着改进这些关键指标并提供更快、响应更灵敏的用户体验。这些优化(尤其是一起应用时)有助于确保您的网站不仅通过 Google 的 Core Web Vitals 测试,而且为您的用户提供卓越的体验

我希望您发现此博客有用,并且您能够从中获得一些关键见解,以帮助您制定下一个绩效改进策略。

有关性能、网络安全、React、Angular、Vue 的更多精彩博客请继续关注我

版本声明 本文转载于:https://dev.to/__junaidshah/boosting-web-performance-a-guide-for-frontend-developers-fhk?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • Android如何向PHP服务器发送POST数据?
    Android如何向PHP服务器发送POST数据?
    在android apache httpclient(已弃用) httpclient httpclient = new defaulthttpclient(); httppost httppost = new httppost(“ http://www.yoursite.com/script.p...
    编程 发布于2025-05-02
  • PHP阵列键值异常:了解07和08的好奇情况
    PHP阵列键值异常:了解07和08的好奇情况
    PHP数组键值问题,使用07&08 在给定数月的数组中,键值07和08呈现令人困惑的行为时,就会出现一个不寻常的问题。运行print_r($月份)返回意外结果:键“ 07”丢失,而键“ 08”分配给了9月的值。此问题源于PHP对领先零的解释。当一个数字带有0(例如07或08)的前缀时,PHP将...
    编程 发布于2025-05-02
  • 如何从PHP中的数组中提取随机元素?
    如何从PHP中的数组中提取随机元素?
    从阵列中的随机选择,可以轻松从数组中获取随机项目。考虑以下数组:; 从此数组中检索一个随机项目,利用array_rand( array_rand()函数从数组返回一个随机键。通过将$项目数组索引使用此键,我们可以从数组中访问一个随机元素。这种方法为选择随机项目提供了一种直接且可靠的方法。
    编程 发布于2025-05-02
  • Go语言垃圾回收如何处理切片内存?
    Go语言垃圾回收如何处理切片内存?
    Garbage Collection in Go Slices: A Detailed AnalysisIn Go, a slice is a dynamic array that references an underlying array.使用切片时,了解垃圾收集行为至关重要,以避免潜在的内存泄...
    编程 发布于2025-05-02
  • \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    答案: 在大多数现代编译器中,while(1)和(1)和(;;)之间没有性能差异。编译器: perl: 1 输入 - > 2 2 NextState(Main 2 -E:1)V-> 3 9 Leaveloop VK/2-> A 3 toterloop(next-> 8 last-> 9 ...
    编程 发布于2025-05-02
  • 如何使用替换指令在GO MOD中解析模块路径差异?
    如何使用替换指令在GO MOD中解析模块路径差异?
    在使用GO MOD时,在GO MOD 中克服模块路径差异时,可能会遇到冲突,其中可能会遇到一个冲突,其中3派对软件包将另一个带有导入套件的path package the Imptioned package the Imptioned package the Imported tocted pac...
    编程 发布于2025-05-02
  • 如何在无序集合中为元组实现通用哈希功能?
    如何在无序集合中为元组实现通用哈希功能?
    在未订购的集合中的元素要纠正此问题,一种方法是手动为特定元组类型定义哈希函数,例如: template template template 。 struct std :: hash { size_t operator()(std :: tuple const&tuple)const {...
    编程 发布于2025-05-02
  • 如何将PANDAS DataFrame列转换为DateTime格式并按日期过滤?
    如何将PANDAS DataFrame列转换为DateTime格式并按日期过滤?
    Transform Pandas DataFrame Column to DateTime FormatScenario:Data within a Pandas DataFrame often exists in various formats, including strings.使用时间数据时...
    编程 发布于2025-05-02
  • MySQL中如何高效地根据两个条件INSERT或UPDATE行?
    MySQL中如何高效地根据两个条件INSERT或UPDATE行?
    在两个条件下插入或更新或更新 solution:的答案在于mysql的插入中...在重复键更新语法上。如果不存在匹配行或更新现有行,则此功能强大的功能可以通过插入新行来进行有效的数据操作。如果违反了唯一的密钥约束。实现所需的行为,该表必须具有唯一的键定义(在这种情况下为'名称'...
    编程 发布于2025-05-02
  • 同实例无需转储复制MySQL数据库方法
    同实例无需转储复制MySQL数据库方法
    在同一实例上复制一个MySQL数据库而无需转储在同一mySQL实例上复制数据库,而无需创建InterMediate sqql script。以下方法为传统的转储和IMPORT过程提供了更简单的替代方法。 直接管道数据 MySQL手动概述了一种允许将mysqldump直接输出到MySQL clie...
    编程 发布于2025-05-02
  • 在Python中如何在一个类内从一个函数调用另一个函数?
    在Python中如何在一个类内从一个函数调用另一个函数?
    在类中调用函数:一种实用方法The Issue:Consider the following code that calculates distances between coordinates:class Coordinates: DEF DISTOPONT(self,p): ...
    编程 发布于2025-05-02
  • 如何解决由于Android的内容安全策略而拒绝加载脚本... \”错误?
    如何解决由于Android的内容安全策略而拒绝加载脚本... \”错误?
    Unveiling the Mystery: Content Security Policy Directive ErrorsEncountering the enigmatic error "Refused to load the script..." when deployi...
    编程 发布于2025-05-02
  • 使用jQuery如何有效修改":after"伪元素的CSS属性?
    使用jQuery如何有效修改":after"伪元素的CSS属性?
    在jquery中了解伪元素的限制:访问“ selector 尝试修改“:”选择器的CSS属性时,您可能会遇到困难。 This is because pseudo-elements are not part of the DOM (Document Object Model) and are th...
    编程 发布于2025-05-02
  • 如何有效地选择熊猫数据框中的列?
    如何有效地选择熊猫数据框中的列?
    在处理数据操作任务时,在Pandas DataFrames 中选择列时,选择特定列的必要条件是必要的。在Pandas中,选择列的各种选项。选项1:使用列名 如果已知列索引,请使用ILOC函数选择它们。请注意,python索引基于零。 df1 = df.iloc [:,0:2]#使用索引0和1 c...
    编程 发布于2025-05-02
  • 如何避免Go语言切片时的内存泄漏?
    如何避免Go语言切片时的内存泄漏?
    ,a [j:] ...虽然通常有效,但如果使用指针,可能会导致内存泄漏。这是因为原始的备份阵列保持完整,这意味着新切片外部指针引用的任何对象仍然可能占据内存。 copy(a [i:] 对于k,n:= len(a)-j i,len(a); k
    编程 发布于2025-05-02

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3