伺服器端渲染(SSR)已經存在了一段時間,但值得進一步探索。這種技術可以使您的網頁應用程式更快、更適合 SEO。
在本指南中,我們將解釋 SSR、為什麼您可能想要使用它,以及如何在不費吹灰之力的情況下實現它。我們將介紹基礎知識,將其與客戶端渲染進行比較,並討論一些實際範例。
從根本上來說,SSR 是在伺服器上而不是在瀏覽器中渲染網頁。當使用者請求頁面時,伺服器會完成所有繁重的工作並將完全呈現的頁面傳送到客戶端。然後,客戶端 JavaScript 接管以使其具有互動性。
服務生在廚房做準備工作,瀏覽者只需擺盤上菜即可。
這是一個最小的 Express.js 範例:
const express = require('express'); const React = require('react'); const ReactDOMServer = require('react-dom/server'); const App = require('./App'); const app = express(); app.get('/', (req, res) => { const html = ReactDOMServer.renderToString(<App />); res.send(` <!DOCTYPE html> <html> <body> <div> <h2> From server to browser with fully rendered pages </h2> <p>When we talk about SSR delivering "fully rendered pages," it's important to understand what that actually means. Let's break it down:</p> <h3> What is a fully rendered page? </h3> <p>A fully rendered page is an HTML document containing all the content users would get when they first load the page. This includes:</p> <ol> <li>The complete DOM structure</li> <li>All text content</li> <li>Image placeholders and other media elements</li> <li>Initial styles</li> </ol> <p>Here's a basic example:<br> </p> <pre class="brush:php;toolbar:false"><!DOCTYPE html> <html> <head> <title>My SSR Page</title> <style> /* Initial styles */ </style> </head> <body> <header> <h1>Welcome to My Site</h1> <nav><!-- Fully populated navigation --></nav> </header> <main> <article> <h2>Article Title</h2> <p>This is the full content of the article...</p> </article> </main> <footer><!-- Fully populated footer --></footer> <script src="hydration.js"></script> </body> </html>
相較之下,客戶端渲染 (CSR) 初始 HTML 可能如下所示:
<!DOCTYPE html> <html> <head> <title>My CSR Page</title> </head> <body> <div> <p>The CSR page relies entirely on JavaScript to populate the content.</p> <h3> Benefits of fully rendered HTML </h3> <ol> <li> <strong>Faster Initial Paint</strong>: The browser can start rendering content immediately.</li> <li> <strong>Better SEO</strong>: Search engines read all your content without executing JavaScript.</li> <li> <strong>Improved Accessibility</strong>: Screen readers and other assistive technologies can access content immediately.</li> <li> <strong>Resilience</strong>: Basic content is available even if JavaScript fails to load.</li> </ol> <h3> The hydration process </h3> <p>After sending the fully rendered HTML, SSR applications typically go through a process called hydration:</p> <ol> <li>The server sends the fully rendered HTML.</li> <li>The browser displays this HTML immediately.</li> <li>JavaScript loads and <em>hydrates</em> the page, adding interactivity.</li> </ol> <pre class="brush:php;toolbar:false">// Simplified React hydration example import { hydrateRoot } from 'react-dom/client'; import App from './App'; const domNode = document.getElementById('root'); hydrateRoot(domNode, <App />);
此過程允許快速初始加載,同時仍提供現代 Web 應用程式的豐富互動性。
請記住,雖然 SSR 提供了這些完全渲染的頁面,但它並非沒有權衡。伺服器執行更多工作,您需要仔細處理伺服器和客戶端之間的狀態。然而,對於許多應用程式來說,完全渲染頁面的好處使 SSR 成為一個令人信服的選擇。
客戶端渲染(CSR)和伺服器端渲染(SSR)是渲染網頁的兩種不同方法。以下是它們主要差異的細分:
優點:
缺點:
優點:
缺點:
這是一個簡單的視覺比較:
本質上,CSR更多地在瀏覽器中工作,而SSR更多地在伺服器上工作。它們之間的選擇取決於您專案的特定需求,平衡初始載入時間、SEO 要求和伺服器資源等因素。
伺服器端渲染會對搜尋引擎如何看待您的網站產生重大影響。讓我們來分解一下:
搜尋引擎機器人很不耐煩。他們現在就想看到您的內容。借助 SSR,當機器人來敲門時,您的頁面就已準備就緒,無需等待 JavaScript 載入和渲染。
SSR 確保搜尋引擎看到的內容與使用者看到的內容相同。使用客戶端渲染時,始終存在機器人可能會錯過某些動態載入內容的風險。
搜尋引擎喜歡快速的網站。 SSR 可以顯著縮短初始載入時間,這可以讓您在排名中稍佔優勢。
const express = require('express'); const React = require('react'); const ReactDOMServer = require('react-dom/server'); const App = require('./App'); const app = express(); app.get('/', (req, res) => { const html = ReactDOMServer.renderToString(<App />); res.send(` <!DOCTYPE html> <html> <body> <div> <h2> From server to browser with fully rendered pages </h2> <p>When we talk about SSR delivering "fully rendered pages," it's important to understand what that actually means. Let's break it down:</p> <h3> What is a fully rendered page? </h3> <p>A fully rendered page is an HTML document containing all the content users would get when they first load the page. This includes:</p> <ol> <li>The complete DOM structure</li> <li>All text content</li> <li>Image placeholders and other media elements</li> <li>Initial styles</li> </ol> <p>Here's a basic example:<br> </p> <pre class="brush:php;toolbar:false"><!DOCTYPE html> <html> <head> <title>My SSR Page</title> <style> /* Initial styles */ </style> </head> <body> <header> <h1>Welcome to My Site</h1> <nav><!-- Fully populated navigation --></nav> </header> <main> <article> <h2>Article Title</h2> <p>This is the full content of the article...</p> </article> </main> <footer><!-- Fully populated footer --></footer> <script src="hydration.js"></script> </body> </html>
借助 Google 的行動優先索引,SSR 在較慢的行動連線上的效能優勢變得更加重要。
雖然嚴格來說不是搜尋引擎功能,但當您的內容在社群平台上分享時,SSR 可以更輕鬆地產生準確的預覽。這可以透過增加參與度和反向連結來間接提高您的搜尋引擎優化 (SEO)。
<!DOCTYPE html> <html> <head> <title>My CSR Page</title> </head> <body> <div> <p>The CSR page relies entirely on JavaScript to populate the content.</p> <h3> Benefits of fully rendered HTML </h3> <ol> <li> <strong>Faster Initial Paint</strong>: The browser can start rendering content immediately.</li> <li> <strong>Better SEO</strong>: Search engines read all your content without executing JavaScript.</li> <li> <strong>Improved Accessibility</strong>: Screen readers and other assistive technologies can access content immediately.</li> <li> <strong>Resilience</strong>: Basic content is available even if JavaScript fails to load.</li> </ol> <h3> The hydration process </h3> <p>After sending the fully rendered HTML, SSR applications typically go through a process called hydration:</p> <ol> <li>The server sends the fully rendered HTML.</li> <li>The browser displays this HTML immediately.</li> <li>JavaScript loads and <em>hydrates</em> the page, adding interactivity.</li> </ol> <pre class="brush:php;toolbar:false">// Simplified React hydration example import { hydrateRoot } from 'react-dom/client'; import App from './App'; const domNode = document.getElementById('root'); hydrateRoot(domNode, <App />);
SSR 是 SEO 的強大工具,但它不是唯一的因素。內容品質、相關性和整體用戶體驗對於搜尋引擎排名至關重要。 SSR 只是確保搜尋引擎可以有效地抓取和索引您的內容,從而有可能為您提供可見性和效能指標方面的優勢。
實作 SSR 不一定很複雜。讓我們來介紹如何使用 Next.js 來實現這一點,Next.js 是一個流行的 React 框架,可以讓 SSR 變得簡單:
這是一個使用 App Router 的簡單 Next.js 範例:
// Pseudo-code for search engine ranking function calculateRanking(site) { let score = site.relevance; if (site.loadTime < FAST_THRESHOLD) { score += SPEED_BONUS; } return score; }
在此範例中:
Next.js 自動處理 SSR 流程:
這種方法為您提供了 SSR 的優勢,而無需手動設定伺服器或自行管理渲染過程。
如果您不想重新發明輪子,有幾個框架可以為您處理 SSR 複雜性。以下是不同生態系中流行選項的概述:
每個框架都提供了自己的 SSR 方法,通常還具有靜態站點生成、API 路由等附加功能。選擇取決於您的首選語言、生態系統和特定專案要求。
部署 SSR 應用程式時:
這是基本的部署流程:
不要忘記快取!快取伺服器渲染的頁面可以顯著減少伺服器負載。
Builder.io 為所有元件和框架的伺服器端渲染 (SSR) 和靜態網站產生 (SSG) 提供支援。這種開箱即用的功能使您無需額外設定即可利用 SSR 和 SSG 的優勢。
以下是如何使用 Builder 和 Next.js 在伺服器端取得和渲染內容的基本範例:
const express = require('express'); const React = require('react'); const ReactDOMServer = require('react-dom/server'); const App = require('./App'); const app = express(); app.get('/', (req, res) => { const html = ReactDOMServer.renderToString(<App />); res.send(` <!DOCTYPE html> <html> <body> <div> <h2> From server to browser with fully rendered pages </h2> <p>When we talk about SSR delivering "fully rendered pages," it's important to understand what that actually means. Let's break it down:</p> <h3> What is a fully rendered page? </h3> <p>A fully rendered page is an HTML document containing all the content users would get when they first load the page. This includes:</p> <ol> <li>The complete DOM structure</li> <li>All text content</li> <li>Image placeholders and other media elements</li> <li>Initial styles</li> </ol> <p>Here's a basic example:<br> </p> <pre class="brush:php;toolbar:false"><!DOCTYPE html> <html> <head> <title>My SSR Page</title> <style> /* Initial styles */ </style> </head> <body> <header> <h1>Welcome to My Site</h1> <nav><!-- Fully populated navigation --></nav> </header> <main> <article> <h2>Article Title</h2> <p>This is the full content of the article...</p> </article> </main> <footer><!-- Fully populated footer --></footer> <script src="hydration.js"></script> </body> </html>
透過利用 Builder for SSR,您可以將無頭 CMS 的靈活性與伺服器端渲染的效能優勢結合起來,同時保持易於使用的視覺化編輯體驗。
伺服器端渲染 (SSR) 是 Web 開發中的強大方法,可顯著增強應用程式的效能、SEO 和使用者體驗。在本文中,我們探討了 SSR 是什麼、它與客戶端渲染有何不同、它對搜尋引擎的影響以及使用 Next.js 等流行框架的實際實施策略。
我們也討論了完全渲染頁面的概念,並檢查了不同生態系統中的各種 SSR 解決方案。雖然 SSR 提供了許多好處,但在決定是否實施它時,考慮專案的具體需求非常重要。
問:SSR 如何影響我的開發工作流程?
答:SSR 會讓開發變得更複雜,因為你需要同時考慮伺服器和客戶端環境。您可能需要調整建置流程並對特定於瀏覽器的 API 保持謹慎。
問:SSR 如何影響我網站的互動時間 (TTI)
答:雖然 SSR 可以提高初始內容的可見性,但它可能會稍微延遲 TTI,因為瀏覽器需要在收到初始 HTML 後載入並混合 JavaScript。
問:SSR 是否有特定的安全注意事項?
答:是的,使用 SSR,您需要更小心地暴露伺服器端的敏感資料或 API。始終清理使用者輸入並謹慎對待初始渲染中包含的資料。
問:SSR 如何處理身分驗證和個人化內容?
A:SSR 可以與身分驗證搭配使用,但需要小心處理。您可能需要實施 JWT 令牌或伺服器端會話等技術來管理經過驗證的 SSR 請求。
以上是伺服器端渲染指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!