jpskill.com
🛠️ 開発・MCP コミュニティ

mobile-framework-expo

Expoのマネージドワークフローを利用して、クロスプラットフォームなモバイルアプリ開発を効率的に進め、iOSやAndroidなど様々な環境に対応したアプリを比較的容易に構築するSkill。

📜 元の英語説明(参考)

Expo managed workflow

🇯🇵 日本人クリエイター向け解説

一言でいうと

Expoのマネージドワークフローを利用して、クロスプラットフォームなモバイルアプリ開発を効率的に進め、iOSやAndroidなど様々な環境に対応したアプリを比較的容易に構築するSkill。

※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。

⚡ おすすめ: コマンド1行でインストール(60秒)

下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。

🍎 Mac / 🐧 Linux
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o mobile-framework-expo.zip https://jpskill.com/download/10260.zip && unzip -o mobile-framework-expo.zip && rm mobile-framework-expo.zip
🪟 Windows (PowerShell)
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/10260.zip -OutFile "$d\mobile-framework-expo.zip"; Expand-Archive "$d\mobile-framework-expo.zip" -DestinationPath $d -Force; ri "$d\mobile-framework-expo.zip"

完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。

💾 手動でダウンロードしたい(コマンドが難しい人向け)
  1. 1. 下の青いボタンを押して mobile-framework-expo.zip をダウンロード
  2. 2. ZIPファイルをダブルクリックで解凍 → mobile-framework-expo フォルダができる
  3. 3. そのフォルダを C:\Users\あなたの名前\.claude\skills\(Win)または ~/.claude/skills/(Mac)へ移動
  4. 4. Claude Code を再起動

⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。

🎯 このSkillでできること

下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。

📦 インストール方法 (3ステップ)

  1. 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
  2. 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
  3. 3. 展開してできたフォルダを、ホームフォルダの .claude/skills/ に置く
    • · macOS / Linux: ~/.claude/skills/
    • · Windows: %USERPROFILE%\.claude\skills\

Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。

詳しい使い方ガイドを見る →
最終更新
2026-05-18
取得日時
2026-05-18
同梱ファイル
1

📖 Skill本文(日本語訳)

※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。

Expo 開発パターン

クイックガイド: Expo を使用して、本番環境に対応した React Native アプリを構築します。ほとんどのプロジェクトでは、Continuous Native Generation を使用したマネージドワークフロー、ファイルベースのナビゲーションには Expo Router、ビルド/アップデートには EAS を使用します。開発ビルドは、本番環境のテストのために Expo Go の代わりに使用します。


<critical_requirements>

重要: この Skill を使用する前に

すべてのコードは、CLAUDE.md のプロジェクト規約に従う必要があります (kebab-case、名前付きエクスポート、インポート順序、import type、名前付き定数)

(本番環境のテストには、必ず開発ビルドを使用してください - Expo Go はプロトタイピング専用です)

(OTA アップデートのクラッシュを防ぐために、ネイティブ依存関係を変更する場合は、必ず runtimeVersion を更新してください)

(ネイティブのカスタマイズには、必ず config plugins を使用してください - マネージドワークフローでは、android/ios ディレクトリを手動で編集しないでください)

(クライアント側の環境変数には、必ず EXPO_PUBLIC_ プレフィックスを使用してください - これらの変数にシークレットを保存しないでください)

</critical_requirements>


自動検出: Expo, expo-router, EAS Build, EAS Update, expo-dev-client, app.config.js, app.json, expo prebuild, npx expo, eas.json, expo-constants, expo-notifications, Continuous Native Generation, CNG

いつ使用するか:

  • 新しい React Native プロジェクトを迅速な開発ニーズで開始する場合
  • OTA (Over-the-Air) アップデートが必要なアプリを構築する場合
  • 規約に基づくファイルベースのルーティングを使用する場合
  • android/ios ディレクトリを維持せずにネイティブコードを管理する場合
  • クラウドビルドでアプリストアにデプロイする場合

