Vue 3 服務端渲染(SSR)與客戶端渲染(CSR)的區別及解決方案

1. SSR與CSR的區別

1.1.?SSR的原理

服務端渲染(SSR)是在服務器端將 Vue 組件渲染為 HTML 字符串,并將其發送給客戶端。這種方式與客戶端渲染(CSR)不同,后者是在瀏覽器中執行 JavaScript 來生成 HTML。

在 SSR 中,客戶端第一次訪問頁面時,服務器會根據請求路徑渲染對應的 HTML 頁面,這有利于提升首屏加載速度和 SEO 性能。之后,客戶端還需要進行“激活”,通過 Vue 的?hydrate 方法讓已經渲染好的 HTML 具備動態交互能力。而 CSR 則是先加載靜態 HTML 框架,之后由客戶端完成所有頁面的 JavaScript 渲染。

1.2. 兩者的主要區別

  • SEO:SSR 在服務器端生成完整的 HTML,利于搜索引擎爬取,而 CSR 生成的 HTML 需要等到 JavaScript 執行完畢后才可用。

  • 性能:SSR 的首屏渲染速度快,但會增加服務器負載;CSR 依賴瀏覽器的計算能力,但可以降低服務器的壓力。

  • 安全:SSR 可以更好地控制輸出內容,減少 XSS 攻擊的風險。

2.?SSR 中如何解決首屏數據獲取問題

在 Vue SSR 中,首屏數據的獲取需要提前在服務器端完成。常用的解決方案是在組件中定義一個 asyncData 方法,專門用于數據預取。這個方法在組件渲染之前調用,服務器端會在渲染 HTML 之前獲取數據并將其注入到組件的 props 中。

2.1. 具體步驟

1. 在服務器端,在 SSR 渲染函數中,先調用組件的 asyncData 方法獲取數據,再將數據注入到 Vue 組件的 props。

2.?在客戶端,Vue 會利用 hydrate 方法進行激活,接管服務器端生成的 HTML。客戶端還會將服務器預取的數據作為初始狀態傳遞,避免重復請求。

數據預取的關鍵在于服務器端需要等待數據加載完畢再渲染頁面,以保證返回給客戶端的 HTML 包含實際的數據。

// 組件中定義 asyncData 方法
export default {async asyncData({ app }) {const data = await fetchData();return { data };},render(h) {return h('div', this.data);}
};

3.?處理路由和狀態同步問題

在 Vue SSR 中,路由和狀態的同步非常重要。為了確保服務器和客戶端渲染結果一致,必須在服務器端渲染時同步路由和狀態。常用的做法包括:

3.1. 路由同步

在服務器端渲染時,服務器會根據用戶的請求 URL 手動調用 router.push() 將路由切換到正確的頁面,然后等待 router.isReady() 確保所有異步路由組件加載完畢后,再進行服務器端渲染。客戶端同樣會根據當前 URL 初始化路由。

// 服務器端路由同步
app.use((req, res, next) => {router.push(req.path, (err, url) => {if (err) {res.status(404).end();} else {app.context.url = url;next();}});
});

3.2. 狀態同步

在 SSR 場景中,服務器端渲染后的狀態(如 Pinia 的 store 狀態)需要傳遞到客戶端。這通常是通過將狀態序列化并嵌入到 HTML 中,客戶端在激活時會使用這些初始狀態,避免再次請求數據。

// 狀態同步
const store = createPinia();
const app = createApp({store,render: () => h(App)
});app.mount('#app', () => {const state = store.state.value;document.getElementById('state').textContent = JSON.stringify(state);
});

4. 總結

Vue 3 的服務端渲染(SSR)和客戶端渲染(CSR)各有優缺點。SSR 提升了首屏加載速度和 SEO 性能,但增加了服務器負載;CSR 則依賴瀏覽器的計算能力,降低了服務器壓力。在實際應用中,開發者需要根據項目需求選擇合適的渲染方式,并采取相應的解決方案來處理首屏數據獲取和路由及狀態同步問題,以確保應用的性能和用戶體驗。

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

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

相關文章

Matlab快速回顧

