Lighthouse與首屏優化

之前提到首屏優化,想到的就是Vue項目首頁打開很慢需要優化。一般都是肉眼看看,對當前的加載速度并沒有一個準確的衡量標準,也沒有很清晰的解決思路。

前兩天我想給自己的網站申請谷歌廣告,聽說審核對網站的性能要求很高。于是網上搜索后發現了一個網站優化利器--Lighthouse

一:Lighthouse是什么?

Lighthouse 是一個由?Google 開發的開源自動化工具,用于改進網頁質量。它提供全面的網頁性能、可訪問性、最佳實踐和 SEO 分析,幫助開發者構建更好的網站體驗。

Lighthouse這個工具前端開發者又熟悉又陌生,說她熟悉因為她就在Chrome的F12面板中,跟Network在一塊。說她陌生是因為,可能大多程序員沒注意到她,也不知道她是干什么用的。

Lighthouse使用起來很簡單,F12里找到她,輸入需要檢測的網站即可。我第一次使用時的得分如下

二:Lighthouse的相關指標

1、主要指標

如上截圖中主要4個指標,相關概念如下

性能 (Performance)頁面加載速度和用戶體驗包含FCP, LCP, TTI, TBT, CLS
可訪問性 (Accessibility)殘障用戶友好度屏幕閱讀器支持,色彩對比度,ARIA 屬性
最佳實踐 (Best Practices)現代Web開發標準HTTPS, 安全的API使用,圖片優化
SEO (Search Engine Optimization)搜索引擎優化元標簽,結構化數據,移動友好性

2、性能(Performance)下的指標

  • FCP (First Contentful Paint)??首個內容繪制時間

?測量頁面首個元素呈現的時間,讓用戶知道網站開始載入了。

  • LCP (Largest Contentful Paint)?最大內容繪制時間

?測量頁面主要內容加載完成的時間,讓用戶知道網站載入完畢,可以交互了。

  • CLS (Cumulative Layout Shift)?累積布局偏移

?測量頁面內容意外移動的程度,比如一個按鈕在點擊時因其他元素加載突然下移了。

3、指標作用

通過這些指標得分,我們可以量化的知道自己網站的性能效果。有一個參考值,便于針對性的優化。

三:優化建議

Lighthouse的每個指標都有對應的優化建議,如下圖。如圖右上角可以切換各個指標

四:成功實踐

我根據Lighthouse的建議,針對性的做了相關的措施。最終成績如下,我網站效果為CodingLife,忙活了4天結果還算滿意~

先說下我服務器的配置,2核2G 3M帶寬。為了節省費用,配置堪稱寒酸!

1、分割打包 按需加載

首先要在路由配置中,使用按需加載與分包設置

// router.js文件中
routes: [{path: '/',name: 'BlogDetail',component: () => import(/* webpackChunkName: "blogDetail", webpackPrefetch: false */ '@/components/MainPage/BlogDetail');}
]

其次一定要配合webpack配置,否則很可能無法按需加載。即首頁渲染時,加載其他頁面的js包

