サーバーサイド レンダリング (SSR) はしばらく前から存在していますが、さらに検討する価値があります。このテクニックを使用すると、Web アプリを高速化し、SEO に適したものにすることができます。
このガイドでは、SSR について説明し、SSR を使用する理由、髪を抜かずに SSR を実装する方法について説明します。基本を説明し、クライアント側のレンダリングと比較し、いくつかの実用的な例について説明します。
基本的に、SSR はブラウザではなくサーバー上で Web ページをレンダリングすることを目的としています。ユーザーがページをリクエストすると、サーバーは面倒な作業をすべて実行し、完全にレンダリングされたページをクライアントに送信します。その後、クライアント側の 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) は、Web ページをレンダリングする 2 つの異なるアプローチです。それらの主な違いの内訳は次のとおりです:
長所:
短所:
長所:
短所:
簡単な視覚的な比較は次のとおりです:
本質的に、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 の実装は複雑である必要はありません。 SSR を簡単にする人気のある React フレームワークである Next.js を使用してこれを行う方法を説明しましょう:
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) は、アプリケーションのパフォーマンス、SEO、ユーザー エクスペリエンスを大幅に向上できる Web 開発における強力なアプローチです。この記事では、SSR とは何か、クライアント側レンダリングとの違い、検索エンジンへの影響、Next.js などの一般的なフレームワークを使用した実際的な実装戦略について検討してきました。
また、完全にレンダリングされたページの概念について説明し、さまざまなエコシステムにわたるさまざまな SSR ソリューションを検討しました。 SSR には多くの利点がありますが、実装するかどうかを決定する際には、プロジェクト固有のニーズを考慮することが重要です。
Q: SSR は開発ワークフローにどのような影響を与えますか?
A: SSR はサーバー環境とクライアント環境の両方を考慮する必要があるため、開発がより複雑になる可能性があります。場合によっては、ビルド プロセスを調整し、ブラウザ固有の API に注意する必要があります。
Q: SSR はサイトのインタラクティブ時間 (TTI) にどのような影響を与えますか
A: SSR は初期コンテンツの可視性を向上させることができますが、ブラウザーは最初の HTML を受信した後に JavaScript をロードしてハイドレートする必要があるため、TTI がわずかに遅れる可能性があります。
Q: SSR に特有のセキュリティ上の考慮事項はありますか?
A: はい、SSR では、サーバー側で機密データや API を公開することにさらに注意する必要があります。ユーザー入力は常にサニタイズし、最初のレンダリングにどのようなデータを含めるかに注意してください。
Q: SSR は認証やパーソナライズされたコンテンツとどのように連携しますか?
A: SSR は認証を使用できますが、慎重な取り扱いが必要です。認証された SSR リクエストを管理するには、JWT トークンやサーバー側セッションなどの手法を実装する必要がある場合があります。
以上がサーバーサイドレンダリングのガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。