{}const=>[]async()letfn</>var
開発Web

サーバーコンポーネント:フロントエンドの未来、それとも次の実験?

React Server Componentsを簡単な言葉で理解しましょう。それは何ですか?なぜ必要ですか?そして学ぶ価値はありますか?通常のコンポーネントと比較し、実際のコード例を分析し、これが本当にフロントエンドの未来であるか、それとも別のファッショントレンドであるかを確認します。

К

Kodik

著者

3分で読める

Reactの世界のニュースをフォローしているなら、コミュニティで激しい議論を引き起こしているテクノロジーであるServer Componentsについて聞いたことがあるはずです。フロントエンド開発の革命と呼ぶ人もいれば、不要な複雑さと呼ぶ人もいます。

サーバーコンポーネントとは何ですか?

サーバーコンポーネントは、サーバー上でのみレンダリングされ、ブラウザーに入らない新しいタイプのReactコンポーネントです。奇妙に聞こえますか?

簡単な例を見てみましょう。

// ServerComponent.js (サーバーコンポーネント)
async function BlogPost({ id }) {
  // このコードはサーバー上でのみ実行されます
  const post = await db.posts.findById(id);
  
  return (
    <article>
      <h1>{post.title}</h1>
      <p>{post.content}</p>
    </article>
  );
}

注意:コンポーネント内のデータベースに直接アクセスします!以前は、APIエンドポイントを作成し、フェッチリクエストを行い、ロード状態を処理する必要がありました。今では、これらすべてをコンポーネント内で直接実行できます。

🔥 10万人以上の学生が参加中

理論を読むのに疲れた?
コーディングの時間だ!

Kodik — 実践でプログラミングを学ぶアプリ。AIメンター、インタラクティブなレッスン、実際のプロジェクト。

🤖 AI 24時間
🎓 修了証
💰 無料
🚀 始める
今日参加

サーバーコンポーネントは通常のものとどう違うのですか?

違いを理解するために、3種類のコンポーネントを比較してみましょう。

1.クライアントコンポーネント

これらは、あなたが知っている通常のReactコンポーネントです。それらは:

  • ブラウザで実行中

  • フックを使用できます(useState、useEffectなど)

  • イベントを処理できます(onClick、onChange)

  • JavaScriptバンドルのサイズを大きくする

'use client'; // これはクライアントコンポーネントであることを明示します

function Counter() {
  const [count, setCount] = useState(0);
  
  return (
    <button onClick={() => setCount(count + 1)}>
      Clicked {count} times
    </button>
  );
}

2. サーバーコンポーネント

新しいタイプのコンポーネントは、

  • サーバーでのみレンダリングされます

  • JavaScriptバンドルに含まれない

  • データベースやファイルシステムと直接連携可能

  • 状態フックやブラウザAPIは使用できません

  • イベントを処理できません

// Next.js 13+では、すべてのコンポーネントがデフォルトでサーバー側です
async function UserProfile({ userId }) {
  // データベースへの直接アクセスはサーバーコードです!
  const user = await db.users.findById(userId);
  const posts = await db.posts.findByUser(userId);
  
  return (
    <div>
      <h2>{user.name}</h2>
      <p>{posts.length} постов</p>
    </div>
  );
}

3. Server-Side Rendering (SSR)

Server ComponentsとSSRを混同しないでください!これは別物です。

  • SSR — HTML をサーバー上でレンダリングしますが、すべての JavaScript は「ハイドレーション」のためにブラウザーにロードされます

  • Server Components — JavaScript をブラウザに送信せず、結果のみを送信します

なぜ必要なのですか?

問題1:膨大なJavaScriptバンドル

マークダウンの説明付きの製品リストを表示するとします。以前は、マークダウンを解析するためのライブラリをクライアントバンドルに含める必要がありました。

// 古いアプローチ — ブラウザにライブラリが表示されます
import { marked } from 'marked'; // ~50kb

function Product({ description }) {
  return <div dangerouslySetInnerHTML={{ __html: marked(description) }} />;
}

サーバーコンポーネントを使用すると、ライブラリはサーバー上に残ります。

// 新しいアプローチ — ライブラリはブラウザに入らない
import { marked } from 'marked';

async function Product({ productId }) {
  const product = await db.products.findById(productId);
  const html = marked(product.description);
  
  return <div dangerouslySetInnerHTML={{ __html: html }} />;
}

結果: ブラウザは余分な50kbのJavaScriptなしでHTMLを受け取ります!

問題2:リクエストの多さ

Reactアプリケーションの典型的な問題:

// 悪い:リクエストの滝
function Dashboard() {
  const { user } = useUser(); // 問い合わせ1
  if (!user) return <Loader />;
  
  return <UserPosts userId={user.id} />; // リクエスト2は、リクエスト1の後にのみ開始されます
}

サーバーコンポーネントでは、クエリはサーバー上で並行して実行されます。

async function Dashboard() {
  // 両方のリクエストが並行して実行されます!
  const [user, posts] = await Promise.all([
    db.users.getCurrent(),
    db.posts.getRecent()
  ]);
  
  return (
    <div>
      <UserInfo user={user} />
      <PostsList posts={posts} />
    </div>
  );
}

課題3:安全性

サーバーコンポーネントを使用すると、サーバーにシークレットを保存できます。

// 安全です。APIキーがブラウザに表示されることはありません
async function WeatherWidget({ city }) {
  const response = await fetch(
    `https://api.weather.com/data?key=${process.env.WEATHER_API_KEY}&city=${city}`
  );
  const data = await response.json();
  
  return <div>Температура: {data.temp}°C</div>;
}

実例:ブログプラットフォーム。

両方のタイプのコンポーネントを組み合わせた実際のアプリケーションを見てみましょう。

// app/posts/[id]/page.js - サーバーコンポーネント
async function PostPage({ params }) {
  // データはサーバーにアップロードされます
  const post = await db.posts.findById(params.id);
  const comments = await db.comments.findByPost(params.id);
  
  return (
    <article>
      <h1>{post.title}</h1>
      <PostContent content={post.content} />
      
      {/* Клиентский компонент для интерактивности */}
      <CommentForm postId={post.id} />
      
      {/* Серверный компонент для отображения */}
      <CommentsList comments={comments} />
    </article>
  );
}

// components/CommentForm.js - クライアントコンポーネント
'use client';

function CommentForm({ postId }) {
  const [text, setText] = useState('');
  
  const handleSubmit = async (e) => {
    e.preventDefault();
    await fetch('/api/comments', {
      method: 'POST',
      body: JSON.stringify({ postId, text })
    });
    setText('');
  };
  
  return (
    <form onSubmit={handleSubmit}>
      <textarea 
        value={text} 
        onChange={(e) => setText(e.target.value)}
      />
      <button type="submit">Отправить</button>
    </form>
  );
}

サーバーコンポーネントの利点

✅ ブラウザでのJavaScriptの使用を減らす

アプリケーションのインタラクティブな部分のみがブラウザにロードされます。残りはすべてサーバー上にあります。

✅サーバーリソースへの直接アクセス

データベース、ファイルシステム、内部APIなど、すべてのコンポーネントから直接アクセスできます。

✅ 最高のパフォーマンス

データはソースに近い場所で読み込まれます(サーバー→データベースはブラウザー→API→データベースよりも高速です)。

✅ 自動コード分割

コード分割について考える必要はありません。サーバーコンポーネントは自動的にバンドルに含まれることはありません。

✅ セキュリティの強化

APIキー、トークン、ビジネスプロセスのロジックはサーバー上に残ります。

欠点と難点

❌ 急な学習曲線

どのコンポーネントがどこで実行されているかを理解する必要があります。初心者はよく混乱します。

// ❌ エラー: Server Component は useState を使用できません
async function UserProfile() {
  const [isOpen, setIsOpen] = useState(false); // おっと!
  // ...
}

// ✅ 正解:インタラクティブ性をクライアントコンポーネントに移動します
async function UserProfile() {
  const user = await db.users.getCurrent();
  return <ProfileCard user={user} />; // プロフィールカードはクライアントのものである可能性があります
}

❌ 限られたエコシステム

現時点では、完全なサポートはNext.js 13+でのみ提供されています。他のフレームワークは、このテクノロジーを導入し始めたばかりです。

❌ デバッグの難しさ

コードの一部がサーバーで実行され、一部がブラウザで実行されると、デバッグがより複雑になります。

❌ サーバーへの負荷が大きくなる

各リクエストにはサーバー上でレンダリングが必要です。キャッシュとスケーリングを検討する必要があります。

サーバーコンポーネントを使用するタイミング

以下に最適です。

  • 動的コンテンツのページ — ブログ、ニュースフィード、商品カタログ

  • 大量のデータを持つダッシュボード — 分析、レポート、統計

  • SEOクリティカルページ — すべてのコンテンツはサーバー上でレンダリングされ、検索エンジンでアクセス可能

  • 重度の依存関係を持つアプリケーション — markdown、コードの強調表示、画像処理

以下には適していません。

  • 高度にインタラクティブなインターフェース — エディター、ゲーム、絵画

  • オフラインアプリケーション — サーバーなしで動作するPWA

  • リアルタイムアップデートのアプリケーション — チャット、共同編集

実験を始めるには?

Server Componentsを試す最も簡単な方法は、Next.js 13+で新しいプロジェクトを作成することです。

npx create-next-app@latest my-app
cd my-app
npm run dev

アプリルーターを備えたNext.js 13+では、すべてのコンポーネントはデフォルトでサーバー側です。コンポーネントをクライアント側にするには、ファイルの先頭に 'use client' を追加するだけです。

実用的なアドバイス。

1.サーバーコンポーネントから始める

本当に必要な場合(状態、イベント、ブラウザーAPI)にのみ、コンポーネントをクライアントにします。

2.「クライアント境界」を使用する

インタラクティブ性を個別の小さなコンポーネントに分割します。

// サーバーコンポーネント
async function ProductPage({ id }) {
  const product = await db.products.findById(id);
  
  return (
    <div>
      <h1>{product.name}</h1>
      <p>{product.description}</p>
      
      {/* Только кнопка клиентская */}
      <AddToCartButton productId={product.id} />
    </div>
  );
}

3. データをキャッシュする

Next.jsはfetchリクエストを自動的にキャッシュしますが、次のように制御できます。

// 1時間のキャッシュ
const data = await fetch('https://api.example.com/data', {
  next: { revalidate: 3600 }
});

学ぶべきですか?特にNext.jsを使用している場合、または使用する予定がある場合は、間違いなくそうです。しかし、優れた開発者は、新しいテクノロジーを使用するタイミングと、実績のあるソリューションに従うタイミングを知っていることを覚えておいてください。

サーバーコンポーネント、フック、パフォーマンス、アプリケーションアーキテクチャーなど、これらの多くを学ぶことができます。 コディケ!私たちは、基本的なものから高度な概念まで、テーマを詳細に分析し、実践的なタスクで知識を強化します。

💬 サポートが必要な場合やコードについて話し合いたい場合は、 2000人以上の志を同じくする人々 アクティブ Telegramチャンネル、お互いに助け合い、経験を共有し、最新のテクノロジーについて話し合う場所です!

コーディックに参加する — 効率的に学び、定期的に練習し、プロフェッショナルに成長しましょう! 🎯

Server Componentsの習得がうまくいくことを願っています!テクノロジーを理解する最良の方法は、実際に試すことであることを忘れないでください。小さなプロジェクトを作成して実験してみてください! 💻

🎯先延ばしをやめよう

記事は気に入った?
実践の時間だ!

Kodikでは読むだけでなく、すぐにコードを書く。理論 + 実践 = 本当のスキル。

即座に実践
🧠AIがコードを説明
🏆修了証

登録不要 • カード不要