一1.數值 顯示 格式format style 設置eg: pi format longE;or2.清除指令clc 清除命令行窗口clear 清除工作區cls3.搜索路徑設置path(path,E:\ads\)oraddpath4.M文件用戶把要實現的命令寫在一個以.m為擴展的文件中,然后由matlab系統進行解讀,最后運行結果…

開源低代碼+AI引擎:百特搭企業級開發平臺的演進

在數字化轉型進入深水區的今天,企業應用開發面臨前所未有的復雜挑戰:既要快速響應業務需求,又要確保系統靈活可控;既要降低技術門檻,又要保障核心安全。傳統開發模式與單一形態的低代碼工具已難以滿足多層次需求。融合…

學習 Android(十五)NDK進階及性能優化

學習 Android(十五)NDK進階及性能優化 對 NDK 相關知識有了初步的了解之后,我們可以更加深入的去學習 NDK 相關知識,接下來,我們將按照以下步驟進行深入學習: 深入理解JNI調用過程和性能消耗常見 JNI 坑&am…

QT5.12.8 QTabWidget 透明樣式QSS

/* 設置QTabWidget本身 :不加也行*/ QTabWidget#aaa_tabwdt {background: transparent;border: none; /* 移除邊框可能有助于透明效果 */ }/* 標簽頁內的容器部件 :必須加,標簽也才會透明 */ QTabWidget#aaa_tabwdt QWidget, QTabWidget#aaa_tabwdt QFrame {backgro…

【FAQ】Script導出SharePoint 目錄文件列表并統計大小

一、只導出文件列表的方法 1) 保存腳本&#xff08;建議名&#xff1a;D:\tmp\Export-SharePoint-FileList.ps1&#xff09; <# 導出 SharePoint 指定文件夾&#xff08;含子文件夾&#xff09;的文件列表到 CSV&#xff08;不統計大小&#xff09; 前提&#xff1a;已安…

《Thinking in Java》讀書筆記---控制執行流程

就像有感知的生物一樣&#xff0c;程序必須在執行過程中控制它的世界&#xff0c;并做出選擇。在Java中&#xff0c;你要使用執行控制語句來作出選擇。一、流程控制基礎概念1.1 流程控制的重要性流程控制結構決定了程序執行的順序和邏輯分支&#xff0c;是編程語言中最基礎也是…

極驗 G-star 人才特訓營:為業務安全領域培養下一代新興力量

本文導讀 極驗為什么要啟動 G-star 實習生培養計劃&#xff1f;50多位來自多所高校的同學&#xff0c;在極驗經歷了一場怎樣的“非典型”實習&#xff1f;技術大咖親授&#xff0c;先培訓再實戰&#xff0c;極驗打造的是怎樣的人才體系&#xff1f;同學有話說&#xff1a;培養計…

攻防世界-web-csaw-mfw

一.題目分析這邊提示使用了Git&#xff0c;試著訪問.git看是否存在.git泄露瀏覽了一下&#xff0c;很多都是亂碼&#xff0c;想著用githack將git庫克隆下看一下二.操作python2 GitHack.py http://url/.git訪問了一下flag.php&#xff0c;沒啥發現&#xff0c;在看一下index.php…

202506 電子學會青少年等級考試機器人四級實際操作真題

更多內容和歷年真題請查看網站&#xff1a;【試卷中心 -----> 電子學會 ----> 機器人技術 ----> 四級】 網站鏈接 青少年軟件編程歷年真題模擬題實時更新 2025年6月 青少年等級考試機器人實操真題四級 實際操作 主題&#xff1a;感應節能燈&#xff08;四級&am…

DLT645電表數據 保存到MySQL數據庫項目案例

目錄 1 案例說明 2 VFBOX網關工作原理 3 準備工作 4 配置VFBOX網關采集DLT645電表數據 5 網關寫數據到MYSQL數據庫 6 安裝MYSQL數據庫 7 其他說明 8 案例總結 1 案例說明 設置網關采集DLT645電表數據數據把采集的數據保存到MySQL數據庫。 2 VFBOX網關工作原理 VFBOX網關…

Redux與React - 異步狀態操作(React快速上手4)

