Closed kei615ykhm closed 2 months ago
おもしろい案かもしれませんが、少し状況を見直してみましょうか。
それに対して、ISR
とRSC
は比較的新しく難しい技術になります。基本的な概念を理解するのであればSSR
とSSG
のほうが最適かもしれません。開発期間も4~5か月しかないのであれば、基礎を押さえることに注力すべきでしょう。あと、ISR
ではデータベースへのアクセスが増えてしまいますし、SSR
は必要な時だけアクセスするので無料枠で運用する今回のケースに適してる思います。
これらを踏まえて、以下のようにするのはどうでしょうか?
ダッシュボード: SSR + Parallel Routes
メモページ(個別のメモ): SSG
メモ作成フォーム: SSR
現在の開発状況と、学習曲線、ニーズに合わせるのであれば、「リアルタイムでメモを更新する」というのは外部メモアプリのAPIを使用することになるので未来の話です。今は「思いついたらすぐにメモ」が主な使い方だと思うのでSSR+SSGで十分じゃないでしょうか。
将来的なことを考えてISR
を選びたいのなら、必要になったときにSSR
から移行すれば良いです。
@niaka3dayo この提案は、いかがでしょうか?
まず、ISR
とRSC
は一緒に使うものです。
ISR
とRSC
どちらを使うかという考えは根本的に間違っていて、SSR
も、ISR
もRSC
をどのように扱うかという描画の方法のことです。
おそらく、あなたがRSCとISRを同列のものだと勘違いしてAIに質問したことでハルシネーションが起きていると推測します。
Next.js
では、要件や目的に応じて、SSR
,ISR
,SSG
,CSR
のどれを使うかをRSC
ごとに選択していきます。
SSGは、ビルドする時にそのビルドの過程でサーバーからデータをフェッチし、そのあとは一切データが変わりません。 つまり、データベースにメモのデータがあったとして、それを更新したり、追加しても、再度ビルドするまでは一切更新が反映されません。
SSRは、アクセスされるたびにサーバー側でフェッチを走らせ、最新の情報を取得します。SSGに比べると当然、サーバーがフェッチしている間のロードが発生するため、キャッシュ戦略や、初回フェッチしている間ユーザーに何を見せるかも重要です。フェッチに時間がかかれば画面が止まって見えます。
ISRは、SSGとSSRの合体技みたいなものです。指定した秒数以上アクセスがなかったら、SSGしなおして、また指定した秒数以内であれば更新せずに前のデータを返します。ユーザーからのアクセスに間が空いている場合、定期的にSSGするようなものです。
ここまでのデータフェッチ方法は全てサーバーにフェッチさせるものでした。 CSRは、アクセスがあった時にブラウザ側(クライアントサイド)でデータフェッチを行い、フェッチが終わったら状態を更新して再描画することで常に最新のデータを表示するものです。
個人的には、ログインして使うようなアプリでSEOを加味しない場合は全てCSRでいいと思います。 どうしてもサーバーコンポーネントで処理させたいならSSRでしょう。メモアプリは、たとえばPCでしたメモがすぐにケータイで見たとき反映されてないというのはだいぶ困ると思うので、情報の信頼性(最新かどうか)は重視するべき点と考えます。
なので、確実に最新の情報をもってくるCSRが最初に選択肢に上がり、時点でSSRが選択肢に上がるかなと思います。 SSGを選択する場合は、更新のたびにWebhookなどをたたいてビルドをし直す仕組みが必要となります。 メモに表示に時間がかかるような膨大なデータを単体ごとに使うことは考えにくいので、私ならSSGは真っ先に選択肢から除外します。 ISRも同様で、たとえば3分ごとに時間を設定したとして、3分前のデータが表示される可能性がある以上、メモアプリの仕様としては欠陥になると思います。
データベースのアクセス数を気にするのはそのアプリを使うユーザーが何人の想定かによっても変わると思いますが、個人用のメモアプリでデータベースのパフォーマンスが落ちるほどアクセスが集中するとも考えにくいです。
SSGを選択した場合にはメモが更新されるたびにサーバーでビルドを走らせなきゃならないので、その場合はデータベースのアクセス回数は減ってますがサーバー自体のコストは増えてますよね。
データベースへのアクセス回数を減らしつつ最新の情報を取得したいのであれば、CSRで行いつつ、ブラウザ側でのキャッシュ戦略を練るのが最善と考えますがいかがですか?
上記コメントを加味した上での設計の修正案です。
キャッシュ: SWRなどを使ったキャッシュを使用
メモの一覧を表示するページ。 確実に最新のメモ一覧を見せることができるよう作成。 ペジネーションにも対応させる。 ログアウトボタン・ページ遷移メニューなども。
キャッシュ: SWRなどを使ったキャッシュを使用
単体の最新メモを閲覧する機能をもつページ。 ユーザー体験を考えれば、確認するだけでればモーダル(ダイアログ)で作り、ページ遷移はさせないことも検討余地あり。
フォーム自体に更新機能まで持たせる場合はCSRでデータをフェッチする。 しかしながらフォーム自体の形は毎回同じなので基本的にフォーム本体はSSGで描画される。
@niaka3dayo 詳しく教えていただき、ありがとうございます。
お返事が遅れてしまい申し訳ございません。ご指摘いただいた通り、AI
によるハルシネーションを起こしている部分の訂正と不足している知識を補完してきました。
そして今度は、ご提案いただいた「CSR
とSWR
を用いたクライアントサイドでのキャッシュ戦略」について、私からも再提案・意見交換させていただきたいと思います。
議題が変わりますので、こちらのissue
はクローズしますね。 issue: #7 にて、改めてアサインいたします。
概要
アプリケーションのコア機能の実装方法について、
ISR(Incremental Static Regeneration)
とRSC(React Server Components)
のどちらを採用するか検討中です。両者にはそれぞれ特徴があり、判断に迷っています。各ルーティング設定のメリット
ISRのメリット:
CDN
キャッシュを活用でき、グローバルな配信に強いRSCのメリット:
JavaScript
をクライアントに送信できるAPI
キーなどの秘密情報を守りやすいこのアプリケーションの特性
Supabase
の無料枠内での運用を予定開発環境と技術的考慮事項
ISR
、RSC
ともに実践経験なしNext.js14
の安定版App Router
やParallel Routes
など、新しい技術の学習が必要Supabase Authentication
を使用し、zodと
react-hook-form`で堅牢なログインフォームを実装予定udemy
で学んだことを土台に少しアレンジを入れる程度検討事項
ISR
とRSC
のどちらがより適していると思われますか?提案
現状を踏まえ、ハイブリッドアプローチを提案します:
ISRの活用:
RSCの活用:
このアプローチのメリット
ただし、学習コストを考慮すると、最初は
ISR
を中心に実装し、徐々にRSC
を導入していく方法も検討しています。