続々 サーバーサイドレンダリングについて、改めて勉強し直してみる
少しずつ理解が深まってきたので、備忘録がてら。
この記事を読む前に、この記事を読まれることをおすすめします、めちゃくちゃわかりやすく書かれています。
その上で、補足を書いていこうと思います。
そもそもサーバサイドレンダリングってなによ
上記の記事では、「SSR と CSR」の手法に対して、以下のような説明となっています。
リクエスト時にサーバ側で最低限(ファーストビューや SEO 用の部分)レンダリングし、それ以降をクライアント側でレンダリングする(SSR と CSR)
なので、以前書いた記事のような描画が行われるわけですね。
サーバサイドレンダリング(以下 SSR)とは、あくまでファーストビューを高速化する目的や、Twitter や Facebook などの SEO 対策として行うに過ぎないというイメージです。
ファーストビューが表示された後、componentDidMount が呼ばれるときには、既にクライアントサイドレンダリング(以下 CSR)に切り替わっているということですね。
SSR を実装するにあたって、シングルページアプリケーション(以下 SPA)か否かということは関係がないです。
が、ほとんどのケースで SPA が採用されるのでは?と思っています。
じゃあプリレンダリング(以下、Pre-rendering)ってなんだよ
文字通り、事前にレンダリングを行っておく手法となります。
事前にレンダリングを行わない場合、render(または hydrate)のターゲットエレメントの子要素は空となります。
なので、build された html ファイルをのぞいてみると、以下のような状態となっています。
<!doctype html>
<html lang="en">
<head>
...
</head>
<body>
...
<div id="root"></div>
...
</body>
</html>
対して、Pre-rendering を行った場合は、以下のような状態になります。
<!doctype html>
<html lang="en">
<head>
...
</head>
<body>
...
<div id="root">hoge</div>
...
</body>
</html>
従って、上のケースでは以下のようなフローが取られます。
なにも表示されない
→ スクリプトが実行される
→ DOM が<div id="root"></div>
に差し込まれる
→ 表示される
対して、下のケースでは、
hoge が表示される
→ スクリプトが実行される
→ DOM が<div id="root"></div>
に差し込まれる
→ 差分が更新される
となります。
なので、Pre-rendering では以下のメリットが得られます。
- ファーストビューの表示が早い
- url のパスが静的に生成されるページについては、Twitter や Facebook などの SEO 対策が可能
その一方で、以下のようなデメリットが生じる可能性があります。
- ページ数が多いサービスであったり、複雑な処理が組まれているサービスの場合、build に時間がかかる
- url のパスが動的に生成されるページについては、Twitter や Facebook などの SEO 対策ができない
このサイトにさらに詳しいことがわかりやすく書かれています。
じゃあ static なサイトってなんだよ
Pre-rendering が行われたサイトは、static なサイトとなります。
render(または hydrate)のターゲットエレメントの子要素が空でない開発自体は、結構レガシーな印象があります。
url のパスごとに初期表示が異なる以上、パスごとに html ファイルを切る必要が出てくるので、SPA の考え方からすると、一周回ってきた感じを受けます。
SPA ってどういう扱いなんだよ
CSR にせよ SSR にせよ Pre-rendering にせよ、SPA 自体は動いているケースが多いのかなーと。
CSR の場合はファーストビューの時点から、Pre-rendering についてはファーストビュー以降、SSR についてはケースバイケースなのかなと。
いずれのケースにせよ、code-splitting は求められてくるのかなーと。
結局、CSR と SSR、Pre-rendering はどう扱えば良いんだ
個人的には、以下のような感じです。
CSR
- Twitter や Facebook において、url のパスごとの SEO が対策できない
- 楽して開発できる
- サーバにあまり負荷がかからない
Pre-rendering
- Twitter や Facebook において、url の静的なパスごとの SEO が対策可能
- 楽して開発できる(create-react-app の場合、単に react-snap を導入するだけで対応できる)
- サーバにあまり負荷がかからない
SSR
- Twitter や Facebook において、url のパスごとの SEO が対策可能
- 開発難度は高い
- サーバに結構な負荷がかかる
みたいな感じです。
最近自分の周りで妙に SSR で流行っていて、Nextjs などを安易に導入している現場が目につくなぁと思い、改めて SSR のメリットデメリットをがっつり調べてみました。
個人的な考えとしては、SSR って選択肢としては、さほど上位には来ないよなぁ…って感じです。
SEO 周りについてはしょうがないケースもあると思いますが、ファーストビューの考慮って意味では、Pre-rendering で十分でしょって思うことが多いです。
React を扱う上では、やはりまずは create-react-app で開発を行うことが大事なのかなーと思っています。
React を使用した正しい開発手法を学んだ上で、Nextjs であったり Gatsby であったりに進むべきではないかなと。