直したのに画面が変わらない — キャッシュの仕組み

この記事は、プログラミングやバイブコーディングをする上で最低限身につけたほうがよい IT の実践的な知識を 1 から身につける「IT 基礎知識講座の一部」です。
直したのに変わらないのは、古いコピーがどこかに残っているからです。ブラウザ・CDN・公開サーバーの 3 か所の切り分けと、確実に届かせる方法を図解で確かめます。

この記事は、直したのに画面が変わらないという場面を扱います。

コードを直してデプロイしたのに、開いてみると前のままだった、というときの話です。

原因はたいていコードではなく、どこかに残っている古いコピーです。

直したのに変わらないとき、古いコピーはどこかにある
直したのに変わらない自分のブラウザの中配信の仕組みの中公開サーバーの中読み込み直すコピーを消させる置き直す自分だけ全員全員
左が症状。真ん中の 3 か所のどこかに古いコピーが残っていて、右が消し方です。いちばん右が、そのとき誰に古く見えているかです。

自分だけが古いのか、全員が古いのかで、どこに残っているかを見分けられます。

キャッシュとは — 取っておいたコピーを、取りに行かずに返す仕組み

キャッシュ(cache。一度取り寄せたものを近くに取っておき、次からは取りに行かずにそれを返す仕組み)は、同じものを何度も取りに行かないためにあります。

一度取り寄せたものを手元に置いておき、2 回目からはそれを使います。

速さと引き換えに、新しくなったことに気づかない時間ができます。

この取っておく時間が有効期間(max-age。取っておいたコピーを、取りに行かずに使ってよい時間)です。

有効期間が切れるまでは、サーバーを直しても手元のコピーが使われ続けます。

画像や CSS のように変わりにくいものほど、長めに設定されています。

同じ直しでも、有効期間の中か外かで結果が変わる
サーバーのapp.css を直す有効期間の中に開く手元のコピーをそのまま使う直した内容は出ない有効期間が切れてから開くサーバーに取りに行き直す直した内容が出る
左がサーバー側で直した時点です。上下の枝は、そのあと画面を開いたのが有効期間の中か外かの違いで、出るものが変わります。

直したのに変わらない時間があるのは、有効期間がまだ切れていないからです。

キャッシュは古いコピーを返す仕組み

キャッシュとは、一度取り寄せたものを近くに取っておき、次からはそれを返す仕組みです。

毎回取りに行かないので速くなりますが、その間にサーバー側が新しくなっても気づかないので、直したのに変わらないという状態が起きます。

コピーが置かれる 3 か所 — 自分の中・配信の途中・サーバーの中

コピーが置かれる場所は 1 つではありません。

利用者に近いほうから順に 3 か所あり、入れ子になっています。

いちばん内側の、自分のブラウザが持つコピーがブラウザキャッシュ(browser cache)です。

古いコピーが残りうる 3 か所
画面が出るまでに通る場所
1. 利用者のブラウザの中(ブラウザキャッシュ)
  • その人の端末にだけ残る
  • 読み込み直すと取り寄せ直せる
  • 自分だけ古いときはここ
2. 配信の仕組みの中(CDN)
  • 利用者に近い場所に置かれたコピー
  • 全員が同じ古いものを見る
  • 消させる操作をするまで残る
3. 公開サーバーの中
  • 置いた成果物そのもの
  • デプロイが失敗していれば前のまま
  • ここが古いなら全員が古い
外側ほど遠い場所。利用者に近い内側から順に確かめると、どこで止まっているかが分かる。

2 番目のCDN(Content Delivery Network。利用者に近い場所にコピーを置いて配る仕組み)は、多くのデプロイ先に最初から組み込まれています。

この 3 か所は、消し方も効く範囲も違います。

CDN のコピーを消させる操作がパージ(purge。配信の仕組みが持っているコピーを消し、取り寄せ直させること)です。

デプロイのたびに自動でパージする設定になっていることもあります。

強制的に読み込み直すとは

ふつうの再読み込みでは、手元のコピーがそのまま使われることがあります。

取り寄せ直させる操作はスーパーリロード(強制再読み込み)と呼ばれ、確かめるだけなら、履歴を残さない window で開いても同じことができます。

自分だけ古いのか、全員が古いのかで切り分ける

3 か所を上から順に試すより、先に範囲を確かめるほうが早く終わります

見るのは、自分以外の人にも古く見えているかどうかです。

誰に古く見えているかで、原因の場所が決まる
ほかの人にも古く見えるか自分だけ古い全員が古い手元を読み込み直すCDN と成果物を確かめる
左が確かめること。自分だけ古いなら手元、全員が古いなら外側です。右が次に行う操作です。

自分だけなら、原因は自分のブラウザの中にしかありません。

ほかの人にも古く見えるなら、手元をいくら読み込み直しても変わりません。

いちばん下は、そもそも新しいファイルが公開サーバーに届いていない場合です。

ビルドで失敗していれば、公開されているのは前の成果物のままです。

読み込み直して直ったからといって、解決とは限らない

自分の手元で読み込み直すと新しくなりますが、それは自分の 1 台のコピーが入れ替わっただけです。

利用者の端末には、有効期間が切れるまで古いコピーが残ります。

ファイル名を変えると、古いコピーが使われなくなる

消して回るのではなく、そもそも古いコピーが使われないようにする方法があります。

中身を変えたときに、ファイル名も一緒に変えるやり方です。

同じ名前で置き換えるか、名前ごと変えるか
app.js の中身を直す同じ名前で置き直す名前も変えるapp.a1b2.js手元のコピーが使われる手元に無いので取りに行く
上が同じ名前のまま中身だけ変えた場合で、手元のコピーがそのまま使われます。下は名前が変わるので、手元に無いものとして取りに行きます。

ファイル名の一部を中身から計算した文字に置き換えると、中身が変わるたびに名前も変わります

名前が違えば、手元のコピーは別のファイルなので使われません。

この名前を付ける作業は、ビルドのときに自動で行われます

自分で名前を考える必要はありません。

ファイル名前の付け方有効期間の決め方
index.html変えない短くする
app.a1b2.js中身が変わると名前も変わる長くしてよい
画像などの素材中身が変わると名前も変わる長くしてよい

入口の index.html だけは名前を変えられないので、有効期間を短くしておきます。

中で読み込むファイルの名前が新しくなっていれば、そこから先は自動で新しいものが届きます。

手前で見つかった時点で、それより先へは取りに行きません。

だから 1 か所でも古いコピーが残っていると、新しいものは届きません。

消して回るより、名前を変えるほうが確実

中身を変えたときにファイル名も変われば、手元のコピーは別のファイルなので使われません。

この名前付けはビルドが自動で行うので、名前を変えられない入口のファイルだけ有効期間を短くしておきます。

QUIZ

理解度チェック

まずは1問ずつ答えてみましょう。

Q1デプロイし直したのに、自分のブラウザでは前の画面のままでした。別の端末で開くと新しくなっています。原因の場所はどれですか。

Q2キャッシュの有効期間が切れていないとき、ブラウザは何をしますか。

Q3中身を変えたときにファイル名も変わるようにしておくと、何が起きますか。