カバーする主なパターン:

  • Continuous Native Generation (CNG) を使用したマネージドワークフロー
  • Expo Router ファイルベースのナビゲーション
  • EAS Build、Submit、および Update ワークフロー
  • 開発ビルドと Expo Go の違い
  • ネイティブのカスタマイズのための Config plugins
  • 環境構成とシークレット
  • プッシュ通知の設定

いつ使用しないか:

  • Expo Modules API を超える複雑なカスタムネイティブコードを必要とするアプリ
  • アプリのサイズが 15MB 未満である必要がある場合 (Expo はオーバーヘッドを追加します)
  • 移行の準備ができていないレガシー React Native プロジェクト

<philosophy>

哲学

Expo は、React Native の開発を「一度書けば、どこでもデバッグできる」から「一度書けば、自信を持ってデプロイできる」に変えます。重要なのは、ほとんどのアプリは直接的なネイティブアクセスを必要とせず、一貫した API を持つ適切にメンテナンスされたネイティブモジュールを必要としているということです。

コア原則:

  1. デフォルトでマネージド - Expo にネイティブの複雑さを処理させ、必要な場合にのみ prebuild を実行します
  2. Continuous Native Generation - android/ios をソースコードではなく、ビルド成果物として扱います
  3. 真実のための開発ビルド - Expo Go は学習用であり、開発ビルドは本番環境の現実を示します
  4. 速度のための OTA - アプリストアの遅延なしに JavaScript アップデートを配信します
  5. イジェクトよりも Config plugins - 必要に応じて、宣言的にネイティブコードをカスタマイズします

メンタルモデル:

Expo は React Native の制限ではありません - プロフェッショナルグレードの抽象化です。Expo Modules API または prebuild を介して常にネイティブコードに移行できますが、ほとんどのアプリは必要ありません。

</philosophy>


<patterns>

コアパターン

パターン 1: app.config.ts を使用した動的な構成

環境固有のビルドには app.config.ts を使用します。SDK バージョンとビルド番号には名前付き定数を使用します。

// app.config.ts - 環境を認識する構成
const IS_PRODUCTION = process.env.APP_ENV === "production";
const BUILD_NUMBER = 1;

export default ({ config }: ConfigContext): ExpoConfig => ({
  ...config,
  name: IS_PRODUCTION ? "MyApp" : "MyApp (Dev)",
  ios: {
    bundleIdentifier: IS_PRODUCTION ? "com.app" : "com.app.dev",
    buildNumber: String(BUILD_NUMBER),
  },
  android: {
    package: IS_PRODUCTION ? "com.app" : "com.app.dev",
    versionCode: BUILD_NUMBER,
  },
});

完全な例: examples/core.md - アプリケーション構成セクション


パターン 2: ネイティブのカスタマイズのための Config Plugins

ネイティブコードを宣言的に変更します -- 変更は expo prebuild --clean 後も保持されます。Config plugins を使用して、権限、SDK バージョン、およびネイティブ設定を行います。

// app.config.ts plugins 配列
plugins: [
  [
    "expo-camera",
    { cameraPermission: "Allow $(PRODUCT_NAME) to access your camera." },
  ],
  [
    "expo-build-properties",
    { android: { minSdkVersion: 24 }, ios: { deploymentTarget: "15.1" } },
  ],
];

完全な例: examples/core.md - Config Plugins セクション


パターン 3: 環境変数

クライアント側の変数には EXPO_PUBLIC_ プレフィックスを使用します。Metro は直接プロパティアクセスを必要とします -- 分割代入とブラケット表記は機能しません。

// 直接アクセスを使用する必要があります - Metro 静的解析要件
const API_URL = process.env.EXPO_PUBLIC_API_URL; // 動作します
// const { EXPO_PUBLIC_API_URL } = process.env;  // 壊れています - ランタイム時に未定義

完全な例: examples/core.md - 環境変数セクション


パターン 4: 開発ビルド

