はじめに:SDK 55は「歴史的な転換点」です
2026年2月、ついにExpo SDK 55が正式リリースされました。正直に言うと、今回のアップデートは単なるバージョンアップという言葉では片付けられません。Legacy Architecture(旧アーキテクチャ)のサポートが完全に廃止され、New Architectureが唯一の選択肢になりました。React Native開発にとって、まさに歴史的な転換点です。
SDK 55にはReact Native 0.83とReact 19.2が同梱されています。Hermesバイトコード差分による最大75%のOTA更新サイズ削減、expo-avの完全廃止、新しいExpo Router API、expo-brownfieldによるブラウンフィールドサポート強化など、重要な変更がてんこ盛りです。
この記事では、SDK 54以前からSDK 55へのアップグレードを安全かつ確実に進めるための実践ガイドをお届けします。実際のコード例、トラブルシューティング、よくある落とし穴まで、一通りカバーしていきますので、ぜひ最後までお付き合いください。
SDK 55の主要スペック一覧
まずはSDK 55の基本スペックをざっと確認しておきましょう。
- React Native:0.83.2
- React:19.2
- 対応Android API:Level 36(最低 Android 7+)
- 対応Xcode:16.1以上(EAS Buildデフォルト:Xcode 26.2)
- 対応iOS:15.1以上
- 対応Node.js:^20.19.4、^22.13.0、^24.3.0、^25.0.0
- アーキテクチャ:New Architecture のみ(Legacy Architecture完全廃止)
Node.jsの対応バージョンが幅広いのはありがたいですね。ただ、v18系はサポート外なので、まだ使っている方は先にNode.jsのアップグレードが必要です。
アップグレード前の準備:順序が重要です
最重要ポイント:New Architectureへの移行を先に行う
SDK 55へのアップグレードで一番大事なルールを先にお伝えします。それは、SDKのバージョンアップとNew Architectureへの移行を同時にやらないことです。
これ、本当に重要です。両方を一度にやってしまうと、問題が起きたときに原因の切り分けがほぼ不可能になります。
推奨される手順はこちら。
- SDK 54のままNew Architectureを有効化する
- 開発ビルドを作成し、しっかりテストする
- 問題があればNew Architectureトラブルシューティングガイドを参照して解決する
- New Architectureが安定稼働することを確認してから、SDK 55にアップグレードする
焦る気持ちは分かりますが、この順序を守ることで結果的にアップグレード作業がスムーズに進みます。
依存パッケージの互換性チェック
アップグレード前に、サードパーティライブラリがNew Architectureに対応しているかも確認しておきましょう。React Native Directoryで互換性ステータスをチェックできます。
特に注意したいのが、react-native-reanimated v4と@shopify/flash-list v4です。これらはNew Architecture専用になっているので、使っている場合は最新バージョンへの更新も必要になります。
ステップバイステップ:SDK 55へのアップグレード手順
ステップ1:依存パッケージの更新
では、実際のアップグレード手順に入りましょう。まずはExpo SDKと関連パッケージの更新からです。
# SDK 55にアップグレード
npx expo install expo@^55.0.0 --fix
# 診断ツールで問題をチェック
npx expo-doctor@latest
expo-doctorはかなり優秀で、バージョンの不整合やNew Architecture非対応パッケージ、その他の問題をしっかり検出してくれます。警告が出たら、以下のコマンドで修正しましょう。
# 依存パッケージを最新のパッチバージョンに更新
npx expo install --fix
ステップ2:app.jsonの設定変更
SDK 55では、いくつかの設定オプションが不要になっています。app.jsonから以下の設定を削除してください。残っていてもエラーにはなりませんが、不要な設定は消しておくのがベストです。
// 削除が必要な設定項目
{
"expo": {
// ❌ 削除:New Architectureは常に有効
"newArchEnabled": true,
// ❌ 削除:React 19が標準
"experiments": {
"reactCanary": true
},
// ❌ 削除:Android 16+でedge-to-edgeは必須
"edgeToEdgeEnabled": true,
// ❌ 削除:通知設定はapp.jsonスキーマから削除
"notification": { ... }
}
}
ステップ3:ネイティブプロジェクトの再生成
Continuous Native Generation(CNG)を使用している場合:
# android/iosディレクトリを削除(次回ビルド時に自動再生成)
rm -rf android ios
# または、明示的に再生成
npx expo prebuild --clean
CNGを使用していない場合(ベアワークフロー):
# iOSのPodを再インストール
npx pod-install
# React Native Upgrade Helperで差分を確認
# https://react-native-community.github.io/upgrade-helper/
ベアワークフローの方は、Upgrade Helperでの差分確認を忘れずに。手動で追わないといけない変更が意外とあったりします。
ステップ4:開発ビルドの作成とテスト
SDK 55への移行では、Expo Goではなく開発ビルドを使うことを強くおすすめします。リリース直後はExpo GoがまだSDK 54ベースのままなので、SDK 55の全機能を正しくテストできません。
# 開発ビルドの作成
eas build --profile development --platform all
# ローカルでの実行
npx expo run:ios
npx expo run:android
破壊的変更の詳細と対応方法
expo-avの完全廃止
SDK 55でおそらく最も影響が大きい破壊的変更が、expo-avの廃止です。Expo Goから完全に削除され、今後パッチも提供されません。つまり、代替パッケージへの移行は避けて通れません。
移行マッピング:
expo-avのAudio機能 →expo-audioexpo-avのVideo機能 →expo-video
まずは新しいパッケージをインストールします。
npx expo install expo-video expo-audio
音声再生の移行例:
// ❌ 旧:expo-av を使用
import { Audio } from 'expo-av';
const { sound } = await Audio.Sound.createAsync(
require('./audio.mp3')
);
await sound.playAsync();
// ✅ 新:expo-audio を使用
import { useAudioPlayer } from 'expo-audio';
function AudioPlayerComponent() {
const player = useAudioPlayer(require('./audio.mp3'));
const handlePlay = () => {
player.play();
};
return (
<TouchableOpacity onPress={handlePlay}>
<Text>再生</Text>
</TouchableOpacity>
);
}
新しいAPIはReact Hooksベースになっていて、個人的にはずっと使いやすくなったと感じています。
動画再生の移行例:
// ❌ 旧:expo-av を使用
import { Video } from 'expo-av';
<Video
source={{ uri: 'https://example.com/video.mp4' }}
useNativeControls
resizeMode="contain"
style={{ width: 300, height: 200 }}
/>
// ✅ 新:expo-video を使用
import { VideoView, useVideoPlayer } from 'expo-video';
function VideoPlayerComponent() {
const player = useVideoPlayer(
'https://example.com/video.mp4',
(player) => {
player.loop = true;
}
);
return (
<VideoView
player={player}
style={{ width: 300, height: 200 }}
contentFit="contain"
nativeControls={true}
/>
);
}
expo-routerの変更点
Expo Routerにもいくつか破壊的変更があるので押さえておきましょう。
ExpoRequest/ExpoResponseが廃止 → 標準のRequest/Responseを使用- ヘッドレスタブの
resetpropがresetOnFocusにリネーム
// ❌ 旧
import { ExpoRequest, ExpoResponse } from 'expo-router/server';
export function GET(request: ExpoRequest): ExpoResponse {
return ExpoResponse.json({ message: 'hello' });
}
// ✅ 新
export function GET(request: Request): Response {
return Response.json({ message: 'hello' });
}
Web標準のAPIに寄せてきた形ですね。個人的にはこの方向性は歓迎です。
その他の破壊的変更
- expo-video:
allowsFullscreenが廃止 →fullscreenOptions.enableを使用 - expo-clipboard:イベントリスナーの
contentプロパティ廃止 →getStringAsync()を使用 - expo-blur:
experimentalBlurMethodがblurMethodにリネーム - プッシュ通知:Expo Go(Android)でプッシュ通知を使用すると、警告ではなくエラーがスローされるように変更
プッシュ通知の変更は地味にハマりやすいポイントなので、Expo Goでの開発中に通知周りをテストしている方は気をつけてください。
SDK 55の注目すべき新機能
Hermesバイトコード差分(OTA更新の最適化)
さて、ここからは嬉しい話です。SDK 55で個人的に一番テンションが上がった新機能が、Hermesバイトコード差分です。
従来、OTA更新ではHermesでコンパイルされたJavaScriptバンドル全体をダウンロードする必要がありました。でもこの機能を有効にすると、差分(パッチ)だけをダウンロードするようになります。その結果、更新ダウンロードサイズが最大75%も削減されるんです。
有効化はapp.jsonに1行追加するだけ。
{
"expo": {
"updates": {
"enableBsdiffPatchSupport": true
}
}
}
ちなみに、SDK 56ではこの機能がデフォルトで有効になる予定だそうです。
Hermes V1(オプトイン)
Hermes V1は、ES6クラス、const/let構文、async/awaitなど、モダンなJavaScript機能のネイティブサポートが強化された新しいJSエンジンです。パフォーマンスの改善も報告されています。
ただし、SDK 55の段階ではオプトイン扱いで、React Nativeをソースからビルドする必要があるため、ビルド時間がかなり増加します。本番投入は慎重に判断した方がよさそうです。
// app.json での有効化
{
"expo": {
"plugins": [
[
"expo-build-properties",
{
"android": {
"buildReactNativeFromSource": true,
"useHermesV1": true
},
"ios": {
"buildReactNativeFromSource": true,
"useHermesV1": true
}
}
]
]
}
}
// package.json でのバージョン指定
{
"overrides": {
"hermes-compiler": "250829098.0.4"
}
}
パッケージバージョンの統一
これは地味だけど嬉しい変更です。SDK 55から、すべてのExpoパッケージがSDKと同じメジャーバージョンを使うようになりました。例えばexpo-camera@^55.0.0のように、パッケージの互換性が一目で分かります。
「このバージョンのexpo-cameraってSDK 55で使えるんだっけ?」と迷うことがなくなりますね。
expo-brownfield:ブラウンフィールドアプリのサポート強化
既存のネイティブアプリにReact Nativeを組み込む「ブラウンフィールド」開発が、新しいexpo-brownfieldパッケージで大きく改善されました。2つの統合モードが用意されています。
- Integrated(統合型):React NativeコードがネイティブプロジェクトやJetpack Compose内に共存する形。両方を同時に開発するチーム向け
- Isolated(分離型):React NativeアプリをAAR(Android)やXCFramework(iOS)としてパッケージ化。ネイティブ開発者はNode.js環境なしで利用可能
特にIsolatedモードは、大規模なチームでネイティブ開発者とRN開発者が分かれている場合にかなり便利そうです。
Expo Routerの新機能
Expo RouterにもUIと機能面で多くの改善が入りました。
- Apple Zoomトランジション:iOSでインタラクティブな共有要素トランジションがデフォルト有効
- Colors API:AndroidでMaterial 3のダイナミックカラー、iOSでアダプティブカラーを提供
- Stack.Toolbar API:iOSでUIToolbarベースのメニュー・アクション領域を追加
- 同期レイアウト更新:ナビゲーション時のジャンプアーティファクトを軽減
- ネイティブタブのセーフエリア自動処理:手動でのインセット設定が不要に
Zoomトランジションはデモを見るとかなりスムーズで、ネイティブアプリ感がグッと増します。
新しいデフォルトテンプレート
プロジェクトテンプレートも刷新されました。
- アプリコードが
/appではなく/src/appに配置される新構成 - iOS・AndroidでNative Tabs APIを使用したネイティブなタブ体験
- ウェブ向けのレスポンシブレイアウト
# 新しいテンプレートでプロジェクトを作成
npx create-expo-app@latest --template default@sdk-55
SDK 55で追加された注目API
パッケージ単位での新機能もかなり充実しています。主要なものをまとめておきます。
- expo-crypto:AES-GCM暗号化・復号化のサポート追加
- expo-sqlite:DevToolsプラグインによるSQLiteインスペクター、タグ付きテンプレートリテラルで型安全なクエリ
- expo-audio:ロック画面コントロール、バックグラウンド録音、プレイリスト対応、ネイティブプリロード
- expo-video:seekTolerance、スクラビングモード、Android複数VideoView PiP対応
- expo-image:iOS HDR画像対応、SF Symbolsレンダリング
- expo-camera:ビデオスタビライゼーション、Androidフロントカメラでのスクリーンフラッシュ
- expo-blur:Android 12以上でRenderNode APIによる安定したブラー効果
- expo-widgets(Alpha):Expo UIを使ったiOSホーム画面ウィジェットとLive Activities(ネイティブコード不要)
expo-widgetsはまだAlphaですが、SwiftUIを書かずにウィジェットが作れるのはインパクトがありますね。今後の発展が楽しみです。
AI支援によるアップグレード
面白いことに、SDK 55ではExpoがAI支援開発のファーストクラスサポートも構築しています。Expo CLIがModel Context Protocol(MCP)を通じてAIエージェントにコマンドを公開しているんです。
Claude Codeを使っている場合、以下の手順でAI支援アップグレードを試せます。
# Expoスキルをインストール
/plugin marketplace add expo/skills
/plugin install upgrading-expo
# その他のAIエージェントの場合
bunx skills add expo/skills
AIエージェントが移行ガイドを読み込んで、コードベースを分析し、依存関係を更新し、破壊的変更まで修正してくれます。ただし、必ず別ブランチで作業して、マージ前にすべての変更をレビューしてください。AIは便利ですが、最終チェックは人間の目で行うのが安全です。
トラブルシューティング:よくある問題と解決策
ビルドエラーが発生する場合
サードパーティパッケージのビルドエラーに遭遇したら、そのパッケージがReact Native 0.83にまだ対応していない可能性があります。以下の順序で確認しましょう。
- パッケージのリリースページで新バージョンが出ていないかチェック
npx expo-doctor@latestで互換性を確認- React Native Directoryで対応状況を確認
node_modulesの状態が不正になる場合
大量のパッケージが同時に更新されると、node_modulesがおかしな状態になることがあります。経験上、変に悩むよりクリーンインストールした方が早いです。
# node_modulesを完全にクリーンアップ
rm -rf node_modules
rm -rf package-lock.json # npmの場合
# または rm -rf yarn.lock # yarnの場合
# 再インストール
npm install
# または yarn install
ランタイムクラッシュの調査
ビルドは通るのにランタイムでクラッシュする…これが一番厄介なパターンですよね。以下のツールでネイティブ側のエラーを確認できます。
# Android: ADB Logcatでログを確認
adb logcat | grep -i "react\|expo\|fatal"
# iOS: macOS Consoleアプリでログを確認
# Xcode > Window > Devices and Simulators でもクラッシュログを確認可能
Expo Goが使えない場合
SDK 55リリース直後は、App StoreのExpo GoがまだSDK 54ベースのままです。SDK 55を使うには以下の方法があります。
# Android: Expo CLI経由でSDK 55版Expo Goをインストール
npx expo start # QRコードを読み取ると自動インストール
# iOS: TestFlight External Betaを使用
# または独自のExpo Goビルドを作成
eas go
SDK 56で予告されている変更
先のことも少し見ておきましょう。SDK 56で予告されている主な変更です。
- Hermesバイトコード差分がデフォルト有効に
- 最低iOSバージョンが15.1から16.4に引き上げ
expo-video-thumbnailsの完全削除(expo-videoのgenerateThumbnailsAsyncに移行)
iOS 16.4への引き上げは、古いデバイスをサポートしているアプリでは影響があるかもしれません。今のうちに自分のアプリのiOSサポート範囲を確認しておくといいでしょう。
よくある質問(FAQ)
Q: SDK 54からSDK 55に直接アップグレードできますか?
はい、直接アップグレードできます。ただし、New Architectureへの移行をSDK 54の段階で先に完了させてからSDK 55にアップグレードすることを強くおすすめします。両方を同時にやると、問題の原因特定が本当に大変です。
Q: expo-avをまだ使っていますが、すぐに移行しないとどうなりますか?
expo-avはSDK 55のExpo Goから完全に削除されました。今後パッチの提供もありません。開発ビルドでは一時的に動くかもしれませんが、動作保証はなし。expo-audioとexpo-videoへの早めの移行をおすすめします。
Q: Hermes V1は本番環境で使っても大丈夫ですか?
正直なところ、SDK 55の段階ではまだ様子見がいいと思います。オプトイン機能であり、本番環境での実績はまだ十分とは言えません。ビルド時間も増えるので、まずはステージング環境でしっかりテストしてから判断してください。
Q: New Architectureに対応していないサードパーティライブラリはどうすれば?
React Native 0.83には互換レイヤー(インターオップレイヤー)が含まれているので、多くのライブラリはそのまま動作します。ただ、完全な互換性は保証されていません。まずReact Native Directoryで対応状況を確認して、未対応であればライブラリの開発者にIssueを立てるか、代替ライブラリへの切り替えを検討しましょう。
Q: SDK 55のExpo Goはいつストアで利用可能になりますか?
正確な日程は公表されていませんが、正式リリース後に順次更新される予定です。それまでは、Android版はExpo CLI経由でインストール、iOS版はTestFlight External Betaまたはeas goコマンドで独自のExpo Goビルドを作成して乗り切りましょう。