RORK LABEN
COMPANION — Rork Companion アプリを使えば、有料の Apple Developer アカウントなしでも実機の iPhone で自作アプリを試せますSEED — 調達は2026年4月、Left Lane Capital 主導の1,500万ドルのシードラウンドです。Peak XV・True Ventures・Goodwater・a16z Speedrun が参加していますPAPER — Rork はアプリビルダーの Paperline を買収しました。エンジニアリング人材の取り込みを目的に、今後も買収を続ける方針とされていますARR — Rork Max は2026年2月のローンチから3日で ARR 150万ドルに達したと報告されていますNATIVE — Rork Max は AR・LiDAR スキャン、Metal の3Dゲーム、Dynamic Island、ライブアクティビティ、HealthKit、NFC、Core ML のオンデバイス推論に届きますPLATFORM — 対応は iPhone・iPad・Apple Watch・Apple TV・Vision Pro に加えて iMessage も含まれますCOMPANION — Rork Companion アプリを使えば、有料の Apple Developer アカウントなしでも実機の iPhone で自作アプリを試せますSEED — 調達は2026年4月、Left Lane Capital 主導の1,500万ドルのシードラウンドです。Peak XV・True Ventures・Goodwater・a16z Speedrun が参加していますPAPER — Rork はアプリビルダーの Paperline を買収しました。エンジニアリング人材の取り込みを目的に、今後も買収を続ける方針とされていますARR — Rork Max は2026年2月のローンチから3日で ARR 150万ドルに達したと報告されていますNATIVE — Rork Max は AR・LiDAR スキャン、Metal の3Dゲーム、Dynamic Island、ライブアクティビティ、HealthKit、NFC、Core ML のオンデバイス推論に届きますPLATFORM — 対応は iPhone・iPad・Apple Watch・Apple TV・Vision Pro に加えて iMessage も含まれます
記事一覧/開発ツール
開発ツール/2026-07-30上級

Renovate が触ってよい依存と、触ってはいけない依存 — Expo SDK 57 の123パッケージを機械的に切り分ける

Rork 生成アプリに依存の自動更新を入れると、Expo が版を管理している123パッケージまで巻き込まれます。2026年7月30日時点の実測では、うち6件が npm の最新版へメジャー更新される差でした。除外リストを手で書かず SDK から機械生成する手順をまとめます。

Rork523Expo153Renovate依存関係3Expo SDK 572CI4React Native215保守運用

プレミアム記事

月曜の朝、リポジトリに Renovate の PR が並んでいました。

そのうちの1本が目に留まりました。react-native-gesture-handler2.32.0 から 3.1.0 へ。メジャーがひとつ上がっています。

CI は緑でした。ユニットテストは通り、型検査も通り、Lint も何も言いません。個人開発で6本のアプリを並行して運用していると、緑の PR は基本的にありがたいものです。手を動かさずに依存が新しくなるなら、それに越したことはありません。

ただ、このアプリは Expo 管理下です。そして expo install --check を打つと、Renovate が上げたがっているそのバージョンは「合っていない」と言われます。

依存を新しく保つ仕組みが、依存を壊す仕組みとして働いていました。

原因を突き止めるより先に、まず範囲を知りたくなりました。Renovate が触れてしまう Expo 管理下の依存は、いったい何件あるのか。

Expo が版を握っているパッケージは123件ある

Expo の SDK パッケージには bundledNativeModules.json という一覧が同梱されています。expo install が「このパッケージはこの範囲で入れる」と判断する根拠であり、実質的に SDK ごとの互換性契約そのものです。

実物を取り出して数えました。2026年7月30日時点の計測です。

npm pack expo@57.0.9 && tar -xzf expo-57.0.9.tgz
node -e 'console.log(Object.keys(require("./package/bundledNativeModules.json")).length)'
# => 123

SDK 56.0.18 でも同じことをしたところ 122 件でした。56 から 57 への差は、expo-eas-client が1件増えただけです。

一方で、バージョンレンジが変わったエントリは90件ありました。追加も削除もほとんど起きていないのに、9割近くの範囲指定が動いている。SDK の更新とは、パッケージの入れ替えではなく範囲の付け替えなのだという当たり前のことが、数字で見えます。

ここまでは想定内でした。想定と違ったのは、次に数えたところです。

危ないのは「Expo という名前がついていない」依存だった

123件の内訳を、名前で分けてみました。

node -e '
const m = require("./package/bundledNativeModules.json");
const all = Object.keys(m);
const looksExpo = all.filter(n => n.startsWith("expo"));
console.log("total:", all.length, "expo*:", looksExpo.length, "other:", all.length - looksExpo.length);
'
# => total: 123 expo*: 82 other: 41

41件は expo で始まりません。react-native-reanimated@shopify/flash-list@sentry/react-nativereact-native-svg。単体で npm に公開されている、ごく普通のパッケージに見えます。

Renovate から見れば、実際にごく普通のパッケージです。Expo が版を握っているという事情は、パッケージ名にもマニフェストにも書かれていません。

この41件が、いま npm の最新版とどれだけ離れているのかを測りました。

// audit.mjs — Expo が管理する非 expo-* パッケージと npm latest の差を分類する
import { execSync } from "node:child_process";
import { readFileSync } from "node:fs";
 
