SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ExpoとEASで始める快適モバイルアプリ開発

Expo Routerのレイアウトの仕組みを理解し、より実践的なナビゲーションを構築しよう

ExpoとEASで始める快適モバイルアプリ開発 第6回

  • X ポスト
  • このエントリーをはてなブックマークに追加

ファイルベースルーティングの命名規則

 Expo Routerの強力な機能の多くは、appディレクトリ内のファイルやフォルダの命名規則に基づいています。本題であるレイアウトの仕組みを理解する上で、これらの命名規則(ファイル記法)を把握しておくことが重要です。ここでは主要なものをいくつか紹介します。詳細については、公式ドキュメントのExpo Router notationも参照してください。

静的ルート (Static Routes)

 特別な記号を含まないファイル名やディレクトリ名は、そのままURLのパスに対応します。例えば app/home.js/homeというURLでアクセスできます。

動的セグメント (Dynamic Segments)

 ファイル名やディレクトリ名に角括弧[]を使用すると、その部分が動的なパラメータになります。

 app/users/[id].jsは、/users/1/users/nakagawaのようなURLにマッチします。idの部分はコンポーネント内でuseLocalSearchParamsフックを使って取得できます。

グループルート (Groups)

 ディレクトリ名を丸括弧()で囲むと、「グループルート」になります。これはURLのパス構造には影響を与えません。主な目的は、関連するルート群を整理したり、特定のルート群に共通のレイアウトを適用したりすることです。

  app/(tabs)/home.js/homeというURLでアクセスできます。(tabs)はURLに含まれませんが、このグループ内のルート群に対してタブベースのレイアウトを適用する、といった使い方ができます。

 同様にapp/(stack)/settings.js/settingsとなります。

デフォルトルート (index.js)

 index.jsファイルは、そのディレクトリのデフォルトルートとして機能します。例えば app/index.jsはアプリのルート/に対応します。

レイアウトルート (_layout.js)

 アンダースコアで始まる_layout.jsファイルは、特別な役割を持ちます。これはページコンポーネントではなく、同じディレクトリ内(またはそのサブディレクトリ)のルート群に対する共通の外枠、つまり「レイアウト」を定義するためのファイルです。例えば、ヘッダー、フッター、ナビゲーションバーなどをここに記述します。

 app/_layout.jsはアプリ全体のルートレイアウトを定義します。app/(tabs)/_layout.js(tabs)グループ内のルート群(タブ画面)のレイアウトを定義します。

 この_layout.jsこそが、本記事のメイントピックです。次のセクションで詳しく解説します。

特殊ファイル (+ 記号)

 ファイル名の先頭にプラス記号 + が付くものは、Expo Routerによって特別な意味を持つファイルとして扱われることがあります。

 これらのファイル記法を組み合わせることで、複雑なナビゲーション構造も宣言的かつ直感的に構築できます。特に「グループルート」と「レイアウトルート (_layout.js)」の概念は、この後の解説を理解する上で鍵となります。

レイアウトルートの役割と振る舞い

 ファイル記法のセクションで触れたように、_layout.jsファイルはExpo Routerにおけるレイアウトを表現するためのものです。このファイルを用いることで、特定のディレクトリ(セグメント)とその配下のすべての画面(ルート)に対し、共通のUIコンポーネント、ナビゲーション構造、その他のロジックを一元的に提供できます。

 レイアウトコンポーネントの最も基本的な機能は、子となる画面コンポーネントを描画することです。これは expo-routerからインポート可能なSlotコンポーネントを使用して実現します。<Slot />は、現在アクティブな子ルートのコンテンツに置き換わるプレースホルダーとして機能します。_layout.jsが何も返さないか、Slotをレンダリングしない場合、その子ルートは表示されません(図3)。

図3:Slotは画面遷移のプレースホルダー
図3:Slotは画面遷移のプレースホルダー

 _layout.jsが具体的にどんな場面で役立つのか、主要な使用例を見ていきましょう。

アプリ全体の共通レイアウト (app/_layout.js)

 最も基本的かつ広範囲に影響するのが、appディレクトリ直下に配置するapp/_layout.jsです。

 これはアプリケーション全体のグローバルなレイアウトを定義し、すべての画面に適用されます。レイアウトの定義がない場合はapp/index.jsが最初に読み込まれますが、app/_layout.jsが存在する場合はこちらが優先され、アプリのエントリーポイントとなります。

 そのため、主な用途として以下が挙げられます。

  • アプリケーション全体に共通のテーマ(例: React Contextを用いたダークモード対応など)を適用する。
  • カスタムフォントを読み込み、アプリ全体で利用できるようにする。
  • プッシュ通知の受信設定や初期化処理を行う。
  • ユーザーの認証状態を監視し、状態に応じて表示する画面群(例: ログインユーザー向け画面とゲスト向け画面)を動的に切り替えるナビゲーションロジックを実装する。

 最もシンプルなapp/_layout.jsは、単にSlotコンポーネントを返すだけの構成です(リスト1)。

[リスト1]app/_layout.js
import { Slot } from 'expo-router';

export default function RootLayout() {
  // アプリ全体に適用したい初期化処理などはここで行う
  return <Slot />;
}

 上記の例では、<Slot />コンポーネントを返却しているだけですが、この<Slot />部分が、app/index.jsapp/home.jsといった具体的な画面コンポーネントの描画結果に置き換えられます。もし<Slot />を別のViewコンポーネントや他のカスタムコンポーネントで囲むと、それが全画面共通のラッパー(親)コンポーネントとして機能します。

 例えば、全画面に共通の背景色や余白(パディング)を設定したい場合は、次のようにします。

[リスト2]app/_layout.js
import { Slot } from 'expo-router';
import { View, StyleSheet } from 'react-native';

export default function RootLayout() {
  return (
    <View style={styles.container}>
      <Slot />
    </View>
  );
}
// (略)

 このように、app/_layout.jsはアプリケーション全体のルック&フィールや、グローバルな初期化処理などを定義する上で非常に重要な役割を担います。開発者はこのファイルを活用することで、アプリ全体に一貫した体験を提供しやすくなります。

 以降に登場するレイアウトでは、ナビゲーションというコンポーネントを配置しますが、これらも内部的には「 <Slot />をどんなルールで切り替えるか」という処理を行っているだけであることを念頭に置いておくとよいでしょう。

次のページ
スタックナビゲーション

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
ExpoとEASで始める快適モバイルアプリ開発連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 中川幸哉(ナカガワユキヤ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/21710 2025/06/20 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング