>_tech-draft
Vercelのアイコン
Vercel
動画公開日
タイトル

Build. Scale. Teach: Architecting and Scaling a Production-Ready Modern Course Platform with Next.js

再生時間

25分 31秒

Next.jsとRSCで実現!一人で開発・運用するスケーラブルな学習プラットフォーム

ポイント

  • Next.jsとRSCを活用し、一人で開発・運用するスケーラブルでインタラクティブな学習プラットフォームの構築戦略とアーキテクチャを解説します。
  • サーバファースト・キャッシュファーストの原則に基づき、React Server ComponentsやNext.js App Routerでいかにパフォーマンスを最大化したかを詳細に紹介します。
  • レイアウトをデータの境界とする最適化やCore Web Vitalsを「北極星」とする開発戦略から、コンテンツリッチなプラットフォーム開発の知見が得られます。

はじめに:一人で開発・運用するスケーラブルな学習プラットフォーム

こんにちは、テクニカルライターのAnkitaです。本日は、Next.jsを活用し、一人で開発したプロダクションレディなモダンコースプラットフォームのアーキテクチャとスケーリングについてご紹介します。本格的なプラットフォームをスケーリングするために下したアーキテクチャ選択、開発途中の間違い、そしてパフォーマンス向上の秘訣を共有します。これらの学びは、コンテンツ豊富なあらゆるプラットフォーム開発に応用できるでしょう。

なぜカスタム学習プラットフォームが必要だったのか?

既存の学習プラットフォームは開発者のニーズに合致していませんでした。私たちは「見る」より「構築する」ことで最もよく学びます。体験し、実験し、壊し、即座に結果を確認できる環境が不可欠です。ビデオを見るだけではコードに触れる機会が少ないと感じていました。

私の目標は明確です。

  • 開発者のためのプラットフォーム構築:インタラクティブなレッスンとライブプロジェクトの提供。
  • 実践的な学習体験の提供:生徒が「構築し、実行する」ことで学ぶ。
  • 学習の楽しさと定着率の向上:ゲーミフィケーション機能を導入。

これらの目標実現のため、カスタムプラットフォーム構築が不可欠でした。

プラットフォームを支えるモダンな技術スタック

このプラットフォームの技術スタックは、Next.jsのモダンな機能と信頼性の高いツールを組み合わせています。

フロントエンドと基盤

  • Next.js: プラットフォームの基盤であり、フルスタック機能を提供。
  • React: Next.jsの土台で、インタラクティブなUIを実現。
  • TypeScript: 大規模アプリケーションの安全性と信頼性を確保。

バックエンドとデータ管理

  • Neon DB: サーバレスでスケーラブルなPostgreSQLデータベース。どこからでも瞬時に接続可能。
  • Zod: データベース送信前に全てのリクエスト、スキーマ、フォームを検証。未保存データや予期せぬエラーを防止します。

コンテンツとインタラクティブ性

  • MDX: 全てのレッスンはMDXで記述。MarkdownとライブReactコンポーネントをブレンドし、生徒がレッスンと直接インタラクションできる環境を提供します。
  • StackBlitz: コーディング環境を瞬時に立ち上げ、レッスン内で直接コードを操作できる埋め込みコンポーネント。

UI/UXと運用

  • Tailwind CSS: 効率的なスタイリング。
  • Shadcn UI: 強固なコンポーネント基盤を提供し、プラットフォームをモダンかつアクセスしやすく維持。CSSを軽量で一貫性のあるものに。
  • Sentry: アプリケーションの状況を正確に把握するためのロギングサービス。
  • Vercel: グローバルな学習者に最適なデプロイメントとエッジパフォーマンスを提供。

パフォーマンスを「北極星」とする開発戦略

パフォーマンスは開発のあらゆる選択を形作る「北極星」であり、ユーザーとの信頼構築にも不可欠でした。以下の主要なWeb Vitalsを重視しました。

  • 累積レイアウトシフト (CLS): レイアウト読み込み時の安定性。
  • 最大コンテンツの描画 (LCP): メインコンテンツの表示速度。
  • 次の描画へのインタラクション (INP): ユーザーインタラクション後のUI反応速度。
  • 最初のバイトまでの時間 (TTFB): サービス応答開始までの時間。