const bnm = JSON.parse(readFileSync("./package/bundledNativeModules.json", "utf8"));
const names = Object.keys(bnm).filter((n) => !n.startsWith("expo-") && n !== "expo");
 
const num = (v, i) => Number(String(v).replace(/^[~^><= ]+/, "").split(".")[i]);
 
const rows = [];
for (const n of names) {
  let latest = null;
  try {
    latest = execSync(`npm view ${n} version`, { encoding: "utf8", timeout: 40000 }).trim();
  } catch {
    // 取得できないものは unknown に落とす。ここで例外を投げると全件が無駄になります
  }
  if (!latest) {
    rows.push({ n, pinned: bnm[n], latest: "n/a", gap: "unknown" });
    continue;
  }
  const gap =
    num(latest, 0) > num(bnm[n], 0)
      ? "MAJOR"
      : num(latest, 1) > num(bnm[n], 1)
        ? "minor"
        : latest !== String(bnm[n]).replace(/^[~^]/, "")
          ? "patch"
          : "same";
  rows.push({ n, pinned: bnm[n], latest, gap });
}
 
const count = (g) => rows.filter((r) => r.gap === g).length;
console.log(`managed(non expo-*): ${names.length}`);
console.log(
  `MAJOR=${count("MAJOR")} minor=${count("minor")} ` +
    `patch=${count("patch")} same=${count("same")}`,
);
for (const g of ["MAJOR", "minor"]) {
  console.log(`--- ${g} ---`);
  for (const r of rows.filter((r) => r.gap === g)) {
    console.log(`${r.n}\t${r.pinned}\t${r.latest}`);
  }
}

実行結果です。

managed(non expo-*): 41
MAJOR=6 minor=9 patch=9 same=17 unknown=0

メジャーが6件。その内訳がこちらです。

パッケージExpo SDK 57 の指定npm latest
@react-native-async-storage/async-storage2.2.03.1.1
react-native-gesture-handler~2.32.03.1.0
react-native-get-random-values~1.11.02.0.0
react-native-webview13.16.114.0.1
@sentry/react-native~7.11.08.20.0
react-native-bootsplash^6.3.107.3.2

この6件の並びを見て、少し背筋が寒くなりました。

永続化層、ジェスチャ、乱数、WebView、クラッシュ計測、起動画面。壊れても CI が赤くならない場所ばかりです。AsyncStorage のメジャー更新はユーザーの保存データに触れます。ジェスチャの更新は画面遷移に触れます。Sentry の更新は、壊れたことを知らせてくれるはずの仕組み自体に触れます。

マイナー差の9件も載せておきます。こちらは即座に壊れるわけではありませんが、expo install --check は等しく警告を出します。

パッケージExpo SDK 57 の指定npm latest
@expo/vector-icons^15.0.215.1.1
@stripe/stripe-react-native0.64.00.72.0
react-native-keyboard-controller1.21.91.22.2
react-native-maps1.27.21.29.0
react-native-worklets0.10.10.11.3
react-native-safe-area-context~5.7.05.8.0
sentry-expo~7.0.07.2.0
@shopify/react-native-skia2.6.22.10.1
@shopify/flash-list2.0.22.3.2

事前の見立てでは、「expo- で始まるものを除外すれば概ね足りるだろう」と踏んでいました。実際には逆で、名前で判断すると危険な6件を全部取り逃します。メジャー差のあるパッケージは、6件とも expo で始まりません。

同じ数の依存を扱っていても、供給網の観点からの棚卸しは目的が違います。そちらはRork が生成したアプリの依存関係を棚卸しするにまとめてありますので、必要でしたら併せてご覧ください。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
Expo SDK 57 が版を管理するのは123パッケージ。うち41件は名前が expo- で始まりません。この41件を npm の最新版と突き合わせた実測を全件掲載します(メジャー差6件・マイナー差9件)
除外リストを SDK 本体から生成し、差分があれば exit 1 を返すスクリプト全文。冪等性と、SDK を上げてもリストが変わらない理由を実行ログつきで示します
expo 自身が bundledNativeModules.json に載っていないという落とし穴と、その1行を補わなかった場合に何が起きるか。残った依存にだけ効かせる renovate.json も併載します
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Rork Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

開発ツール2026-07-28
prebuild --clean で消える手入れを、上げる前に数える — Expo SDK 57 移行の棚卸し
Expo SDK 57 への移行前に、ios/ へ加えた手入れが prebuild の再生成でいくつ失われるかを数える手順をまとめました。素の差分649行のうち意味を持つのは3行。ノイズを正規化して実質的な変更だけを抽出するスクリプトと、config plugin への移し替えを実測つきで共有します。
開発ツール2026-03-30
Rork アプリの Expo 依存関係エラー解決ガイド
Rork で生成したアプリの Expo 依存関係エラーを症状別に解決する実践的なガイドです。バージョン競合からインストール失敗まで、よくあるエラーの原因と対処法をマスターしましょう。
開発ツール2026-07-27
最低サポート iOS をいつ上げるか — 利用率ではなく、コードに残った分岐の数で決める
最低サポート OS の引き上げを利用率で判断すると、毎年同じ結論になって先送りが続きます。OS 分岐に注記を付けて棚卸しし、引き上げ先ごとに消せる分岐を数えるスクリプトと、引き上げ後に見る指標をまとめました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →