[總結]前端性能指標分析、性能監控與分析、Lighthouse性能評分分析

前端性能分析大全
前端性能優化
LightHouse性能評分
性能指標監控分析
瀏覽器加載資源的全過程性能指標分析

性能指標

在實現性能監控前,先了解Web Vitals涉及的常見的性能指標
在這里插入圖片描述

Web Vitals 是由 Google 推出的網頁用戶體驗衡量指標體系,旨在幫助開發者量化和優化網頁在實際用戶終端上的性能體驗。Web Vitals 強調“以用戶為中心”的度量,而不是純技術層面的加載時間。

要按 先后順序(時間維度) 梳理 Web Vitals,可以從網頁加載的生命周期出發,把每個指標放入其發生時機對應的階段中。這樣更利于理解用戶體驗的演變和指標采集的邏輯。


🧭 一、加載過程的五大階段

[1] 網絡響應階段
[2] 首次渲染階段
[3] 內容加載階段
[4] 用戶交互階段
[5] 頁面穩定階段

📊 二、Web Vitals 指標按時間順序梳理

階段指標名含義時機
1?? 網絡響應TTFB (Time to First Byte)首字節到達瀏覽器請求后,接收到第一個響應字節
2?? 首次渲染FCP (First Contentful Paint)首次繪制文字/圖像頁面開始有內容渲染(非白屏)
3?? 主內容加載LCP (Largest Contentful Paint)最大可視內容渲染完成用戶感知“頁面加載完”
4?? 用戶首次交互FID (First Input Delay)用戶首次點擊的響應延遲用戶第一次交互,直到瀏覽器處理事件的延遲
5?? 頁面穩定CLS (Cumulative Layout Shift)布局跳動頁面是否因為圖片/廣告等加載而抖動

🧬 三、時間線圖(邏輯順序)

00.000 s 00.000 s 00.000 s 00.000 s 00.000 s 00.000 s 00.000 s 00.000 s 00.000 s 00.000 s 00.000 s 00.000 s 00.000 s 00.000 s 00.000 s 00.000 s 00.000 s DNS & TCP/SSL TTFB(首字節返回) FCP(首內容繪制) CLS(累積布局偏移) Paint & 字體加載 LCP(最大內容繪制) 用戶輸入(點擊等) FID(首次輸入延遲) 網絡層 頁面初渲 主體內容加載 用戶交互 頁面穩定性

時間單位為毫秒。TTFB 最早,CLS 貫穿整個加載過程。


🔁 四、簡潔記憶順序口訣

💡「先 TTFB,見 FCP;看大圖,用 LCP;首操作,測 FID;別亂跳,查 CLS


🛠 五、指標采集時機小貼士

指標采集方式推薦 API
TTFBperformance.timing.responseStart - navigationStartNavigation Timing
FCPPerformanceObserver 監聽 paintPerformancePaintTiming
LCPPerformanceObserver 監聽 largest-contentful-paintLCP Entry
FID真實用戶交互產生的事件延遲Event Timing API
CLSPerformanceObserver 監聽 layout-shiftLayoutShift Entry

🧭 六、總結為時序流圖(Mermaid)

User Browser Server 輸入 URL 發起請求 返回首字節 (TTFB) 渲染第一屏內容 (FCP) 渲染最大元素 (LCP) 第一次點擊或輸入 記錄 FID(輸入延遲) 頁面渲染抖動時記錄 CLS User Browser Server
TTFB ≤ 800ms
FCP ≤ 1.8s
LCP ≤ 2.5s
FID ≤ 100ms
CLS ≤ 0.1
TBT ≤ 200ms

在這里插入圖片描述

在這里插入圖片描述

指標監控

PerformanceObserver

PerformanceObserver 是 Performance API 中用于監聽性能條目變化的核心工具。它可以在網頁運行過程中,異步捕獲新生成的性能條目,而不是一開始就調用 performance.getEntries() 拿“舊數據”。


一、PerformanceObserver 的作用

它允許開發者:

  • 監聽網頁運行中出現的性能條目(如資源加載、繪制、打點、長任務等)
  • 做出動態響應(如打日志發送埋點數據
  • 支持指定監聽的 entryTypes,如 ["resource"], ["mark", "measure"]

二、使用方式

1. 創建實例
const observer = new PerformanceObserver((list, observer) => {const entries = list.getEntries();for (const entry of entries) {console.log(entry.name, entry.entryType, entry.startTime, entry.duration);}
});
2. 啟動監聽
observer.observe({entryTypes: ['mark', 'measure', 'resource']
});

entryTypes 是監聽的條目類型數組。


三、常用方法

方法說明
observe(options)開始監聽性能條目
disconnect()停止監聽
takeRecords()獲取當前緩沖區的所有性能條目并清空緩沖區

四、選項說明

observe(options)
observer.observe({entryTypes: ['resource', 'paint']
});

或使用過時寫法(不推薦):

observer.observe({type: 'resource',buffered: true
});
參數說明:
  • entryTypes: 性能條目的類型(推薦)
  • type: 單一類型(不推薦)
  • buffered: 是否包括已存在的歷史條目(true 會包含之前的記錄)

五、支持的 entryType(性能條目類型)

類型含義
resource外部資源加載耗時
mark用戶自定義打點
measure用戶定義的測量點
paint首次繪制(first-paint, first-contentful-paint)
navigation頁面導航
longtask長任務(如 JS 卡頓)
element關鍵可視元素曝光(需要配置)
largest-contentful-paint最大內容繪制時間
layout-shift布局偏移(CLS)

六、典型使用場景

  • 監聽資源加載情況(如 img、script)
  • 監聽 FCP、LCP、CLS、Long Tasks,用于 Web Vitals 性能分析
  • 異步獲取自定義打點結果
  • 在 SPA 頁面做性能埋點

七、注意事項

  • PerformanceObserver異步的:不會立即收到記錄。
  • 使用 buffered: true 可獲取已經發生的記錄(舊數據),用于首次加載打點。
  • 頁面進入后臺或關閉時,需要調用 takeRecords() 收集剩余數據。
  • 一些條目需要在支持的瀏覽器中開啟對應實驗性特性(如 longtask)。

八、Mermaid 類圖詳解 PerformanceObserver

在這里插入圖片描述

九、具體實現

在這里插入圖片描述

import { lazyReportBatch } from '../report';
const originalFetch = window.fetch;
function overwriteFetch() {window.fetch = function  newFetch(url, config) {const startTime = Date.now();const reportData = {type: 'performance',subType: 'fetch',url,startTime,method: config.method,}return originalFetch(url, config).then((res) => {const endTime = Date.now();reportData.endTime = endTime;reportData.duration = endTime - startTime;const data = res.clone();reportData.status = data.status;reportData.success = data.ok;// todo 上報數據lazyReportBatch(reportData);return res;}).catch((err) => {const endTime = Date.now();reportData.endTime = endTime;reportData.duration = endTime - startTime;reportData.status = 0;reportData.success = false;// todo 上報數據lazyReportBatch(reportData);});}
}
export default function fetch() {overwriteFetch();
}
//監控FP
import { lazyReportBatch } from '../report';
export default function observerPaint() {const entryHandler = (list) => {for (const entry of list.getEntries()) {if (entry.name === 'first-paint') {observer.disconnect();const json = entry.toJSON();console.log(json);const reportData = {...json,type: 'performance',subType: entry.name,pageUrl: window.location.href,}// 發送數據 todo;lazyReportBatch(reportData);}}}// 統計和計算fp的時間const observer = new PerformanceObserver(entryHandler);// buffered: true 確保觀察到所有paint事件observer.observe({type: 'paint', buffered: true});}
//監控FCP
import { lazyReportBatch } from '../report';
export default function observerFCP() {const entryHandler = (list) => {for (const entry of list.getEntries()) {if (entry.name === 'first-contentful-paint') {observer.disconnect();const json = entry.toJSON();console.log(json);const reportData = {...json,type: 'performance',subType: entry.name,pageUrl: window.location.href,}// 發送數據 todo;lazyReportBatch(reportData);}}}// 統計和計算fcp的時間const observer = new PerformanceObserver(entryHandler);// buffered: true 確保觀察到所有paint事件observer.observe({type: 'paint', buffered: true});
}
//監控LCP
import { lazyReportBatch } from '../report';
export default function observerLCP() {if (typeof PerformanceObserver === 'undefined' ||!PerformanceObserver.supportedEntryTypes.includes('largest-contentful-paint')) {console.warn('LCP not supported in this browser.');return;}const entryHandler = (list,observer) => {if (observer) {observer.disconnect();} for (const entry of list.getEntries()) {const json = entry.toJSON();//console.log(json);const reportData = {...json,type: 'performance',subType: entry.name,pageUrl: window.location.href,}console.log(reportData);// 發送數據 todo;//lazyReportBatch(reportData);}}// 統計和計算lcp的時間const observer = new PerformanceObserver(entryHandler);// buffered: true 確保觀察到所有paint事件observer.observe({type: 'largest-contentful-paint', buffered: true});
}
import { lazyReportBatch } from '../report';
export default function observerLoad () {window.addEventListener('pageShow', function (event) {requestAnimationFrame(() =>{['load'].forEach((type) => {const reportData = {type: 'performance',subType: type,pageUrl: window.location.href,startTime: performance.now()- event.timeStamp}// 發送數據lazyReportBatch(reportData);});}, true);});
}import { lazyReportBatch } from '../report';
export const originalProto = XMLHttpRequest.prototype;
export const originalSend = originalProto.send;
export const originalOpen = originalProto.open;function overwriteOpenAndSend() {originalProto.open = function newOpen(...args) {this.url = args[1];this.method = args[0];originalOpen.apply(this, args);}originalProto.send = function newSend(...args) {this.startTime = Date.now();const onLoaded = () => {this.endTime = Date.now();this.duration = this.endTime - this.startTime;const { url, method , startTime, endTime, duration, status} = this;const reportData = {status,duration,startTime,endTime,url,method: method.toUpperCase(),type: 'performance',success: status >= 200 && status < 300,subType: 'xhr'}// todo 發送數據lazyReportBatch(reportData);this.removeEventListener('loadend', onLoaded, true);}this.addEventListener('loadend', onLoaded, true);originalSend.apply(this, args);}}
export default function xhr() {overwriteOpenAndSend();
}

十、其他實現:Web Vitals

其他實現:Web Vitals 是 Google 提出的一組衡量網站用戶體驗關鍵質量的指標,特別關注 加載性能、交互響應、視覺穩定性。
在這里插入圖片描述

監控上報(?)

數據上報
三種上報方式:

  1. imgRequest:以圖片打點的方式
  2. beaconRequest:通過 navigator.sendBeacon 發送
  3. xhrRequest:使用 XMLHttpRequest(兼容方式)

在這里插入圖片描述

如果使用 lazyReportBatch,則會緩存數據并按批量上傳。多數請求都通過 requestIdleCallback 實現性能友好的空閑發送
在這里插入圖片描述

import config from './config';
import {generateUniqueId} from './utils';
import {addCache, getCache, clearCache} from './cache';
export const originalProto = XMLHttpRequest.prototype;
export const originalOpen = XMLHttpRequest.prototype.open;
export const originalSend = XMLHttpRequest.prototype.send;
export function isSupportSendBeacon() {return 'sendBeacon' in navigator;
}
export function report(data) {if (!config.url) {console.error('請設置上傳 url 地址');}const reportData = JSON.stringify({id: generateUniqueId(),data,});// 上報數據,使用圖片的方式if (config.isImageUpload) {imgRequest(reportData);} else {// 優先使用 sendBeaconif (window.navigator.sendBeacon) {return beaconRequest(reportData);} else {xhrRequest(reportData);}}
}
// 批量上報數據
export function lazyReportBatch(data) {addCache(data);const dataCache = getCache();console.log('dataCache', dataCache);if (dataCache.length && dataCache.length > config.batchSize) {report(dataCache);clearCache();}//
}
// 圖片發送數據
export function imgRequest(data) {const img = new Image();// http://127.0.0.1:8080/api?data=encodeURIComponent(data)img.src = `${config.url}?data=${encodeURIComponent(JSON.stringify(data))}`;
}
// 普通ajax發送請求數據
export function xhrRequest(data) {if (window.requestIdleCallback) {window.requestIdleCallback(() => {const xhr = new XMLHttpRequest();originalOpen.call(xhr, 'post', config.url);originalSend.call(xhr, JSON.stringify(data));},{ timeout: 3000 });} else {setTimeout(() => {const xhr = new XMLHttpRequest();originalOpen.call(xhr, 'post', url);originalSend.call(xhr, JSON.stringify(data));});}
}// const sendBeacon = isSupportSendBeacon() ? navigator.sendBeacon : xhrRequest
export function beaconRequest(data) {if (window.requestIdleCallback) {window.requestIdleCallback(() => {window.navigator.sendBeacon(config.url, data);},{ timeout: 3000 });} else {setTimeout(() => {window.navigator.sendBeacon(config.url, data);});}
}

Lighthouse

Lighthouse 是 Google 提供的一個開源自動化網站審計工具,主要用于評估 Web 頁面在性能、可訪問性、最佳實踐、SEO 和 PWA(漸進式 Web 應用)等方面的表現。它可以直接在 Chrome 瀏覽器的 DevTools(開發者工具)中使用,也可以通過 Node.js 命令行運行,甚至集成到 CI/CD 流程中。

下面是對 Lighthouse 工具的詳解:


🔧 一、Lighthouse 使用方式

1. Chrome DevTools 中使用

  1. 打開 Chrome 瀏覽器
  2. 按 F12 或右鍵 → 檢查,打開開發者工具
  3. 切換到 “Lighthouse” 標簽頁
  4. 選擇你要評估的維度(Performance、Accessibility、Best Practices、SEO、PWA)
  5. 選擇設備類型(Mobile 或 Desktop)
  6. 點擊 “Analyze page load” 開始分析
    在這里插入圖片描述

2. 命令行工具

安裝 Node.js 后執行:

npm install -g lighthouse
lighthouse https://example.com --view

📊 二、Lighthouse 的評估維度詳解

1. 📈 Performance(性能)

評估頁面加載速度和交互體驗。核心指標包括:

  • First Contentful Paint (FCP):首屏內容出現時間
  • Largest Contentful Paint (LCP):最大內容元素加載時間
  • Speed Index:頁面可見內容加載速度
  • Time to Interactive (TTI):頁面完全可交互的時間
  • Total Blocking Time (TBT):頁面阻塞時間
  • Cumulative Layout Shift (CLS):視覺穩定性變化程度

👉 建議:壓縮資源、懶加載圖片、使用緩存、減少 JS 體積等


2. ? Accessibility(可訪問性)

檢測網站對殘障人士的友好程度:

  • 圖像是否有合適的 alt 標簽
  • 表單元素是否有標簽
  • 顏色對比度是否足夠
  • 使用 ARIA 屬性

👉 建議:為每個交互元素提供語義標簽、顏色對比度符合標準


3. 📐 Best Practices(最佳實踐)

檢測網站是否符合現代 Web 開發規范:

  • 使用 HTTPS
  • 避免使用過時的 API
  • 圖片格式是否優化
  • 是否防止 XSS

👉 建議:盡量使用現代 Web API、安全連接和資源優化策略


4. 🔍 SEO(搜索引擎優化)

評估頁面對搜索引擎的友好程度:

  • 頁面是否有 titlemeta description
  • 使用語義化 HTML 標簽
  • 頁面是否可爬取
  • viewport 是否設置

👉 建議:符合基礎 SEO 規范,并確保結構良好


5. 📦 Progressive Web App(PWA)

檢測是否符合 PWA 應用標準(如可離線使用、安裝到桌面):

  • 是否注冊了 Service Worker
  • 是否提供 Web App Manifest
  • 是否支持離線緩存

👉 建議:適合構建高可靠性、接近原生體驗的 Web 應用場景


📁 三、Lighthouse 報告詳解

生成報告后包含如下信息:

  • 分數評分:每個維度都是 0-100 分
  • 診斷信息:詳細列出存在的問題
  • 建議改進:如何提升每項得分
  • 詳細資源信息:如阻塞時間的腳本、加載順序等

🔄 四、常見優化建議

問題建議優化方式
FCP 慢使用 CDN、預加載字體、圖片壓縮
LCP 慢懶加載、預渲染關鍵內容
TTI 高減少 JS 文件大小、優化主線程執行時間
CLS 高給圖片/iframe 設置固定尺寸,避免動態插入內容

🧪 五、集成到 CI/CD 中

可使用 lighthouse-ci 進行自動化測試:

npm install -g @lhci/cli
lhci autorun

可將分數設置為門檻,發布前必須達到指定分值。


🧠 總結

模塊目的分數建議
Performance用戶體驗核心≥90
Accessibility對所有用戶友好≥90
Best Practices遵循標準≥90
SEO搜索可見性≥90
PWA應用體驗≥70(視業務而定)

六、案例: 個人網站

在這里插入圖片描述

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

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

相關文章

Windows商店中的免費掃雷游戲應用

《掃雷》是一款經典的單人益智小游戲&#xff0c;1992年微軟發布的Windows 3.1中加入該游戲&#xff0c;從此風靡全世界。游戲目標是通過邏輯推理&#xff0c;在最短的時間內根據點擊格子出現的數字找出所有非雷格子&#xff0c;同時避免踩雷。 此Windows應用實現了經典掃雷的…

ActiveMQ 可觀測性最佳實踐

ActiveMQ 介紹 ActiveMQ 是一款高性能、開源的消息中間件&#xff0c;支持多種消息協議&#xff08;如 JMS、AMQP、MQTT 等&#xff09;&#xff0c;能夠實現應用程序之間的異步通信和消息傳遞。它提供點對點&#xff08;Queue&#xff09;和發布/訂閱&#xff08;Topic&#…

【Linux命令】scp遠程拷貝

文章目錄 1. 基本語法與常用選項2. 使用場景和使用示例本地文件->遠程主機遠程主機文件->本地遠程主機->另一臺遠程主機 3. 使用注意事項 scp&#xff08;Secure Copy Protocol&#xff09;是linux中基于ssh的安全文件傳輸工具&#xff0c;用于在本地和遠程主機之前安…

如何優化 Harmony-Cordova 應用的性能?

以下是針對 ?Harmony-Cordova 應用性能優化?的完整方案&#xff0c;結合鴻蒙原生特性和Cordova框架優化策略&#xff1a; ??一、渲染性能優化? ?減少布局嵌套層級? 使用扁平化布局&#xff08;如 Grid、GridRow&#xff09;替代多層 Column/Row 嵌套&#xff0c;避免冗…

c++學習之---模版

目錄 一、函數模板&#xff1a; 1、基本定義格式&#xff1a; 2、模版函數的優先匹配原則&#xff1a; 二、類模板&#xff1a; 1、基本定義格式&#xff1a; 2、類模版的優先匹配原則&#xff08;有坑哦&#xff09;&#xff1a; 3、缺省值的設置&#xff1a; 4、ty…

SpringAI(GA):RAG下的ETL快速上手

原文鏈接&#xff1a;SpringAI(GA)&#xff1a;RAG下的ETL快速上手 教程說明 說明&#xff1a;本教程將采用2025年5月20日正式的GA版&#xff0c;給出如下內容 核心功能模塊的快速上手教程核心功能模塊的源碼級解讀Spring ai alibaba增強的快速上手教程 源碼級解讀 版本&a…

用dayjs解析時間戳,我被提了bug

引言 前幾天開發中突然接到測試提的一個 Bug&#xff0c;說我的時間組件顯示異常。 我很詫異&#xff0c;這里初始化數據是后端返回的&#xff0c;我什么也沒改&#xff0c;這bug提給我干啥。我去問后端&#xff1a;“這數據是不是有問題&#xff1f;”。后端答&#xff1a;“…

DataAgent產品經理(數據智能方向)

DataAgent產品經理&#xff08;數據智能方向&#xff09; 一、核心崗位職責 AI智能體解決方案設計 面向工業/政務場景構建「數據-模型-交互」閉環&#xff0c;需整合多源異構數據&#xff08;如傳感器數據、業務系統日志&#xff09;與AI能力&#xff08;如大模型微調、知識圖…

Ubuntu取消開機用戶自動登錄

注&#xff1a;配置前請先設置登錄密碼&#xff0c;不同顯示管理器配置方法不同&#xff0c;可用命令查看&#xff1a;cat /etc/X11/default-display-manager 一、LightDM 顯示管理器&#xff0c;關閉 Ubuntu 系統用戶自動登錄 查找自動登錄配置文件&#xff0c;可以看到類似 a…

使用lighttpd和開發板進行交互

文章目錄 &#x1f9e0; 一、Lighttpd 與開發板的交互原理1. 什么是 Lighttpd&#xff1f;2. 與開發板交互的方式&#xff1f; &#x1f9fe; 二、lighttpd.conf 配置文件講解?? 注意事項&#xff1a; &#x1f4c1; 三、目錄結構說明&#x1f4a1; 四、使用 C 編寫 CGI 腳本…

Apache IoTDB V2.0.3 發布|新增元數據導入導出腳本適配表模型功能

Release Announcement Version 2.0.3 Apache IoTDB V2.0.3 已經發布&#xff01; V2.0.3 作為樹表雙模型正式版本&#xff0c;主要新增元數據導入導出腳本適配表模型、Spark 生態集成&#xff08;表模型&#xff09;、AINode 返回結果新增時間戳&#xff0c;表模型新增部分聚…

車輛檢測算法在爆炸事故應急響應中的優化路徑

視覺分析賦能車輛管控&#xff1a;以山東應急場景為例 背景&#xff1a;應急場景下的車輛管控痛點 近期山東多起爆炸事故暴露了應急響應中的車輛管理短板&#xff1a;消防車、救護車因違停車輛堵塞通道&#xff0c;違規車輛闖入事故核心區&#xff0c;傳統監控系統依賴人工識別…

∑ 1/n 調和級數 是 發散的

為什么 ∑ 1 u \sum \frac{1}{u} ∑u1?&#xff08;即 ∑ 1 n \sum \frac{1}{n} ∑n1?&#xff0c;通常稱為調和級數&#xff09;是發散的&#xff1f; ? 一、首先明確你問的是這個級數&#xff1a; ∑ n 1 ∞ 1 n \sum_{n1}^{\infty} \frac{1}{n} n1∑∞?n1? 這個級數…

Android第十二次面試-多線程和字符串算法總結

多線程的創建與常見使用方法 ?一、多線程創建方式? ?1. 繼承Thread類? class MyThread extends Thread {Overridepublic void run() {// 線程執行邏輯System.out.println(Thread.currentThread().getName() " is running");} }// 使用 MyThread thread new …

大模型調用數據庫表實踐:基于自然語言的SQL生成與數據查詢系統

# 大模型調用數據庫表實踐&#xff1a;基于自然語言的SQL生成與數據查詢系統 ## 一、背景與目標 在企業數據管理場景中&#xff0c;非技術人員&#xff08;如業務人員、管理人員&#xff09;常常需要通過數據庫查詢獲取關鍵信息&#xff0c;但直接編寫SQL語句存在技術門檻。傳…

28 C 語言作用域詳解:作用域特性(全局、局部、塊級)、應用場景、注意事項

1 作用域簡介 作用域定義了代碼中標識符&#xff08;如變量、常量、數組、函數等&#xff09;的可見性與可訪問范圍&#xff0c;即標識符在程序的哪些位置能夠被引用或訪問。在 C 語言中&#xff0c;作用域主要分為三類&#xff1a; 全局作用域局部作用域塊級作用域 需注意&am…

Tomcat運行比較卡頓進行參數調優

在Tomcat conf/catalina.bat或catalina.sh中 的最上面增加參數 1. 初步調整參數&#xff08;緩解問題&#xff09; set JAVA_OPTS -Xms6g -Xmx6g -Xmn3g # 增大新生代&#xff0c;減少對象過早晉升到老年代 -XX:MetaspaceSize256m -XX:MaxMetaspaceS…

WSL2 安裝與Docker安裝

注意&#xff1a;如沒有科學上網請勿嘗試&#xff0c;無法判斷是否會因網絡錯誤導致的安裝失敗&#xff01;&#xff01;&#xff01; WSL2&#xff08;Windows Subsystem for Linux 2&#xff09; 功能簡介&#xff1a; WSL2 是微軟提供的在 Windows 上運行完整 Linux 內核的…

Redis的安裝與使用

網址&#xff1a;Spring Data Redis 安裝包&#xff1a;Releases tporadowski/redis GitHub 解壓后 在安裝目錄中打開cmd 打開服務&#xff08;注意&#xff1a;每次客戶端連接都有先打開服務&#xff01;&#xff01;&#xff01;&#xff09; 按ctrlC退出服務 客戶端連接…

springboot-響應接收與ioc容器控制反轉、Di依賴注入

1.想將服務器中的數據返回給客戶端&#xff0c;需要在controller類上加注解&#xff1a;ResponseBody; 這個注解其實在前面已經使用過&#xff0c;RestController其實就包含兩個注解&#xff1a; Controller ResponseBody 返回值如果是實體對象/集合&#xff0c;將會轉換為j…