これらの指標に焦点を当てることで、ユーザー体験とパフォーマンスの継続的な最適化を図りました。

サーバーファースト・キャッシュファーストのアーキテクチャ

パフォーマンスを最優先する中、アーキテクチャ設計は極めて重要でした。私のプラットフォームは「サーバーファースト」と「キャッシュファースト」を原則として構築されています。

React Server Components (RSC) と Server Actions の活用

  • React Server Components (RSC): データをソースに近い場所でフェッチし、読み取り処理をシームレス化。クライアントサイドJavaScriptを劇的に削減し、INPを大幅に向上させ、ローディングスピナーを不要にしました。
  • Server Actions: 全てのデータ変更(ミューテーション)を安全に処理。セキュリティを確保し、クライアントサイドの負担を軽減します。

Next.js App Router とデータ管理の原則

  • Next.js App Router: レイアウトとルートの整理に活用。
  • シンプルなモデル: サーバーファースト、キャッシュファーストを徹底。膨大なコンテンツにもかかわらず、状態管理ライブラリは不使用。データはサーバー上に存在し、クライアントサイドJavaScriptは必要な場合のみ使用。
  • パフォーマンス最適化: サーバー上で直接レンダリングし、データに近い場所で処理することで瞬時応答を実現。キャッシュを活用してデータを再利用し、必要な場合にのみハイドレーションを行うことで、「スマートなキャッシュと軽量なハイドレーション」を実現。最小限のJavaScriptで最大限のパフォーマンスを発揮します。

MDXとReactによるインタラクティブな学習体験

プラットフォームはインタラクティブ性を重視しました。静的なレッスンだけでなく、ユーザーが直接操作できる部分を設けるためです。

  • MDXとReactの融合: MDXとReactを組み合わせることで、インタラクティブな学習体験とReactコンポーネントの提供を実現。一つのMDXファイル内でコンセプト説明、ライブコード表示、即時実験が可能です。
  • 大規模コンテンツへの対応: 現在450ものレッスン(MDXファイル)があり、それぞれプリレンダリング、キャッシュ、インテリジェントにストリーミングされます。この規模では、パフォーマンスはプロダクトの一部であり、決して後回しにできません。

レイアウト最適化による劇的なパフォーマンス改善

プラットフォームは複数のデータ量の多い部分(カリキュラム、レッスンヘッダー、コンテンツ、進捗など)に分かれていました。

初期の問題点と解決策

各コンポーネントが個別にデータをフェッチしていたため、ネットワークコールが冗長になり、TTFBが増加。これを解決するため、「重いデータはレイアウトに移動する」戦略を採用しました。共有データをレイアウトファイル内で事前にロードするように変更。この変更により、レイアウトがマウントされたままでページが変更されるため、TTFBが劇的に改善されました。

レイアウトの再定義:「データの境界」として

レイアウトは単なる視覚的なラッパーではなく、「データの境界」でもあります。ナビゲーション、ユーザー進捗、アナリティクスなどの共有データをロードし、ルート間で安定させることができます。例えば、カリキュラム、コース進捗、学習進捗データはレイアウトに移動されました。このアーキテクチャ変更だけで、新しいライブラリ不要でナビゲーションが即座に予測可能になり、UXが変革されました。レイアウトを「永続的なデータシェル」として扱い、アプリケーションの基盤と見なすべきです。

この最適化は、Core Web VitalsであるCLS、LCP、TTFBを改善し、サーバーサイドはキャッシュ分離により高速に応答するようになりました。

まとめ:アーキテクチャがパフォーマンスを決定する

このプラットフォーム開発で最も重要な学びは、アーキテクチャの選択がアプリケーションのパフォーマンスを直接形作るという点です。Next.jsのRSCやApp Router、レイアウトをデータの境界として活用する戦略により、一人での開発・運用ながらも、高性能でスケーラブル、かつインタラクティブな学習プラットフォームを実現できました。これらの学びが、皆さんのコンテンツリッチなプラットフォーム開発の一助となれば幸いです。


参考動画: https://www.youtube.com/watch?v=Ho22f7h0ZCo