主頁 > 企業開發 > 什么是 CSR、SSR、SSG、ISR - 渲染模式詳解

什么是 CSR、SSR、SSG、ISR - 渲染模式詳解

2023-07-02 07:56:36 企業開發

本文以 ReactVue 為例,介紹下主流的渲染模式以及在主流框架中如何實作上述的渲染模式,

前置知識介紹

看渲染模式之前我們先看下幾個主流框架所提供的相關能力,了解的可跳到下個章節,

掛載組件到 DOM 節點

這是主流框架最基本的能力,就是將組件渲染到指定的 DOM 節點上,在 React 中所使用的 APIrender,在 Vue 中所使用的是 createApp 后的 mount

水合

水合用來將組件渲染到已有的靜態內容上,用于為靜態頁面恢復其互動和動態能力,在 React 中所使用的 APIhydrateReact 18 前的版本) 和 createHydrateReact 18),在 Vue 中所使用的是 createSSRApp 后的 mount

Vue 中的 API 語意稍顯奇怪,因為使用 createSSRApp 的場景并不一定是 SSR

輸出渲染內容

主流框架除了可以將組件渲染到 DOM 節點上以外,還能將其要渲染的內容直接輸出為如 HTML 字串等形式,輸出為字串的 APIReactVue 中所使用的 API 都叫做 renderToString

React 中還推出了很多其它的 API:如 renderToStaticMarkuprenderToStaticNodeStream 等等,功能基本一致,不影響本文的內容所以此處不細說了,下面的例子中僅以 renderToString 為例,

主流渲染模式

知道了主流框架的這幾種能力,我們再來通過標題提到的幾種主流渲染模式看下他們能用來組合出什么樣的效果,

CSR - Client Side Rendering - 客戶端渲染

CSR 就是我們常見的 SPA 所使用的渲染方式,所有的主流框架都支持,或者說:只要是在客戶端渲染程序中使用到了腳本都可以算作客戶端渲染,

CSR 主要流程為:

picture 10

  1. 瀏覽器加載頁面
  2. 加載對應的腳本
  3. 腳本執行時向頁面中渲染內容,此步驟一般包含兩種方式:
    1. 向一個空節點中渲染內容,一般應用于純粹的 CSR 應用,這里使用的就是上面提到的掛載組件的功能,
    2. 向一個已有內容的節點中渲染內容,通常應用于 CSR 與其它渲染模式(SSRSSGISR)結合的場景下

CSR 的使用場景定義也很簡單,如果在客戶端頁面有動態需求或需要互動則必須使用,

SSR - Server Side Rendering - 服務端渲染

SSR 是另一個比較常見的渲染模式,使用這種渲染模式可以從服務端直接回傳要渲染的靜態內容,

其常見流程為:

picture 9

  1. 瀏覽器發起 HTTP 請求對應的頁面
  2. 服務端接收到請求后準備渲染頁面所需要的資料
  3. 將所需要的資料傳入需要渲染的頁面組件中然后通過 renderToString 輸出為靜態內容
  4. 拼接頁面模版、水合腳本等將生成的靜態內容回傳到瀏覽器,瀏覽器進行渲染
  5. 瀏覽器渲染內容,執行水合腳本恢復頁面互動和動態能力

純粹的 SSR 指代的接收到請求、輸出靜態內容、回傳瀏覽器的模式,水合的相關部分是屬于 CSR 的內容,

要注意水合并不是必須的,可以按需選擇,比如如果你的需求是要對不同的用戶展示不同的頁面,然而頁面上并沒有任何可以互動或動態的內容,那完全可以忽略水合的部分,

SSR 一般應用于以下場景:

  1. 出于首頁打開速度、用戶體驗、SEO 等目的需要讓用戶更快的看到頁面首屏內容
  2. 想要預先渲染的頁面內容中存在動態的內容

SSG - Static Site Generation - 靜態站點生成

SSG 現在也比較常見,它所指代的是在構建階段就將頁面所需要的資料準備好然后將需要的頁面通過腳本構建為靜態內容的模式,

其常見流程為:

picture 8

  1. 在構建階段構建腳本遍歷所有需要靜態構建的頁面
  2. 獲取渲染所需要的資料并通過 renderToString 輸出為靜態內容
  3. 將靜態內容拼接頁面模版和水合腳本等內容后保存到檔案中
  4. 瀏覽器發起請求時從服務端回傳靜態頁面(一般直接使用靜態檔案服務器即可)
  5. 瀏覽器渲染內容,執行水合腳本恢復頁面互動和動態能力

純粹的 SSG 指代的同樣是不包含 CSR 部分的內容,即構建階段生成靜態頁面并在請求時直接將靜態頁面回傳的程序,水合程序同樣不是必須的,視需求決定即可,

SSG 一般應用于以下場景:

  1. 出于首頁打開速度、用戶體驗、SEO 等目的需要讓用戶更快的看到頁面首屏內容
  2. 頁面中基本都是靜態內容,變動很少或變動的時機比較固定

所以常用于通過 CMS 生成內容、博客站點等靜態內容較多的場景,

ISR - Incremental Static Regeneration - 增量靜態再生

ISR 目前使用的不多,它算是 SSG 的一種增強版,指的是在 SSG 的基礎上,服務端在收到頁面請求時會對頁面的時效性進行判斷,如果認定失效則會對該頁面進行增量構建的一種模式,

其常見的流程如下:

picture 7

可以看出 ISR 在構建和客戶端環節沒有任何的變化,而是增加了 Server 端的邏輯:

  1. 在服務端收到對應頁面請求時服務端會先回傳當前內容然后對頁面做失效驗證
  2. 如果頁面實作,服務端會對失效的頁面進行后臺增量構建
  3. 當下次請求到達時如果新的頁面已經生成成功則會回傳新頁面的內容,但在此之前還會繼續使用舊頁面的內容

當然上述的邏輯并不絕對,先增量構建再回傳也同樣是 ISR,只是一般這樣會影響到用戶體驗一般不推薦,

ISR 適用的場景是:

  1. 網站匹配 SSG 場景
  2. 但對頁面有一定的實時性要求

比如說天氣預報頁面,可能半小時更新一次即可,或者是新聞頁面,在存在新資料時再進行增量構建也是一種解決方案,

如何選擇

在選擇渲染模式時我們通過以下邏輯進行簡單的判斷:

  1. 客戶端頁面是否需要動態或互動能力,如果要則 CSR 為必選
  2. 如果頁面有 SEO、首屏、性能等需求
    1. 如果頁面中想要靜態展示的內容對每次訪問都可能存在差異——比如每個用戶看到的頁面資訊不同,則可以選擇 SSR
    2. 如果頁面中靜態展示的內容對每次訪問沒有差異性即可選擇 SSG
      1. 如果頁面中的靜態內容變動較為頻繁,則可選擇 ISR

其次還要注意 SSRISR 都需要服務端的支持,所以如果只有靜態檔案服務器那需要的改動就比較大了,

最后

渲染模式其實遠不止以上幾種,很多場景下都可以進行相應的優化,以下是一些我能想到的場景:

  • 在錄入或更新資料時通過 WebHook 等通知構建系統進行增量構建,算是 ISR 的一種變種
  • SSR 場景下可以對靜態組件和動態組件進行區分,將靜態組件使用 SSG 輸出,然后將其拼接到頁面中,

所以沒有最好的只有最適合的,按需選擇最適合自己需求的渲染模式即可,

如果想要看 SSRSSGISR 的具體實作請看我之前的文章,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/556484.html

標籤:其他

上一篇:vue中封裝服務器地址/介面與設定請求頭

下一篇:返回列表

標籤雲
其他(161983) Python(38266) JavaScript(25520) Java(18286) C(15238) 區塊鏈(8275) C#(7972) AI(7469) 爪哇(7425) MySQL(7280) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5876) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4609) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2438) ASP.NET(2404) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1985) HtmlCss(1983) 功能(1967) Web開發(1951) C++(1942) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1882) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 什么是 CSR、SSR、SSG、ISR - 渲染模式詳解

    本文以 `React`、`Vue` 為例,介紹下主流的渲染模式以及在主流框架中如何實作上述的渲染模式。 ## 前置知識介紹 看渲染模式之前我們先看下幾個主流框架所提供的相關能力,了解的可跳到下個章節。 ### 掛載組件到 DOM 節點 這是主流框架最基本的能力,就是將組件渲染到指定的 `DOM` 節 ......

    uj5u.com 2023-07-02 07:56:36 more
  • vue中封裝服務器地址/介面與設定請求頭

    1. 設定請求頭 首先創建一個放置服務器地址的js,如http.js,然后在http.js中引入axios `import axios from "axios";` 如果沒有axios,需要先安裝,npm i axios或者yarn add axois,然后重啟服務器 ...直接上代碼 點擊查看代碼 ......

    uj5u.com 2023-07-02 07:56:27 more
  • vue中封裝服務器地址/介面與設定請求頭

    1. 設定請求頭 首先創建一個放置服務器地址的js,如http.js,然后在http.js中引入axios `import axios from "axios";` 如果沒有axios,需要先安裝,npm i axios或者yarn add axois,然后重啟服務器 ...直接上代碼 點擊查看代碼 ......

    uj5u.com 2023-07-02 07:56:12 more
  • css學習(一)

    ### css引入 1. 行內樣式 ```css 我是div元素 ``` 2.內部樣式 ```css ``` 3. 外部樣式 ```css /* 可以通過@import引入其他的css資源 */ @import url(./style.css); @import url(./test.css); . ......

    uj5u.com 2023-07-02 07:55:38 more
  • 1.3 Metasploit 生成SSL加密載荷

    在本節中,我們將介紹如何通過使用`Metasploit`生成加密載荷,以隱藏網路特征。前一章節我們已經通過`Metasploit`生成了一段明文的ShellCode,但明文的網路傳輸存在安全隱患,因此本節將介紹如何通過生成SSL證書來加密ShellCode,使得網路特征得到隱藏,從而提高后門的生存能... ......

    uj5u.com 2023-07-02 07:55:08 more
  • 1.3 Metasploit 生成SSL加密載荷

    在本節中,我們將介紹如何通過使用`Metasploit`生成加密載荷,以隱藏網路特征。前一章節我們已經通過`Metasploit`生成了一段明文的ShellCode,但明文的網路傳輸存在安全隱患,因此本節將介紹如何通過生成SSL證書來加密ShellCode,使得網路特征得到隱藏,從而提高后門的生存能... ......

    uj5u.com 2023-07-02 07:54:11 more
  • 記錄--讓整個網站界面無滾動條

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 界面無滾動條 滾動條的優化也有很多種,比如隨便再網上搜索美化瀏覽器滾動條樣式,就會出現些用css去美化滾動條的方案。 那種更好呢? 沒有更好只有更合適 像默認的滾動條的話,他能讓你方便摁著往下滑動(他比較寬)特別省勁,不用擔心美化過后變細 ......

    uj5u.com 2023-07-01 08:44:29 more
  • vane 一個適用于前端打工人的全堆疊框架,nodejs+vue3+typescript

    # vane 寫這個的初衷是因為每次用node寫介面的時候總是需要一些寫大一堆的東西, 也有些人把很多介面都放在一個js檔案內, 看起來很是雜亂, 后來用到nuxt寫的時候, 感覺用檔案名來命名介面路徑很是方便, 無論是query引數還是params引數,都可以通過檔案名來命名, 也可以通過檔案夾層 ......

    uj5u.com 2023-07-01 08:44:23 more
  • Prisma 避坑指南!

    * 環境變數問題 ```typescript datasource db { provider = "mysql" url = env("DATABASE_URL") } ``` 1. `npx prisma db push` 默認取 .env 組態檔,那多環境怎么處理? 2. 增加 `.env. ......

    uj5u.com 2023-07-01 08:44:18 more
  • 如何實作巡檢報告?

    # 什么是巡檢報告 巡檢報告是指對某一個系統或設備進行全面檢查,并把檢查結果及建議整理成報告的程序。 巡檢報告通常用于評估系統或設備的運行狀況與性能,以發現問題、優化系統、提高效率、降低故障率等方面提供參考。 ![file](https://img2023.cnblogs.com/other/233 ......

    uj5u.com 2023-07-01 08:43:45 more