S3ファイルのキャッシュ無効化 - fetchで常に最新ファイルを取得する
問題
S3にアップロードしたconfig.jsonを修正したのに、ブラウザがキャッシュされた古いバージョンを表示し続けます。CloudFront CDNが入るとさらに長引きます。
解決方法
// 方法1: タイムスタンプクエリパラメータ(最もシンプル)
function addCacheBuster(url) {
const t = new Date().getTime();
const sep = url.includes('?') ? '&' : '?';
return `${url}${sep}_t=${t}`;
}
// 方法2: fetchオプション + ヘッダー(ブラウザキャッシュ回避)
const response = await fetch(addCacheBuster(CONFIG_URL), {
headers: {
'Cache-Control': 'no-cache, no-store, must-revalidate',
'Pragma': 'no-cache',
'Expires': '0'
},
cache: 'no-store'
});
// 方法3: S3オブジェクトメタデータ設定(サーバー側)
// aws s3 cp config.json s3://bucket/ \
// --cache-control "no-cache, no-store, must-revalidate"
ポイント
- クエリパラメータ
?_t=1234567890を付けるだけでほとんど解決します。CDNはURLが異なれば別のファイルとして扱います。 cache: 'no-store'はfetch APIレベルのキャッシュを無効にします。Cache-ControlヘッダーはブラウザHTTPキャッシュを無効にします。両方設定するのが確実です。- 頻繁に変わるファイルだけキャッシュを無効にすべきです。CSS/JSのような静的アセットまでキャッシュを無効にするとパフォーマンスが低下します。