◉RORK LABEN
●GPT6.1 — Rork のモデルメニューに GPT-6.1 Sol が加わりました(9月29日)。changelog の最新エントリです●10/12 — React Native 0.88.x の正式リリース予定まで残り7日。Expo SDK 58 の安定版は、10月上旬としか示されていません●NEW — すでに「有効」になっている複数シート購入を、10月22日の前に残すか外すか決める●SDK 58 — 新規プロジェクトで npm install が通らない問題の修正 PR(#50998)が審査中です。安定版の日付はまだ示されていません●SONNET — Rork に Claude Sonnet 5.5 が入りました(9月28日)。Sonnet 5 より出力が30%超速いと説明されています●iOS 27 — 2027年4月から、App Store へのアップロードは iOS 27 SDK が必須になります。ビルド環境の更新は余裕を持って進められます●GPT6.1 — Rork のモデルメニューに GPT-6.1 Sol が加わりました(9月29日)。changelog の最新エントリです●10/12 — React Native 0.88.x の正式リリース予定まで残り7日。Expo SDK 58 の安定版は、10月上旬としか示されていません●NEW — すでに「有効」になっている複数シート購入を、10月22日の前に残すか外すか決める●SDK 58 — 新規プロジェクトで npm install が通らない問題の修正 PR(#50998)が審査中です。安定版の日付はまだ示されていません●SONNET — Rork に Claude Sonnet 5.5 が入りました(9月28日)。Sonnet 5 より出力が30%超速いと説明されています●iOS 27 — 2027年4月から、App Store へのアップロードは iOS 27 SDK が必須になります。ビルド環境の更新は余裕を持って進められます
記事一覧/開発ツール
⬡ 開発ツール/2026-08-10上級

署名付きURLに変えたらキャッシュが効かなくなった — expo-image のキーを URL から切り離す

署名付きURLは毎回クエリが変わるため、URL をそのままキーにしている限りキャッシュは当たりません。expo-image の cacheKey でキーを自分で握り、転送量を半分に落とすまでの設計と、指数を振り直した再測定の記録です。

Rork575expo-image7署名付きURLキャッシュ設計React Native238

✦ プレミアム記事

配信元を署名付きURLに切り替えた翌週、通信量のグラフだけが一段上に持ち上がりました。画像の点数も解像度も変えていません。変えたのは URL の形だけです。

犯人はキャッシュキーでした。署名付きURLは有効期限を過ぎるたびに X-Amz-Signature と X-Amz-Date が書き換わります。ライブラリから見れば、それは昨日と同じ画像ではなく、初めて見る別の画像です。

私自身、壁紙アプリでこの構造に気づくまで、ディスクキャッシュの容量設定ばかりを疑っておりました。上限を上げてもヒット率は戻りません。当たり前で、そもそも当たっていなかったからです。

2026-09-20 追記。 公開後にこの記事を読み返し、掲載コードを Expo の API ドキュメントと突き合わせ直しました。その結果、writeToCacheAsync の呼び出し方と readFromCacheAsync の返り値の説明に誤りがあり、さらに実測のべき乗指数を取り違えていたことが分かりました。該当箇所はすべて書き直し、何をどう間違えていたかも本文に残しております。

署名が変わるたびに、同じ画像が別物になる

署名付きURLは、オブジェクトのパスに対して「この時刻まで、この鍵で、この操作を許す」という証明をクエリとして付けたものです。証明部分は有効期限に紐づくので、期限が切れれば作り直しになります。

同じ壁紙 w042.webp が、セッションごとに次のように姿を変えます。

セッション1: https://cdn.example.net/wallpapers/w042.webp?X-Amz-Expires=3600&X-Amz-Date=20260810T000000Z&X-Amz-Signature=6f1c...
セッション2: https://cdn.example.net/wallpapers/w042.webp?X-Amz-Expires=3600&X-Amz-Date=20260811T000000Z&X-Amz-Signature=a93e...

パスは同一です。しかし文字列としては別物です。ここが分岐点になります。

要素セッションをまたいだときの挙動キーに使えるか
ホスト名基本は不変。CDN を切り替えると変わる単独では不十分
パス(/wallpapers/w042.webp)不変。オブジェクトの同一性を表す使える
X-Amz-Date / X-Amz-Signature期限ごとに必ず変わる使ってはいけない
変換パラメータ(?w=1080&fm=webp)要求内容が変われば変わる使う。別バリアントは別キー

つまりキーに含めるべきは「どのオブジェクトを、どの形で欲しいか」であって、「いつ誰が許可したか」ではありません。

URL は取り寄せの伝票で、キーは棚の番号です。 伝票は毎回刷り直されますが、棚の番号まで一緒に振り直す理由はどこにもありません。

既定のキャッシュキーはどこで決まっているか

expo-image は source.uri の文字列からディスク上の格納先を決めます。cachePolicy は保存する層(メモリ/ディスク)を選ぶ設定であって、キーの作り方を変える設定ではありません。ここを混同していると、cachePolicy="memory-disk" を指定しているのに何も効いていない状態が起こります。

// これは「保存先」を指定しているだけで、キーの安定性には一切関与しません
<Image
  source={{ uri: signedUrl }}   // 毎セッション文字列が変わる
  cachePolicy="memory-disk"     // 保存はされるが、次回は別キーとして扱われる
  style={styles.thumb}
/>

保存はされます。ただし翌日には参照されないエントリとして残り、ディスク上限を押し上げるだけの死蔵データになります。容量が膨らむ側の症状はRork 製アプリの「書類とデータ」が数 GB に膨らむときの原因と対処で扱っていますが、署名付きURLが絡む場合は上限調整では止まりません。原因が容量ではなくキーだからです。

✦

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

この記事の続きを読む

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

この記事で得られること
✦署名付きURLに移行してから通信量が増えた原因を特定でき、どこを直せば止まるかが判断できるようになります
✦expo-image の source.cacheKey / writeToCacheAsync / readFromCacheAsync を、実際の型どおりに使い分けられるようになります
✦キー設計を変えた場合にヒット率がどこまで戻るかを、自分のアクセス分布の指数から見積もれるようになります
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

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

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

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

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

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

関連記事

⬡ 開発ツール2026-09-04
EAS の secret は「アプリに入れない」設定ではありません — 接頭辞と可視性を別々に決める
EXPO_PUBLIC_ の接頭辞は成果物に入るかを決め、EAS の可視性は誰が読めるかを決めます。二つを重ねたときに OTA 更新でだけ値が消える筋道と、出荷前に自分の手で確かめる手順をまとめました。
⬡ 開発ツール2026-08-22
一括置換は全ファイル成功しました。壊れたのは、消さなかった行のほうです
生成コードに一括置換をかけると、一致した行ではなく隣の行が壊れます。運用中のプロジェクトで実際に起きた破損と、置換の不変条件を検査する20行のガードスクリプトをまとめました。
⬡ 開発ツール2026-08-14
Expo SDK 57 に上げる前に、prebuild で消えるネイティブ変更を洗い出す
Expo SDK 57 では expo prebuild が既定で ios と android を消してから再生成します。手編集を上げる前に洗い出す方法、config plugin への移し替え、57.0.9 で解消したメモリ回帰までを実務の順序でまとめました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます