」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 提升 Web 效能:前端開發人員指南

提升 Web 效能:前端開發人員指南

發佈於2024-11-08
瀏覽:867

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]刪除
最新教學 更多>
  • ## 為什麼模板基底類別的多重繼承會導致成員函數解析不明確?
    ## 為什麼模板基底類別的多重繼承會導致成員函數解析不明確?
    消除多重繼承的歧義使用模板基類處理多重繼承時,會出現關於不明確成員函數解析的潛在問題。考慮以下場景:template <typename ... Types> class Base { public: template <typename T> typename st...
    程式設計 發佈於2024-11-08
  • 如何為字典條目等類別新增動態屬性?
    如何為字典條目等類別新增動態屬性?
    在類別中加入動態屬性在使用類比類別模擬資料庫結果集的過程中,出現了一個挑戰:如何指派動態屬性實例的屬性類似字典的屬性。這涉及創建行為類似於具有特定值的屬性的屬性。 最初,一種有前景的方法涉及使用以下方式分配屬性:setattr(self, k, property(lambda x: vs[i], s...
    程式設計 發佈於2024-11-08
  • 使用failsafe-go 庫實現微服務之間通訊的彈性
    使用failsafe-go 庫實現微服務之間通訊的彈性
    Let's start at the beginning. What is resilience? I like the definition in this post: The intrinsic ability of a system to adjust its functioning prio...
    程式設計 發佈於2024-11-08
  • 系統整合測試:確保無縫軟體集成
    系統整合測試:確保無縫軟體集成
    在軟體開發的動態環境中,確保系統的各個組件或模組無縫地協同工作對於提供可靠且高效能的軟體解決方案至關重要。這篇部落格文章深入探討了系統整合測試 (SIT),這是軟體測試生命週期中的關鍵階段,用於驗證整合組件之間的交互,確保系統的整體功能和可靠性。 什麼是系統整合測試? 系統整合測試 (SIT) ...
    程式設計 發佈於2024-11-08
  • 事件冒泡和捕獲 - 像 5 歲一樣學習
    事件冒泡和捕獲 - 像 5 歲一樣學習
    來吧,「像五歲一樣學習」只是一個短語——我不是在這裡講一個玩具故事!但我保證,如果你從頭到尾仔細閱讀,一切都會有意義。 事件冒泡和捕獲是在 JavaScript 中觸發事件時事件如何透過 DOM(文檔物件模型)傳播(或傳播)的兩個階段。現在,這個說法需要澄清事件傳播的概念。 事件...
    程式設計 發佈於2024-11-08
  • 如何將變數從一個頁面傳送到另一個 flutter/dart
    如何將變數從一個頁面傳送到另一個 flutter/dart
    您好,我目前正在嘗試在連接步驟期間將用戶的變數條目傳遞到我的應用程式的主頁,但我遇到錯誤,我不知道是什麼原因導致的,在我的頁面main (gamepage) 中,在男孩的孩子中,我想顯示控制器的地址,但是flutter 告訴我這個變數沒有定義! ! ! 你是我唯一的希望 import 'dart:...
    程式設計 發佈於2024-11-08
  • 如何在 HTML 中使用 PHP?
    如何在 HTML 中使用 PHP?
    要在HTML 中使用PHP,必須用PHP 開始標記. 在本文中,我們將透過範例學習如何在HTML 中使用PHP。 PHP(超文本預處理器) 是用於 Web 開發的流行伺服器端腳本語言。它允許您將動態內容嵌入到您的HTML。 在 HTML 中使用 PHP 的方法 要在 HTML 中有效使用 PHP...
    程式設計 發佈於2024-11-08
  • 使用 LangSmith Hub 改變您的工作流程:JavaScript 工程師的遊戲規則改變者
    使用 LangSmith Hub 改變您的工作流程:JavaScript 工程師的遊戲規則改變者
    分散的人工智能提示是否会减慢您的开发进程?了解 LangChain Hub 如何彻底改变您的工作流程,为 JavaScript 工程师提供无缝且高效的即时管理。 介绍 想象一下管理一个项目,其中关键信息分散在文件中。令人沮丧,对吧?这就是处理 AI 提示的开发人员面临的现实。 Lan...
    程式設計 發佈於2024-11-08
  • 如何在 PHP 中將數值轉換為字串表示形式?
    如何在 PHP 中將數值轉換為字串表示形式?
    將數值轉換為PHP 中的字串表示形式將數值轉換為PHP 中對應的字串版本是一項常見任務,尤其是在工作時與文字處理或面向使用者的應用程式。當處理特定範圍內的值時,這種轉換變得尤其重要,例如將數字從 1 到 99 轉換為其等效文字。 要執行此轉換,我們可以利用 PEAR 套件 Numbers_Words...
    程式設計 發佈於2024-11-08
  • 如何在 Bigquery 參數化查詢中傳遞結構數組
    如何在 Bigquery 參數化查詢中傳遞結構數組
    在Google的Bigquery中,SQL查詢可以參數化。如果您不熟悉這個概念,它基本上意味著您可以將 SQL 查詢編寫為參數化模板,如下所示: INSERT INTO mydataset.mytable(columnA, columnB) VALUES (@valueA, @valueB)...
    程式設計 發佈於2024-11-08
  • 如何使用 Python“for”循環實現 C/C++ 風格循環?
    如何使用 Python“for”循環實現 C/C++ 風格循環?
    在Python 中實現C/C 風格循環:“for”循環在Python 中,循環提供了一種用於迭代序列的通用機制。雖然 Python 的「for」循環語法與其 C/C 對應部分不同,但實現類似的功能仍然是可行的。 考慮C/C 中的以下循環:for(int k = 1; k <= c; k = ...
    程式設計 發佈於2024-11-08
  • Laravel 入門:查詢產生器初學者指南
    Laravel 入門:查詢產生器初學者指南
    Laravel 的 查询生成器 提供了一个强大、流畅的界面,用于在 PHP 中构建 SQL 查询。它允许您以富有表现力的、类似 SQL 的语法与数据库交互,同时抽象出大部分复杂性。 我们将演练 Laravel 应用程序中的典型用例,使用查询生成器执行各种任务,例如选择、插入、更新和删除数据。 ...
    程式設計 發佈於2024-11-08
  • 如何截斷長分頁清單以增強使用者體驗?
    如何截斷長分頁清單以增強使用者體驗?
    截斷長頁面清單以實現高效分頁分頁是任何顯示大量資料的網站或應用程式的重要組成部分,因為它允許用戶以可管理的區塊的方式瀏覽它。但是,如果以簡單的方式實現,分頁可能會導致頁面清單過長,特別是當應用於具有大量頁面的資料集時。 為了緩解此問題,有必要截斷這些頁面清單為使用者提供更簡潔的導航選項。在本文中,我...
    程式設計 發佈於2024-11-08
  • 如何在 JavaScript 中展平數組
    如何在 JavaScript 中展平數組
    使用遞歸和 while 循環是更簡單的方法之一 export default function flatten(value) { const arr = [] const flat = (a) => { let counter = 0 console.log(a) ...
    程式設計 發佈於2024-11-08
  • 為什麼我無法在 Powershell 中執行複雜的 ImageMagick 命令,但它們可以在 CMD 中運行?
    為什麼我無法在 Powershell 中執行複雜的 ImageMagick 命令,但它們可以在 CMD 中運行?
    ImageMagick 指令無法在Powershell 中運行,但在cmd 視窗中執行沒有問題在嘗試使用ImageMagick 指令時,使用者在Powershell 視窗中執行它們時遇到了挑戰。這些命令在 cmd 視窗中無縫運行。嘗試在括號前添加反斜線來解決該問題也沒有成功。調查顯示,magick指...
    程式設計 發佈於2024-11-08

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3