異步操作樣板代碼1. 創建store的寫法保持不變&#xff0c;配置好同步修改狀態的方法 2. 單獨封裝一個函數&#xff0c;在函數內部return一個新函數&#xff0c;在新函數中 2.1 封裝異步請求獲取數據 2.2 調用同步actionCreater傳入異步數據生成一個action對象&#xff0c;并使用…

win10桌面右鍵沒有新建word

win10右鍵新建word不見解決方法1、點擊開始&#xff0c;找到運行命令行&#xff0c;輸入regedit&#xff0c;打開注冊表。2、在左側找到HKEY_CLASSES_ROOT目錄&#xff0c;并展開。3.找到.docx 雙擊&#xff08;默認&#xff09;一項&#xff0c;將其改為 Word.Document.12。關…

Docker國內可用鏡像(2025.08.06測試)

Docker渡渡鳥鏡像可用&#xff08;測試時間2025.08.06&#xff09;https://docker.aityp.com/使用渡渡鳥鏡像pull ollama latest 例子&#xff1a;docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/ollama/ollama:0.10.1毫秒鏡像和軒轅鏡像也可用&#xff0c;但…

決策樹的實際案例

決策樹作為一種直觀、易解釋的機器學習算法&#xff0c;在金融、醫療、電商、風控等多個領域都有廣泛的實際應用。以下將講解1個典型案例&#xff1a;貸款違約預測。對于貸款違約預測&#xff0c;即在貸款人員在貸款之前對其進行預測&#xff0c;通過他的眾多特征情況判別是否可…

bool 類型轉換運算符重載

以下是一個極簡且聚焦核心知識點的示例代碼&#xff0c;用最直觀的方式演示 bool 類型轉換運算符重載的觸發邏輯、使用場景和避坑點&#xff0c;幫你快速掌握&#xff1a;cpp運行#include <iostream> using namespace std;// 核心類&#xff1a;演示 bool 轉換運算符 cla…

LVGL代碼框架簡介

LVGL代碼框架介紹LVGL&#xff08;Light and Versatile Graphics Library&#xff09;是一個輕量級、功能強大的嵌入式圖形庫。其代碼架構設計清晰&#xff0c;模塊化程度高。1. 整體架構層次LVGL采用分層架構設計&#xff0c;主要包含以下幾個層次&#xff1a;┌───────…

【云計算】云主機的親和性策略(三):云主機 宿主機

《云主機的親和性策略》系列&#xff0c;共包含以下文章&#xff1a; 1?? 云主機的親和性策略&#xff08;一&#xff09;&#xff1a;快樂旅行團2?? 云主機的親和性策略&#xff08;二&#xff09;&#xff1a;集群節點組3?? 云主機的親和性策略&#xff08;三&#xf…

【世紀龍科技】虛擬技術助力職教汽車自動變速器拆裝虛擬實訓軟件

在職業院校汽車專業實訓課堂上&#xff0c;教師常面臨這樣的兩難&#xff1a;學生圍在昂貴的自動變速器實物旁&#xff0c;卻因設備數量有限只能輪流操作&#xff1b;拆裝步驟稍有偏差便可能損壞精密部件&#xff0c;維修成本讓本就緊張的教學經費雪上加霜&#xff1b;傳統教學…

[LVGL] 配置lv_conf.h | 條件編譯 | 顯示屏lv_display

鏈接&#xff1a;https://docs.lvgl.io/master/ docs&#xff1a;LVGL LVGL&#xff08;Light and Versatile Graphics Library&#xff09;是用于在資源受限的嵌入式系統上創建圖形用戶界面&#xff08;GUI&#xff09;的開源解決方案。 它提供豐富的控件和靈活的**事件系…

sqli-labs通關筆記-第32關 GET寬字符注入(單引號閉合 手工注入+腳本注入兩種方法)

目錄 一、寬字符注入 二、代碼審計 1、代碼審計 2、SQL注入安全性分析 三、滲透實戰 1、進入靶場 2、id1探測 3、id%df-- 探測 4、手工注入 &#xff08;1&#xff09;獲取列數 &#xff08;2&#xff09;獲取回顯位 &#xff08;3&#xff09;獲取數據庫名 &…