// vue.config.js文件
module.exports = {chainWebpack: config => {// 禁用所有 prefetchconfig.plugins.delete('prefetch');}
};

2、壓縮資源包體積

將JS資源文件打包為.gz格式,可以高效減少資源包體積。shezhi前端webpack打包時,就做GZip壓縮

// vue.config.js文件
module.exports = {configureWebpack:config=>{// GZip壓縮const CompressionPlugin = require('compression-webpack-plugin');config.plugins.push(new CompressionPlugin({algorithm:'gzip',test:/\.(js|css|woff|woff2|svg)$/,  // 要壓縮的文件threshold:10240, // 壓縮超過10k的數據deleteOriginalAssets:false, // 不刪除壓縮前的文件,如果瀏覽器不支持Gzip,則會加載源文件minRatio:0.8 // 壓縮比大于0.8的文件將不會被壓縮}));}
};

Nginx服務器,配合設置

server {gunzip on;       # 如果客戶端不支持 gzip,自動解壓返回原始文件gzip off;        # 關閉動態壓縮(因為已經有預壓縮文件)
}

3、減小圖片體積

圖片使用webp格式,可以大幅減小圖片體積。使用webp主要工作在ngnix上,具體操作如下

安裝cwebp,處理圖片

# 下載最新版源碼(當前最新版本1.3.0)
wget https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-1.3.0.tar.gz# 解壓并進入目錄
tar -xvzf libwebp-1.3.0.tar.gz
cd libwebp-1.3.0# 配置編譯選項(確保啟用PNG和JPEG支持)
./configure --enable-libpng --enable-libjpeg# 編譯并安裝
make
sudo make install# 刷新庫緩存
sudo ldconfig# 驗證安裝
cwebp -version

配置nginx有限返回webp格式圖片

http {# 簡化的WebP檢測map $http_accept $webp_suffix {default   "";"~*webp"  ".webp";  # 添加.webp后綴}# HTTPS 服務器 - 主配置server {listen 443 ssl http2;server_name codinglife.online www.codinglife.online;location /uploads/ {alias /opt/CodingLife/uploads/;autoindex off;# 核心緩存策略(根據文件類型區分)location ~* \.(jpe?g|png|gif|webp|svg|avif)$ {		try_files $uri$webp_suffix $uri =404;add_header Vary Accept;  # 關鍵:標記內容協商}}}
}

4、減少圖片請求數量

我的博客首頁是個列表,列表的每條都包含一個縮略圖,剛開始設置每頁8條數據。8個圖片,對于3M的帶寬來說,壓力太大。

于是我將分頁請求中每頁條數精細化,根據設備分辨率動態設置。比如移動端每頁3條,筆記本電腦每頁4條,外接顯示器8條。

  calculatePageSize() {if (this.windowWidth < 1366) {this.perPageNum = 3 // 移動端和小屏設備} else if (this.windowWidth >= 1366 && this.windowWidth < 1600) {this.perPageNum = 4 // 14寸筆記本} else if (this.windowWidth >= 1600 && this.windowWidth < 1920) {this.perPageNum = 5 // 15.6寸筆記本} else {this.perPageNum = 8 // 大屏幕}}

5、減少無用Dom

因為Lighthouse還模擬移動設備測試首屏性能,并且模擬條件極為苛刻。具體如下

  • Desktop:默認使用?150ms TCP延遲的"有線"網絡?(類似穩定WiFi/光纖)。

  • Mobile:默認使用?300ms TCP延遲 + 1.6Mbps下載/0.75Mbps上傳的"慢速4G"網絡

我的網站使用媒體查詢,自適應移動端和pc端。因為移動端屏幕大小有限,我選擇隱藏了很多不必要的模塊。但原有的css設置隱藏是奢侈的,依舊消耗性能,我本次將無用的dom需要徹底刪掉。

<section v-if="isDeskTop"></section>data: function () {return {isDeskTop: window.innerWidth > 768 // 是否是桌面端}
},

6、剔除無用請求

以前適配移動端時大大咧咧,只想著實現效果就行。很多無用模塊都是css配置display:none,js接口正常請求,現在看來是真的浪費。本次我又精細化的過了一遍,移動端時刪除不必要的接口請求。

// 移動端時刪除不必要的接口請求
if(this.isDeskTop){      //渲染留言個數this.GetLeaveMessageNum();this.GetCommentNum();
}

7、提高傳輸效率

chrome最多同時發6個請求,如果需要同時發起7個請求,第7個就要等待前6個結束。可SPA同時發起7個請求可太常見了。

于是我將HTTP/1升級到HTTP/2,做到單 TCP 連接上并行傳輸多個請求/響應。原理如下,告別了network里同時并行一堆請求的歷史

原理

network效果?

nginx的配置超級簡單,只需要一行:

server {listen 443 ssl http2;
}

五:最終效果

哥們的網站CodingLife,最終效果不管移動端還是PC端都是秒開。摸索了4天,最終看到Lighthouse打分99時,我跟個傻子一樣哈哈大小,那是真的開心!

打開F12的network可以看到如下差別,不提速是不可能的啦

  • 請求的JS文件條數明顯少了(按需加載,只加載首屏js)
  • JS資源文件最大的也就700k(Gzip壓縮)
  • 圖片大都100k以內(webp格式圖片)
  • 請求的圖片條數明顯減少(動態設置列表條數)
  • 發起的接口請求明顯減少(刪除移動端無用請求)
  • 請求縮略圖只有一條(啟用http/2)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/84948.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/84948.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/84948.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Maven 之 打包項目時沒有使用本地倉庫依賴問題

背景 pom 中使用了第三方jar包&#xff0c;遠程倉庫設置的是阿里云&#xff0c;之前運行很好&#xff0c;今天不知道怎么的&#xff0c;打包總是報錯&#xff0c;阿里云倉庫無法找到依賴包(本來也沒有)&#xff0c;按理來說&#xff0c;編譯打包時會優先選擇本地倉庫的包才對&a…

Mysql基礎入門\期末速成

DDL 操作數據庫語句 創建&刪除數據庫語句 創建數據庫 create database 數據庫名稱; -- 直接創建 create database if not exists 數據庫名稱; -- 如果不存在&#xff0c;則創建 create database 數據庫名稱 default charset utf8mb4; -- 創建編譯類型utf8的數據類型 cre…

SCADA|KingSCADA4.0中歷史趨勢控件與之前版本的差異

哈嘍,你好啊,我是雷工! 最近用到KingSCADA4.0信創版本,也算嘗鮮使用。 在使用的過程中發現有些功能或多或少存在一些差異, 這里將遇到的一些不同總結一下,便于后期更好的使用。 01 歷史趨勢控件 在KingSCADA中有一個歷史趨勢曲線控件KSHTrend。 該控件既可以連接King…

ubuntu 拒絕ssh連接,連不上ssh,無法遠程登錄: Connection failed.

目錄 問題描述視窗 可視化桌面命令行 問題描述 [C:\~]$ Connecting to 192.166.8.85:22... Could not connect to 192.166.8.85 (port 22): Connection failed.Type help to learn how to use Xshell prompt. [C:\~]$ Connecting to 192.166.8.85:22... Could not connect to …

【大模型應用開發】向量數據庫向量檢索方法存在問題及優化

一、檢索結果重復 1. 問題分析 在構建向量數據庫時&#xff0c;對文檔分割會存在重復塊&#xff08;chunk_overlap&#xff1a;指兩個塊之間共享的字符數量&#xff0c;用于保持上下文的連貫性&#xff0c;避免分割丟失上下文信息&#xff09;&#xff0c;如下圖所示&#xf…

MySQL常用函數詳解之數值函數

MySQL常用函數詳解之數值函數 一、數值函數概述1.1 數值函數的作用1.2 數值函數分類 二、算術運算函數2.1 加法運算&#xff08;&#xff09;2.2 減法運算&#xff08;-&#xff09;2.3 乘法運算&#xff08;*&#xff09;2.4 除法運算&#xff08;/ 或 DIV&#xff09;2.5 取模…

13、Redis進階二之Redis數據安全性分析

? 、Redis性能壓測腳本介紹 Redis的所有數據是保存在內存當中的&#xff0c; 得益于內存?效的讀寫性能&#xff0c; Redis的性能是?常強悍的 。但 是&#xff0c;內存的缺點是斷電即丟失&#xff0c;所以 &#xff0c;在實際項?中&#xff0c; Redis—旦需要保存—些重要的…

【系統分析師】2011年真題:綜合知識-答案及詳解

文章目錄 【第1題】【第2~3題】【第4~5題】【第6題】【第7~8題】【第9題】【第10題】【第11題】【第12題】【第13題】【第14題】【第15題】【第16題】【第17題】【第18題】【第19~20題】【第21題】【第22題】【第23題】【第24~25題】【第26題】【第27題】【第28題】【第29題】【…

FastAPI-MCP構建自定義MCP工具實操指南

一、簡介 ? FastAPI-MCP是一個基于python FastAPI框架開發的開源項目&#xff0c;可以自動識別并暴露FastAPI接口為MCP工具 ? 擁有FastAPI框架的所有優點&#xff0c;如異步高并發、獨立遠程部署、OpenAPI文檔 ? 提供SSE、mcp-remote接入方式&#xff0c;支持設置授權訪問…

LLMs之Memory:《LLMs Do Not Have Human-Like Working Memory》翻譯與解讀

LLMs之Memory&#xff1a;《LLMs Do Not Have Human-Like Working Memory》翻譯與解讀 導讀&#xff1a;該論文通過三個精心設計的實驗&#xff0c;證明了當前的大型語言模型&#xff08;LLMs&#xff09;缺乏類似人類的工作記憶。實驗結果表明&#xff0c;LLMs無法在沒有明確外…

Node.js驗證碼:從生成到驗證的趣味之旅

文章目錄 Node.js驗證碼&#xff1a;從生成到驗證的趣味之旅&#x1f4dc; 引言&#xff1a;為什么需要驗證碼&#xff1f;1. 驗證碼的基本原理 &#x1f9e0;驗證碼工作流程示意圖 2. 技術棧準備 &#x1f6e0;?3. 驗證碼生成詳解 &#x1f3a8;3.1 生成SVG驗證碼3.2 轉換為P…

芯科科技攜最新Matter演示和參考應用精彩亮相Matter開放日和開發者大會

全面展示賦能Matter設備實現跨協議和跨海內外生態的技術能力 作為Matter標準創始廠商之一和其解決方案的領先供應商&#xff0c;Silicon Labs&#xff08;亦稱“芯科科技”&#xff09;于6月12至13日參加由連接標準聯盟中國成員組&#xff08;CMGC&#xff09;主辦的Matter年度…

AndroidStudio下載的SDK沒有tool目錄,或者想要使用uiautomatorviewer工具

1.如果沒有tool目錄可以使用下面的地址進行下載 https://dl.google.com/android/repository/tools_r25.2.5-windows.zip 2.并且把下載的文件解壓到放在AndroidStudio的目錄中 3.如果使用uiautomatorviewer.bat出現下面的錯誤 Unable to connect to adb.Check if adb is instal…

FastJSON等工具序列化特殊字符時會加轉義字符\

在Java中JSON數據格式用String接收時&#xff0c;此時在FastJSON層面看來該JSON只是普通字符串&#xff0c;所以對原字符串序列化會得到轉義字符\ 得到轉義后字符串&#xff0c;再反序列化轉義后字符串會得到原字符串 String json"{\"name\": \"張三\&quo…

數據結構 學習 隊列 2025年6月14日 11點22分

循環隊列 循環隊列是一種線性數據結構&#xff0c;它遵循FIFO&#xff08;先進先出&#xff09;原則&#xff0c;但與普通隊列不同的是&#xff0c;循環隊列的最后一個元素連接回第一個元素&#xff0c;形成一個環形結構。這種設計有效解決了普通隊列的"假溢出"問題&…

打造絲滑滾動體驗:Scroll-driven Animations 正式上線!

&#x1f300; 打造絲滑滾動體驗&#xff1a;Scroll-driven Animations 正式上線&#xff01; &#x1f6a8; 告別 JS 手動監聽滾動條&#xff0c;CSS 新能力讓你用兩行代碼實現高級滾動動效。 &#x1f50d; 什么是 Scroll-driven Animations&#xff1f; Scroll-driven anim…

知識體系_研究模型_價格敏感度測試模型(PSM)

1 概述 價格敏感度測試模型(Price Sensitivity Measurement,PSM) ,通過調研潛在用戶對于不同價格的滿意或接受程度,從而制定出合適的產品價格。 價格敏感度PSM模型的分析一般分為以下幾個步驟: (1)確定多個價格 (2)通過一定的方式(通常是問卷)收集目標客戶對不同價…

C++11函數封裝器 std::function

? 1. 什么是 std::function std::function 是 C11 引入的標準庫工具&#xff0c;是一個通用的函數封裝器&#xff0c;可以包裝以下任意可調用對象&#xff1a; 普通函數Lambda 表達式函數指針成員函數指針函數對象&#xff08;也叫仿函數&#xff0c;定義了 operator() 的類…

centos系統docker配置`milvus-standalone`教程

本人使用的是京東云服務器docker配置milvus 參考教程&#xff1a;https://blog.csdn.net/withme977/article/details/137270087 需要注意&#xff1a;虛擬機安裝pymilvus和docker安裝milvus版本需要對應&#xff0c;否則會出現connection失敗問題 查看虛擬機pymilvus版本&…