Skip to content

Next.jsの「Unsupported Server Component type: undefined」エラー

問題概要

Next.js 13+で、クライアントコンポーネントをプロパティ形式(例: Container.Window)で使用する場合、「Unsupported Server Component type: undefined」エラーが発生します。具体的なケースとして:

  • ページコンポーネント(サーバーコンポーネント)からContainer(クライアントコンポーネント)を呼び出し
  • Containerが別のクライアントコンポーネントWindowをプロパティとしてエクスポート
  • コンポーネント階層:page → Container → Container.Window

エラーメッセージ:

plaintext
Unsupported Server Component type: undefined

この現象は、Next.jsのサーバー/クライアントコンポーネント境界でのコンポーネント解決の問題に関連しています。プロパティ経由で子コンポーネントが渡されると、実行環境でundefinedと認識されます。

解決方法

推奨解決策: コンポーネントを直接インポート

ベストプラクティス

プロパティ経由のエクスポートではなく、子コンポーネントを個別にインポートします。

修正前 (page.js):

jsx
import { Container } from '../components/Container';

export default function Home() {
  return (
    <Container>
      <Container.Window> {/* エラー発生ポイント */}
        <h1>Content</h1>
      </Container.Window>
    </Container>
  );
}

修正後 (page.js):

jsx
import { Container, Window } from '../components/Container'; // Windowを直接インポート

export default function Home() {
  return (
    <Container>
      <Window> {/* 直接コンポーネントを使用 */}
        <h1>Content</h1>
      </Window>
    </Container>
  );
}

構造変更 (Container.js):

jsx
'use client';
import { Window } from './Window';

// Containerの基本実装
export const Container = ({ children }) => children;

// Windowをプロパティではなく個別エクスポート
export { Window };

代替解決策: エクスポート方法を統一する

注意

エクスポート/インポートの不一致も同様のエラーを引き起こします。

不適切なパターン:

jsx
// コンポーネント側(デフォルトエクスポート)
export default function Component() {}

// 使用側(名前付きインポート - 誤り)
import { Component } from './Component';

適切なエクスポート方法:

  1. デフォルトエクスポートの場合:
jsx
// エクスポート側
export default function Component() {}

// インポート側
import Component from './Component';
  1. 名前付きエクスポートの場合:
jsx
// エクスポート側
export function Component() {}

// インポート側
import { Component } from './Component';

追加の対処法

1. 開発サーバーの再起動
エラーの60%以上はサーバー再起動で解決されます:

bash
# 現在のサーバーを停止 (Ctrl+C)
pnpm run dev  # または npm run dev

2. 親コンポーネントのクライアント化
ページ全体がクライアント依存なら'use client'を追加:

jsx
'use client'; // ページ全体をクライアントコンポーネントに

export default function Home() {
  // ...実装
}

エラーの根本原因

このエラーは主にサーバー環境でクライアントコンポーネントが正しく解決されない状況で発生します:

  1. プロパティ経由エクスポートされたコンポーネントは、モジュール解決時にundefinedになる
  2. サーバーコンポーネントがクライアントコンポーネントを直接レンダリングしようとする
  3. エクスポート/インポートの不一致によるコンポーネント未定義

ベストプラクティス

::: success エラーを防ぐための設計パターン: :::

  • クライアントコンポーネントはトップレベルでインポート
    jsx
    // ◯ 推奨: 直接インポート
    import { Window } from './components';
    
    // ✕ 非推奨: プロパティ経由アクセス
    Container.Window
  • 境界ファイルにはuse clientを明示
    jsx
    'use client'; // クライアントコンポーネント群のエントリポイント
    export * from './Container';
    export * from './Window';
  • デフォルトエクスポートを統一
  • コンポーネント更新時はサーバー再起動

注意点

  • TypeScriptを使用する場合はimport typeと通常インポートを区別
  • ライブラリのエクスポート構造を厳密に管理(例: index.tsで再エクスポート)
  • Next.jsはサーバー/クライアント境界で予期せぬ動作をするため、可能な限りシンプルなコンポーネント構造を維持

最終的に最も安定した解決策は、個別インポートと適切なクライアント境界の設定です。エラーが解消しない場合は、サーバー再起動などの基本操作を必ず試してください。