本番環境に近いテストには expo-dev-client を使用します。Expo Go はプロトタイピング専用です -- ネイティブ依存関係、プッシュ通知、および正確なスプラッシュスクリーンがありません。

# クラウドビルド
eas build --profile development --platform ios
# ローカルビルド
npx expo run:ios

完全な構成: examples/eas.md - 開発ビルドセクション


パターン 5: アセット管理

フォントのロード中にスプラッシュスクリーンをブロックし、ぼかしハッシュプレースホルダーとディスクキャッシュを備えたリモートイメージには expo-image を使用します。

SplashScreen.preventAutoHideAsync();
// フォントをロードし、準備ができたら SplashScreen.hideAsync() を呼び出します

完全な例: examples/core.md - フォントのロードとイメージ処理セクション

</patterns>


<red_flags>

注意点

  • 本番環境のテストに Expo Go を使用する -- ネイティブモジュール、プッシュ通知、正確なスプラッシュスクリーンがありません。常に開発ビルドを使用してください。
  • ネイティブの変更後に runtimeVersion を更新しない -- OTA アップデートは、互換性のないネイティブコードを持つアプリでクラッシュします。自動検出には "fingerprint" ポリシーを使用してください。
  • ` にシークレットを保存する

(原文がここで切り詰められています)

📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開

Expo Development Patterns

Quick Guide: Build production-ready React Native apps with Expo. Use managed workflow with Continuous Native Generation for most projects, Expo Router for file-based navigation, and EAS for builds/updates. Development builds replace Expo Go for production testing.


<critical_requirements>

CRITICAL: Before Using This Skill

All code must follow project conventions in CLAUDE.md (kebab-case, named exports, import ordering, import type, named constants)

(You MUST use development builds for production testing - Expo Go is for prototyping only)

(You MUST update runtimeVersion when making native dependency changes to prevent OTA update crashes)

(You MUST use config plugins for native customization - NEVER manually edit android/ios directories in managed workflow)

(You MUST use EXPO_PUBLIC_ prefix for client-side environment variables - NEVER store secrets in these variables)

</critical_requirements>


Auto-detection: Expo, expo-router, EAS Build, EAS Update, expo-dev-client, app.config.js, app.json, expo prebuild, npx expo, eas.json, expo-constants, expo-notifications, Continuous Native Generation, CNG

When to use:

  • Starting new React Native projects with rapid development needs
  • Building apps that need OTA (over-the-air) updates
  • Using file-based routing with convention-over-configuration
  • Managing native code without maintaining android/ios directories
  • Deploying to app stores with cloud builds

Key patterns covered:

  • Managed workflow with Continuous Native Generation (CNG)
  • Expo Router file-based navigation
  • EAS Build, Submit, and Update workflows
  • Development builds vs Expo Go
  • Config plugins for native customization
  • Environment configuration and secrets
  • Push notifications setup

When NOT to use:

  • Apps requiring complex custom native code beyond Expo Modules API
  • When app size must be under 15MB (Expo adds overhead)
  • Legacy React Native projects not ready for migration

<philosophy>

Philosophy

Expo transforms React Native development from "write once, debug everywhere" to "write once, deploy confidently." The key insight is that most apps don't need direct native access - they need well-maintained native modules with consistent APIs.

Core principles:

  1. Managed by default - Let Expo handle native complexity; prebuild only when necessary
  2. Continuous Native Generation - Treat android/ios as build artifacts, not source code
  3. Development builds for truth - Expo Go is for learning; development builds show production reality
  4. OTA for velocity - Ship JavaScript updates without app store delays
  5. Config plugins over ejection - Customize native code declaratively when needed

Mental model:

Expo is NOT a limitation on React Native - it's a professional-grade abstraction. You can always drop down to native code via Expo Modules API or prebuild, but most apps never need to.

</philosophy>


<patterns>

Core Patterns

Pattern 1: Dynamic Configuration with app.config.ts

Use app.config.ts for environment-specific builds. Use named constants for SDK versions and build numbers.

// app.config.ts - Environment-aware config
const IS_PRODUCTION = process.env.APP_ENV === "production";
const BUILD_NUMBER = 1;

export default ({ config }: ConfigContext): ExpoConfig => ({
  ...config,
  name: IS_PRODUCTION ? "MyApp" : "MyApp (Dev)",
  ios: {
    bundleIdentifier: IS_PRODUCTION ? "com.app" : "com.app.dev",
    buildNumber: String(BUILD_NUMBER),
  },
  android: {
    package: IS_PRODUCTION ? "com.app" : "com.app.dev",
    versionCode: BUILD_NUMBER,
  },
});

Full examples: examples/core.md - App Configuration section


Pattern 2: Config Plugins for Native Customization

Modify native code declaratively -- changes survive expo prebuild --clean. Use config plugins for permissions, SDK versions, and native settings.

// app.config.ts plugins array
plugins: [
  [
    "expo-camera",
    { cameraPermission: "Allow $(PRODUCT_NAME) to access your camera." },
  ],
  [
    "expo-build-properties",
    { android: { minSdkVersion: 24 }, ios: { deploymentTarget: "15.1" } },
  ],
];

Full examples: examples/core.md - Config Plugins section


Pattern 3: Environment Variables

Use EXPO_PUBLIC_ prefix for client-side variables. Metro requires direct property access -- destructuring and bracket notation don't work.

// MUST use direct access - Metro static analysis requirement
const API_URL = process.env.EXPO_PUBLIC_API_URL; // Works
// const { EXPO_PUBLIC_API_URL } = process.env;  // BROKEN - undefined at runtime

Full examples: examples/core.md - Environment Variables section


Pattern 4: Development Builds

Use expo-dev-client for production-accurate testing. Expo Go is for prototyping only -- it lacks your native dependencies, push notifications, and accurate splash screens.

# Cloud build
eas build --profile development --platform ios
# Local build
npx expo run:ios

Full configuration: examples/eas.md - Development Builds section


Pattern 5: Asset Management

Block splash screen while loading fonts, use expo-image for remote images with blur hash placeholders and disk caching.

SplashScreen.preventAutoHideAsync();
// Load fonts, then call SplashScreen.hideAsync() when ready

Full examples: examples/core.md - Font Loading and Image Handling sections

</patterns>


<red_flags>

RED FLAGS

  • Expo Go for production testing -- missing native modules, push notifications, accurate splash screens. Always use development builds.
  • Not updating runtimeVersion after native changes -- OTA updates crash on apps with incompatible native code. Use "fingerprint" policy for automatic detection.
  • Storing secrets in EXPO_PUBLIC_ variables -- embedded in JS bundle, visible to anyone who decompiles. Use EAS Secrets and backend proxies.
  • Manually editing android/ios directories -- changes lost on expo prebuild --clean. Use config plugins.
  • Destructuring process.env -- Metro requires direct property access (process.env.EXPO_PUBLIC_*). Destructuring and bracket notation produce undefined.
  • Using expo-av -- removed in SDK 55. Migrate to expo-video and expo-audio.
  • Legacy Architecture -- removed after SDK 54. React Native 0.82+ requires New Architecture.

Full anti-patterns and gotchas: reference.md

</red_flags>


Detailed Resources:


<critical_reminders>

CRITICAL REMINDERS

All code must follow project conventions in CLAUDE.md

(You MUST use development builds for production testing - Expo Go is for prototyping only)

(You MUST update runtimeVersion when making native dependency changes to prevent OTA update crashes)

(You MUST use config plugins for native customization - NEVER manually edit android/ios directories in managed workflow)

(You MUST use EXPO_PUBLIC_ prefix for client-side environment variables - NEVER store secrets in these variables)

Failure to follow these rules will cause OTA update crashes, broken builds, and security vulnerabilities.

</critical_reminders>