SHOEISHA iD

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

CodeZine(コードジン) DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

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

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

ExpoのWeb向けビルド機能「React Native for Web」を活用して、UIをブラウザで確認しよう

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

プラットフォーム固有の実装パターン

 React Native for Webが独立したライブラリであるからこそ、すべてのコンポーネントが完全に互換性を持つわけではありません。プラットフォーム固有の機能を使い分けるための実装パターンを見ていきましょう。

Platform.OSによる条件分岐

 最も基本的な方法は、Platform.OSによる条件分岐です(リスト1)。

[リスト1]Platform.OSによる条件分岐
import { Platform, View, Text } from 'react-native';
export default function PlatformInfo() {
  return (
    <View>
      <Text>現在のプラットフォーム: {Platform.OS}</Text>
      {Platform.OS === 'web' ? (
        <Text>Webブラウザで実行中です</Text>
      ) : (
        <Text>モバイルアプリで実行中です</Text>
      )}
    </View>
  );
}

 Platform.OSは、iOS、Android、Webそれぞれで異なる値('ios''android''web')を返します。

Platform.selectによる値の切り替え

 複数のプラットフォーム向けに値を切り替える場合は、Platform.selectを使うとより簡潔に書けます(リスト2)。

[リスト2]Platform.selectによる値の切り替え
import { Platform, StyleSheet } from 'react-native';
const styles = StyleSheet.create({
  container: {
    padding: Platform.select({
      web: 20,
      ios: 15,
      android: 10,
    }),
    fontFamily: Platform.select({
      web: 'system-ui, -apple-system, sans-serif',
      default: 'System', // iOS/Android共通
    }),
  },
});

Web専用ファイルによる実装分割

 より大きな実装の違いがある場合は、.web.tsx拡張子を使用してWeb専用の実装を提供できます。この拡張子のファイル内では、<div>などのDOM要素を直接利用できます。

 これは、.android.tsx.ios.tsxの拡張子をつけることでプラットフォームごとにピックアップされるファイルを切り替えられる、React Native本来の仕組みに則ったものです(リスト3)。

[リスト3]プラットフォーム別ファイル分割の例
components/
├── FileUploader.tsx       # モバイル向け基本実装(expo-image-picker使用)
├── FileUploader.web.tsx   # Web専用(HTML input[type="file"]使用)
├── NotificationBanner.tsx # Web向け基本実装(DOM操作使用)
└── NotificationBanner.native.tsx  # モバイル専用(expo-notifications使用)

 この例では、FileUploaderは「モバイル+Web専用」、NotificationBannerは「Web+モバイル専用」の組み合わせになっています。

 Webビルド時には.web.tsxが、iOS/Androidビルド時には.native.tsxが優先的に読み込まれ、該当するファイルがなければ無印(.tsx)が使用されます。この仕組みにより、プラットフォームごとに最適化された実装を透過的に切り替えることができます。

次のページ
セットアップと基本動作

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

ExpoとEASで始める快適モバイルアプリ開発連載記事一覧

もっと読む

この記事の著者

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

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 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本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

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

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

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/22352 2025/10/17 11:00

イベント

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

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

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

メールバックナンバー