渲染模式有好多種,了解下web的各種渲染模式,對技術選型有很大的參考作用。
一、靜態HTML時代
早期(1990 - 1995年)網頁開發完全依賴手工編寫HTML(HyperText Markup Language)和CSS(層疊樣式表)。開發者通過文本編輯器(如Notepad、Vi)直接編寫代碼,定義頁面的結構和樣式。
HTML文件通常包含固定的文本、圖片和超鏈接,CSS用于簡單的樣式調整(如字體顏色、背景色)。例如:
<html><head><title>我的第一個網頁</title><style>body { background-color: #ffffff; }h1 { color: #0000ff; }</style></head><body><h1>歡迎訪問我的網站</h1><p>這是一個靜態頁面。</p></body>
</html>
開發者將編寫好的HTML/CSS文件通過FTP(文件傳輸協議)工具(如FileZilla、WS_FTP)上傳到Web服務器。服務器接收到請求后,直接返回這些靜態文件給用戶的瀏覽器。
服務器在此階段僅作為“文件存儲倉庫”,不涉及任何動態處理邏輯(如計算、數據庫查詢),直接返回預存的HTML文件。
1.解決的問題
靜態HTML的誕生標志著互聯網從“文檔共享”向“信息展示”的轉變。
早期的網頁主要用于展示固定內容,例如:
- 公司介紹(如企業官網)
- 新聞公告(如報紙的在線版本)
- 個人主頁(如學者或愛好者的個人博客)
通過HTML的超鏈接特性,用戶可以輕松跳轉到其他頁面,形成“超文本網絡”。
由于無需復雜的后端邏輯或數據庫,靜態網頁的開發和部署成本極低,適合資源有限的早期互聯網環境。
2.局限與痛點
(1)內容更新需手動修改并重新部署
如果需要修改網頁內容(如更新新聞標題),開發者必須重新打開HTML文件,手動修改代碼,保存后再通過FTP重新上傳到服務器。這一過程耗時且容易出錯。
對于頻繁更新的網站(如新聞門戶),維護成本極高。
(2)無交互能力
靜態網頁無法實現動態功能。例如:
- 表單驗證:用戶提交表單后,服務器無法實時校驗輸入是否正確。
- 動態內容:無法根據用戶請求生成個性化內容(如顯示用戶登錄狀態)。
用戶只能被動瀏覽內容,無法參與互動(如注冊、評論、搜索)。
(3)多頁面重復內容維護成本高
多個頁面的公共部分(如導航欄、頁腳)需要重復編寫HTML代碼。例如:
<!-- 頁面1 -->
<nav><a href="index.html">首頁</a><a href="about.html">關于我們</a>
</nav><!-- 頁面2 -->
<nav><a href="index.html">首頁</a><a href="about.html">關于我們</a>
</nav>
(4)SEO(搜索引擎優化)受限
早期搜索引擎主要依賴靜態HTML的結構化標簽(如<h1>
、<title>
)抓取內容。但靜態網頁缺乏動態元數據(如動態生成的描述標簽),導致SEO效果有限。
3.代表技術
Apache:1995年推出的Apache HTTP Server成為當時最流行的Web服務器軟件。它支持靜態文件的高效分發,并通過.htaccess文件管理權限和重定向規則。
Nginx:2004年推出的Nginx以高性能著稱,尤其擅長處理高并發的靜態文件請求。
FTP工具(如FileZilla):允許開發者將本地文件上傳到遠程服務器,是早期網頁部署的核心工具。FTP缺乏版本控制功能,容易因多人協作導致文件沖突。
4.本質:文件分發與超文本系統
在靜態HTML時代,Web的核心功能是“文件分發”。服務器僅負責存儲和返回預先生成的HTML文件,不進行任何計算或動態處理。
例如,用戶訪問http://example.com/index.html
時,服務器直接返回存儲在硬盤上的index.html文件。
Web被設計為“超文本系統”,其核心是通過超鏈接(<a>
標簽)將分散的文檔連接成網絡。例如:
<a href="about.html">關于我們</a>
用戶點擊鏈接后,瀏覽器會向服務器發起新的請求,獲取目標頁面的HTML文件并渲染。
服務器在此階段完全不具備動態處理能力。例如:無法存儲或查詢用戶數據,服務器無法運行JavaScript或其他腳本語言,所有內容必須在部署前編寫完成。
靜態HTML時代奠定了互聯網的基礎,但其局限性也顯而易見。
隨著用戶需求的復雜化(如動態內容、交互功能),后續技術(如CGI、PHP、JavaScript)逐漸興起,推動Web從“靜態文檔展示”向“動態交互應用”演進。
二、動態腳本與模板引擎:服務端渲染(SSR 1.0)
后來(1995 - 2005年)出現了動態腳本語言,例如PHP(Hypertext Preprocessor)、JSP(JavaServer Pages)、ASP(Active Server Pages)等動態腳本語言允許開發者在服務端動態生成HTML內容。
通過腳本語言將數據庫中的數據與HTML模板結合,輸出完整的頁面。例如:
<!-- PHP示例 -->
<?php$user = "Alice";echo "<h1>Welcome, $user</h1>";
?>
<!-- JSP示例 -->
<%String user = "Bob";
%>
<h1>Welcome, <%= user %></h1>
早期動態腳本語言結合模板引擎(如Smarty、Jinja2)進一步分離邏輯與視圖。例如:
<!-- Smarty模板示例 -->
<h1>Welcome, {$user}</h1>
此種模式的特點是所有頁面生成邏輯在服務器完成,瀏覽器僅負責渲染靜態HTML。
工作流程如下:
用戶請求 → 服務器執行腳本 → 動態生成HTML → 返回給瀏覽器解析。
這種模式也叫服務端渲染(SSR 1.0)模式
1.解決的問題
動態腳本語言支持連接數據庫(如MySQL、Oracle),實現內容實時更新。例如:
// PHP連接數據庫示例
$conn = mysqli_connect("localhost", "user", "password", "dbname");
$result = mysqli_query($conn, "SELECT * FROM users");
while ($row = mysqli_fetch_assoc($result)) {echo "<p>" . $row['name'] . "</p>";
}
這種方式廣泛應用于電商網站商品列表、新聞門戶實時更新、用戶個人資料頁等。
通過動態腳本處理表單數據、驗證用戶輸入、實現登錄/注冊功能。例如:
// PHP表單處理示例
if ($_SERVER["REQUEST_METHOD"] == "POST") {$username = $_POST["username"];$password = $_POST["password"];// 驗證邏輯echo "Welcome, $username";
}
通過Session/Cookie實現用戶登錄狀態的維護。
模板引擎(如Smarty、Jinja2)允許開發者復用公共模塊(如導航欄、頁腳),避免重復編寫HTML。例如:
<!-- Smarty模板復用示例 -->
{include file="header.tpl"}
<main><p>動態內容區域</p>
</main>
{include file="footer.tpl"}
2.局限與痛點
(1)前后端強耦合
后端工程師需同時處理業務邏輯(如數據庫操作)和HTML拼接,導致代碼臃腫。
前端設計師無法獨立開發界面,協作效率低下。
(2)體驗差
每次用戶交互(如點擊按鈕、提交表單)需重新加載整個頁面,導致“整頁刷新”。
用戶體驗卡頓,交互響應慢。
(3)擴展性弱
服務端需為每個請求生成完整HTML,流量激增時服務器易成為性能瓶頸。
高并發場景下服務器負載過高,響應時間變長。
3.技術代表
WordPress(PHP):基于PHP的開源內容管理系統(CMS),通過插件和模板實現動態頁面生成。低門檻、快速搭建博客/網站,支持主題定制和擴展。
Django(Python):特點:Python的Web框架,內置ORM(對象關系映射)和模板引擎(Django Templates)。開箱即用的功能(如認證系統、數據庫遷移),適合中大型項目。
Java Servlets/JSP:Java的Web開發技術,通過Servlet處理請求,JSP實現動態HTML生成。企業級應用的穩定性與擴展性,適合高并發場景(如銀行系統)。
4.本質:渲染=服務端計算
頁面渲染完全由服務器完成,瀏覽器僅負責解析和顯示生成的HTML。
用戶請求 → 服務器執行PHP/JSP腳本 → 生成HTML → 返回瀏覽器 → 渲染頁面
與靜態HTML的對比,此模式頁面內容動態生成,服務器需執行腳本并返回結果。
就是服務器需為每個請求生成HTML,資源消耗大。動態內容也難以預渲染或緩存,導致重復計算。
動態腳本與模板引擎(1995-2005年)標志著Web從“靜態文檔展示”向“動態交互應用”的過渡。
通過PHP/JSP/ASP等技術,開發者實現了內容動態化、用戶交互和代碼復用,但也暴露了前后端強耦合、整頁刷新和擴展性差等問題。
這一階段奠定了服務端渲染(SSR)的基礎,為后續MVC框架(如Spring MVC、Ruby on Rails)和前后端分離架構的演進提供了方向。
三、Ajax崛起與CSR時代:前后端分離的雛形
2005年,谷歌在Gmail中大規模應用Ajax(Asynchronous JavaScript and XML)
,首次展示了無需刷新頁面即可實現動態內容更新的能力。
XMLHttpRequest(XHR)
是JavaScript中用于發送HTTP請求的API,允許瀏覽器在不刷新頁面的情況下與服務器通信。
它的核心功能是:發起異步請求(GET/POST),接收服務器返回的JSON/XML數據,動態更新頁面局部內容(如評論列表、搜索結果)。
const xhr = new XMLHttpRequest();
xhr.open("GET", "https://api.example.com/data", true);
xhr.onreadystatechange = function () {if (xhr.readyState === 4 && xhr.status === 200) {document.getElementById("content").innerHTML = xhr.responseText;}
};
xhr.send();
2006年,John Resig推出jQuery
,解決了早期JavaScript開發的痛點(如跨瀏覽器兼容性、繁瑣的DOM操作)。
它的核心功能是:通過簡潔的API(如$("#id")
)快速定位和操作元素,統一處理瀏覽器差異(如IE與Firefox的事件模型),簡化XHR調用(如$.ajax()
)。
$.ajax({url: "/api/comments",method: "GET",success: function (data) {$("#comments").html(data);}
});
但是jQuery 時代 DOM 操作很混亂,狀態邏輯分散難維護,手動性能優化成本高。
2013年React 誕生了,Facebook 為解決復雜動態 UI 的維護難題(如新聞流實時更新)而推出,首次引入虛擬 DOM和組件化開發模式。
2014年尤雨溪推出了Vue技術,該框架為平衡漸進式開發體驗(可逐步集成)與高性能響應式更新而設計,核心是響應式數據綁定 和 模板編譯。
兩者重新定義了前端開發范式(組件化、數據驅動),并主導了現代 Web 渲染架構演進,解決了復雜交互界面的可維護性與動態視圖的更新性能。
1.解決的問題
實現無刷新局部更新,用戶提交評論后,僅更新評論區域,無需刷新整個頁面。或者輸入關鍵詞時,動態加載匹配結果(如Google搜索建議)。
這樣減少了頁面跳轉,避免“白屏”現象。僅傳輸必要的數據(如JSON),降低了帶寬消耗。
同時,這也是前后端職責分離的雛形。
后端角色只需要提供標準化的API(如RESTful API),專注于數據處理和業務邏輯。
GET /api/users/123 HTTP/1.1
Accept: application/json
前端角色也只需要負責頁面渲染和交互邏輯(如通過JavaScript動態更新內容)。
fetch("/api/users/123").then(response => response.json()).then(data => renderUserProfile(data));
2.局限和痛點
(1)白屏時間長
特別是在單頁面應用(SPA)時代,前端需先下載并解析JavaScript框架(如React、Vue),頁面初始化時需等待多個API請求完成,動態生成DOM樹并綁定事件,耗時較長。
用戶首次訪問時可能看到空白頁面,體驗不佳。
(2)SEO不友好
搜索引擎爬蟲(如Googlebot)難以解析JavaScript動態生成的內容,傳統SEO優化手段(如標簽、靜態HTML)失效。
早期的單頁應用(SPA)因內容無法被爬取,導致搜索引擎排名下降。
(3)低端設備體驗差
大體積JavaScript框架(如jQuery + 多個插件)在低端手機或老舊瀏覽器中執行緩慢。
動態渲染依賴JavaScript,若網絡延遲或腳本執行失敗,頁面無法正常顯示。
3.技術代表
(1)Backbone.js(引入MVC模式)
將應用分為模型(Model)、視圖(View)、控制器(Controller),通過事件綁定實現數據與視圖的解耦。
框架本身僅提供基礎結構,開發者需自行組織代碼,適合需要高度定制化的項目(如企業級應用)。
const User = Backbone.Model.extend({defaults: { name: "Guest" }
});
const UserView = Backbone.View.extend({render: function () {this.$el.html("<h1>" + this.model.get("name") + "</h1>");}
});
const user = new User({ name: "Alice" });
const view = new UserView({ model: user, el: "#user-profile" });
view.render();
(2) AngularJS(雙向綁定)
視圖與模型自動同步(如表單輸入與變量直接關聯),通過HTML指令(如ng-model
)定義交互邏輯。
提供路由、依賴注入、表單驗證等內置功能,適合需要強結構化的大型項目(如管理后臺)。
<div ng-app="myApp" ng-controller="UserController"><input type="text" ng-model="user.name"><h1>{{ user.name }}</h1>
</div>
<script>angular.module("myApp", []).controller("UserController", function ($scope) {$scope.user = { name: "Bob" };});
</script>
4.本質:客戶端計算與異步交互的革命
此階段的核心是“客戶端生成HTML”,瀏覽器通過JavaScript動態加載數據并渲染頁面,服務器僅提供數據接口(如REST API)。
計算邏輯從服務端轉移到客戶端,瀏覽器不再是“解析器”,而是具備動態計算能力的“終端”。
通過 XMLHttpRequest(XHR)
或 Fetch API
實現異步請求,頁面無需整體刷新即可更新局部內容(如評論列表、搜索建議)。
打破“請求-刷新”的同步模式,引入“事件驅動”的異步交互范式。
無刷新更新提升了交互流暢性。jQuery和MVC框架降低了前端開發門檻。
Ajax的出現標志著Web從“服務端渲染”向“客戶端渲染”(CSR)過渡,推動了前后端分離的雛形。
前后端開發可以并行,降低耦合度,提升開發效率。后端可使用任意語言(如Java、Python),前端統一使用JavaScript。
但白屏時間、SEO問題限制了大規模應用,低端設備兼容性挑戰凸顯。
React/Vue
的出現讓 CSR 成為主流,但也暴露了 SEO 與首屏性能的短板,進而催生新一代解決方案。例如,同構渲染框架(Next.js/Nuxt.js
)的誕生。
后續如Next.js、Nuxt.js結合CSR的優勢,解決SEO和首屏加載問題,通過標準化組件化開發,減少對框架的依賴。
這一階段奠定了現代Web應用(如React、Vue)的基礎,推動了前后端分離、API經濟和前端工程化的浪潮,同時也為后續技術(如SSR優化、PWA、WebAssembly)提供了演進方向。
四、服務端渲染(SSR)復興與現代化演進
如前面所說,客戶端渲染(CSR)雖然提升了交互體驗,但暴露了不少問題。
搜索引擎爬蟲難以解析JavaScript動態生成的內容(如早期SPA),需等待JS下載、解析、執行后才能渲染內容,用戶體驗差,大體積JS框架在低性能設備上執行緩慢。
很多網站之所以使用SSR,主要目的是做搜索引擎優化(SEO)?。
由于所處的國家和利益不同,谷歌很早就支持對使用Ajax技術異步渲染內容的網站進行爬取,它們洞見了這種技術將會被廣泛利用,不過谷歌在服務端的開銷也要增加很多,因為這依賴于一個模擬的瀏覽器環境。
百度至今仍不支持爬取動態渲染內容為主的網站,可能是國內目前需營銷的網站大多還是靜態內容站吧。因此,是否需要SSR,最主要的因素就是是否需要SEO,換句話說,你的產品是面向大眾用戶的,還是面向企業的。如果是面向企業,那可能只有首頁、信息頁和一些營銷頁面需要SEO,與主產品分離。
使用SSR的第二原因是,客戶端的網絡可能是不穩定的,有的地方很快,有的地方會很慢。
這種情況下,通過SSR減少請求量和客戶端渲染可以相對快速地看到內容。
因此,人們想到需要結合服務端能力(如SSR)與客戶端動態交互的優勢,形成新的技術演進。
(一) 同構渲染(Isomorphic SSR)
現代的技術框架可以通過同一套代碼實現服務端渲染(SSR)與客戶端交互(CSR),兼顧SEO、首屏性能與動態交互。
React生態的Next.js(自動處理SSR與Hydration),Vue生態的Nuxt.js(提供SSR模板與生命周期鉤子)。
原理為前后端共享組件與業務邏輯,減少重復開發,服務端渲染時同步獲取所需數據,避免客戶端二次請求。
搜索引擎可直接抓取服務器生成的HTML,用戶無需等待JS執行即可看到內容,Hydration后頁面具備CSR的交互能力。
缺點是每次請求需動態渲染HTML,高并發場景下壓力較大,需處理服務端與客戶端環境差異(如全局變量、DOM操作)。
1.工作原理
(1)服務端渲染首屏HTML
使用Node.js運行React/Vue等框架,在服務器端將首屏內容渲染為完整的HTML字符串。
- 當用戶發起請求時,服務器根據路由和請求參數動態生成 HTML 內容。
- 服務器使用前端框架(如 Vue、React、Angular)將組件渲染為 HTML 字符串。
- 服務器將生成的 HTML、初始數據以及客戶端所需的 JavaScript 一并發送給瀏覽器。
// 服務端代碼(Node.js)
import React from 'react';
import { renderToString } from 'react-dom/server';
const App = () => <div>Hello SSR!</div>;
const html = renderToString(<App />);
(2)客戶端“注水”(Hydration)
瀏覽器加載HTML后,注入JavaScript代碼,激活頁面交互邏輯(如事件綁定、狀態管理)。
- 瀏覽器接收到完整的 HTML 后,直接展示內容。
- 客戶端的 JavaScript 會“水合”(Hydration)頁面,將靜態 HTML 轉換為動態交互的單頁應用(SPA)。
// 客戶端代碼(Browser)
import React from 'react';
import { hydrate } from 'react-dom';
const App = () => <div>Hello SSR!</div>;
hydrate(<App />, document.getElementById('root'));
2.解決的問題
(1)更快的首屏加載
用戶無需等待 JavaScript 下載和執行,頁面內容可以直接顯示,顯著提升首屏加載速度。對于網絡較差或低端設備,效果尤為明顯。
(2) 更好的 SEO
搜索引擎爬蟲可以直接抓取服務器生成的完整 HTML 內容,無需執行 JavaScript,有利于提高搜索引擎排名。特別適合內容密集型網站(如新聞、博客、電商商品頁)。
(3)用戶體驗優化
避免首屏白屏問題,用戶能快速看到頁面內容,對低性能設備更友好,減少客戶端的計算壓力。
(4)兼容性更強
即使瀏覽器禁用 JavaScript,SSR 生成的 HTML 也能正常顯示內容。
3.痛點
(1) SSR的服務器壓力問題
高并發場景下,動態渲染HTML會導致服務器資源緊張。
當然也有解決辦法,可以對高頻訪問頁面啟用HTTP緩存(如ETag、Cache-Control),在CDN邊緣節點預渲染動態內容(如Cloudflare Workers),通過Kubernetes等工具水平擴展服務端實例。
(2)交互延遲
頁面首次加載后需要客戶端“水合”過程,可能稍顯延遲。
(二)靜態站點生成(SSG)
在構建時預渲染所有頁面為靜態HTML文件,托管至CDN實現極速加載。
使用工具(如Gatsby、Next.js)將Markdown、CMS數據或API響應編譯為HTML。
// pages/index.js
export async function getStaticProps() {const res = await fetch('https://api.example.com/data');const data = await res.json();return { props: { data } };
}
將生成的HTML、CSS、JS文件托管到CDN(如Cloudflare),利用邊緣節點加速分發。
CDN緩存靜態HTML,全球用戶訪問速度一致,靜態HTML可被搜索引擎直接抓取,僅需托管靜態文件,無需服務器動態渲染。
就是頁面內容需在構建時確定,實時數據(如股票行情)無法更新,大規模站點需較長的構建時間。
2. 局限和痛點
(1)SSG的實時性限制
靜態頁面無法實時更新(如新聞、電商價格)。
當然,可以僅重新生成受影響的頁面(如Next.js的Incremental Static Regeneration),對動態內容使用SSR,靜態內容使用SSG,通過WebSocket或Server-Sent Events(SSE)在客戶端更新數據。
服務端渲染(Server-Side Rendering,SSR
)是一種在服務器端生成完整 HTML 頁面并直接返回給客戶端(瀏覽器)的技術。
五、邊緣計算與流式演進(2020s至今):ESR與增量渲染
傳統服務端渲染(SSR)需將請求從用戶瀏覽器發送到中心服務器,再由服務器生成HTML并返回。
這一過程受“用戶-服務器”物理距離影響,導致首屏時間(TTFB)較長,尤其在跨國訪問或網絡不穩定場景下表現不佳。
動態內容(如用戶個性化推薦、實時數據)需服務器實時查詢數據庫或API,進一步增加延遲。
(一) 邊緣渲染(Edge Streaming Rendering, ESR)
邊緣渲染模式是通過CDN邊緣節點將頁面拆分為靜態內容與動態內容,分別處理并流式返回,顯著縮短首屏時間。
靜態內容通過HTML框架和基礎資源由CDN直出,而動態內容通過邊緣節點請求源站數據,并以流式方式返回。
還可以CDN節點全球部署,就近服務用戶,動態數據請求分散至邊緣節點,減輕中心服務器壓力。
1.核心原理
(1)靜態內容優先返回
CDN邊緣節點緩存HTML框架、CSS、JS等靜態資源,直接返回給用戶,避免“白屏”等待。
示例:導航欄、頁腳等通用部分可立即加載,用戶無需等待動態數據。
(2)動態內容并行加載
邊緣節點同時向源站請求動態數據(如用戶信息、實時推薦),并將結果以流式方式(Transfer-Encoding: chunked)追加到響應中。
流式傳輸(Chunked Encoding):將動態數據分塊發送,每塊數據包含十六進制長度標識(如A\r\n…),客戶端可逐步解析并渲染。
(3)邊緣計算能力
利用CDN節點的輕量級計算能力,對動態數據進行預處理(如過濾、聚合),減少回源請求。
客戶端逐步接收靜態和動態內容,分階段渲染頁面(如先展示導航欄,再加載列表內容)。
頁面骨架快速呈現,用戶感知流暢;動態內容邊加載邊展示,減少焦慮感。
2.解決的問題
(1)SSR的地域延遲問題:
傳統SSR(服務端渲染)依賴中心服務器生成HTML,用戶與服務器的物理距離導致首屏時間(TTFB)較長。
ESR將頁面拆分為靜態內容(如HTML框架、CSS)和動態內容(如用戶數據、推薦列表),由CDN邊緣節點直接返回靜態部分,動態部分通過流式傳輸(Transfer-Encoding: chunked)逐步加載。
(2)動態數據回源慢:
動態內容(如實時推薦、用戶畫像)需服務器查詢數據庫或API,增加延遲。
ESR在CDN節點上緩存或預處理部分動態數據(如聚合、過濾),減少回源請求,動態數據分塊傳輸,客戶端逐步解析并渲染,避免“白屏”等待。
3.本質:邊緣計算 + 流式傳輸
利用CDN節點的全球分布和輕量級計算能力,將頁面拆分為靜態與動態部分,通過流式傳輸實現“邊生成邊返回”,優化首屏加載體驗。
通過 Transfer-Encoding: chunked
實現分塊響應,客戶端逐步接收并渲染內容。
(二) 增量靜態再生(Incremental Static Regeneration, ISR)
在構建時預渲染關鍵頁面為靜態HTML,其余頁面按需生成或定時重建,平衡實時性與構建成本。
構建階段生成高流量頁面(如首頁、產品列表頁)的靜態HTML,托管至CDN。
當用戶請求未預渲染的頁面時,服務器動態生成并緩存該頁面,可以設置時間間隔(如1小時),定期更新靜態頁面內容。
export async function getStaticProps() {const data = await fetchData();return {props: { data },revalidate: 60 // 每60秒重新生成頁面};
}
該模式將核心頁面靜態化,首屏加載極快;非核心頁面按需或定時更新,確保數據新鮮度,無需全站靜態化,僅對高頻頁面預渲染,降低存儲和計算開銷。
1.解決的問題:
(1)SSG的靜態化局限性
SSG(靜態站點生成)在構建時預渲染所有頁面為靜態HTML,無法實時更新動態數據(如電商庫存、新聞時效性)。
ISR在構建時生成高流量頁面的靜態HTML,托管至CDN加速訪問,然后對非核心頁面按需生成或定時重建(通過 revalidate 配置時間間隔),確保數據新鮮度。
(2)構建成本與實時性的平衡:
全站靜態化需頻繁重建,資源浪費;全動態渲染(SSR)則犧牲性能。
ISR使用混合模式:核心頁面靜態化(SSG),非核心頁面動態更新(SSR),兼顧性能與實時性。
2.本質:SSG + 動態更新
ISR模式結合靜態生成的性能優勢與動態渲染的靈活性,通過后臺異步更新頁面內容,避免全站重建。
在框架(如Next.js)中通過 getStaticProps
配置 revalidate
參數,觸發頁面的增量更新。
六、技術總結
1.技術代表
Next.js
:支持SSR、SSG、CSR自由切換,內建服務端API接口,簡化前后端分離開發,自動壓縮圖片并適配設備分辨率。
Nuxt.js
:通過插件系統擴展功能(如SEO優化、國際化),默認啟用SSR,同時支持靜態導出。
SvelteKit
:通過adapter-static生成純靜態文件,對動態路由頁面自動緩存預渲染結果。
Cloudflare Workers / Cloudflare Pages
:提供輕量級 JS 運行環境,適合執行 ESR 中的流式 HTML 拆分邏輯。用于緩存靜態片段或動態數據,提高 ESR 渲染效率。結合靜態托管和邊緣函數,構建高性能 Web 應用。可無縫配合 SSG 構建流程,在部署時注入邊緣邏輯。
2.各渲染模式的對比
(1)SSR的特點
首屏加載快(直接返回 HTML),SEO 友好(搜索引擎可抓取完整 HTML),支持動態內容(如實時數據)。
服務器壓力大(每次請求需渲染),開發復雜(需處理服務器與客戶端的 Hydration),交互延遲(需客戶端“水合”頁面)。
(2)CSR的特點
交互性強(SPA 動態更新無需刷新),服務器負載低(僅返回靜態資源), 前后端分離,部署簡單。
首屏加載慢(需下載 JS 并執行), SEO 不友好(需額外優化), 白屏時間(JS 加載期間可能空白)。
(3)SSG的特點
性能極致(靜態文件可 CDN 緩存),SEO 友好(預生成 HTML),服務器無壓力(無動態處理)。
內容更新需重新構建(除非支持 ISR),動態內容支持弱(需結合 API)。
(4)ESR的特點
HTML 分塊返回,邊緣節點直出,流式傳輸(Transfer-Encoding: chunked)。
所以首屏極速加載,動態內容逐步呈現,減輕中心服務器負載。但是邊緣邏輯復雜,流式傳輸有兼容要求。
適合全球化電商平臺、個性化推薦、高并發動態內容展示。
(5)ISR的特點
構建時預渲染,后臺異步更新,可配置更新頻率。
性能與更新平衡,無需全站重建,SEO 友好。
更新有延遲,非實時數據場景。
3.關鍵差異總結
-
SSR vs ESR:
- SSR:所有內容由中心服務器動態生成,受地域延遲影響大。
- ESR:靜態內容由 CDN 直出,動態內容通過邊緣節點流式返回,TTFB≈CDN 速度。
-
SSG vs ISR:
- SSG:所有頁面構建時靜態生成,無法實時更新。
- ISR:核心頁面預渲染,非核心頁面按需/定時更新,兼顧性能與實時性。
-
ESR vs ISR:
- ESR:解決“首次加載延遲”問題,適合動態內容實時渲染。
- ISR:解決“靜態化內容更新”問題,適合大規模內容站點。
-
CSR 的局限性:
- 首屏加載依賴 JS 執行,SEO 和首屏性能較差,但交互體驗靈活。
4.SSR、CSR、SSG、ESR、ISR 對比
特性 | SSR(服務端渲染) | CSR(客戶端渲染) | SSG(靜態站點生成) | ESR(邊緣流式渲染) | ISR(增量靜態再生) |
---|---|---|---|---|---|
HTML 生成時機 | 請求時動態生成 | 瀏覽器執行 JS 動態生成 | 構建時靜態生成 | 邊緣節點動態生成(靜態+動態分塊返回) | 構建時靜態生成 + 按需/定時增量更新 |
性能 | 服務器負載高,響應時間長 | 首屏加載慢(需下載 JS),后續交互快 | 極速加載(靜態文件可 CDN 緩存) | 首屏≈CDN速度,動態內容流式加載 | 核心頁面 CDN 加速,非核心頁面按需更新 |
SEO 友好性 | 優秀(直接返回 HTML) | 較差(需 JS 渲染) | 優秀(預生成 HTML) | 優秀(靜態+動態內容均返回 HTML) | 優秀(靜態 HTML + 動態內容可抓取) |
動態內容支持 | 強(實時數據) | 強(完全由 JS 控制) | 弱(需結合 API 或 ISR) | 強(動態數據邊緣節點實時請求) | 中(預渲染后需 API 補充,支持按需更新) |
開發復雜度 | 高(需處理服務器邏輯) | 中(前端框架即可) | 低(靜態生成工具簡化流程) | 高(需邊緣計算配置 + 流式傳輸邏輯) | 中(需框架支持如 Next.js 的 ISR 功能) |
服務器壓力 | 高(每次請求需渲染) | 低(僅返回靜態資源) | 低(無動態處理) | 低(動態請求分散到邊緣節點) | 低(增量更新異步執行) |
適用場景 | 電商、論壇、實時數據頁面 | SPA(單頁應用)、內部管理系統 | 博客、文檔、企業官網 | 全球化電商、動態推薦(如用戶畫像匹配) | 內容型站點(博客、電商詳情頁)、高并發場景 |
核心優勢 | 實時數據支持,SEO 友好 | 交互流暢,前后端解耦 | 性能極致,CDN 加速 | 首屏極速加載,動態內容逐步呈現 | 平衡性能與實時性,支持大規模內容更新 |
技術實現 | 服務器動態渲染 HTML | 瀏覽器執行 JS 構建 DOM | 構建工具生成靜態 HTML | CDN 邊緣節點拆分靜態/動態內容 + 流式傳輸 | 構建時生成 + 按需/定時更新 + 動態 API |
典型框架/工具 | Node.js、Express、Nuxt.js | React、Vue、Angular | Next.js、Gatsby | Cloudflare Workers、阿里云邊緣計算 | Next.js(getStaticProps + revalidate ) |
適用場景建議:
- SSR:需要實時數據(如電商訂單、論壇評論)。
- CSR:單頁應用(SPA)或內部系統(如管理后臺)。
- SSG:SEO 優先的靜態內容(如博客、文檔)。
- ESR:全球化業務 + 動態內容(如跨國電商推薦系統)。
- ISR:內容型站點需平衡性能與更新(如新聞、商品詳情頁)。