Web開発におけるCacheについて調査・まとめ

Web制作・Web開発でよくある Cache対応 ( Cache Buster ・Cache Busting )
Client側の端末に Cacheが残っていると、開発によって Updateされても即時に反映されず、古いバージョンのまま表示されてしまうことがあります。
そのため、Cacheにも考慮した対応を Webサイトや、Webアプリ開発者はする必要があります。
ブラウザキャッシュをさせずに確実に更新させる方法として、
一般的なものに、Cache Buster (キャッシュ・バスター)という対応方法があります。
Cache Buster (キャッシュ・バスター)は、更新したタイミングで、読み込むファイル名やファイルのPathを Updateするなどの対応によって、更新されたファイルを読み込ませるようにする方法です。
Cache Buster (キャッシュ・バスター)の具体的なやり方には、次のようなものがあります。
- クエリパラメーターを使ってバージョン管理番号などを付与する(例:script.js?ver=2)
- タイムスタンプなど動的な値を埋め込む方法もある。
- ファイル名にバージョン管理番号を入れる(例:script.v2.js)
- ファイルパスにバージョン管理番号を入れる(例:/v2/script.js)
中でも、よく使用されるのが、1番目の 更新したファイルに GETパラメータ( クエリパラメーター )を付与することで、更新されたファイルを読み込ませるようにする方法です。
<!-- CSS -->
<link href="style.css?ver=1.0.1" rel="stylesheet" type="text/css">
<!-- JavaScript -->
<script src="script.js?ver=1.0.1" type="text/javascript" ></script>
<!-- 画像 -->
<img src="sample.jpg?ver=1.0.1" alt="Sample">
( 追記 )
こちらの記事で、Path文字列の末尾にCacheBuster (キャッシュ無効化)のタイムスタンプを追加する方法を記載しました。
JavaScriptで、URLのPath文字列にクエリパラメーター(?)があるかどうかの判定や作成する方法
【 引用・参考 】
CSS・JSファイルの Cache対応について
もうキャッシュの削除をお願いしたくない!CSS・JS・画像のブラウザキャッシュさせない方法

HTML の metaタグで、ページのキャッシュを無効にする
meta要素で、文書のキャッシュを無効にすることができます。この要素はhead要素の中で使用します。
この指定により、常に最新の情報が表示されるようになることが期待されます。
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">

Nuxt.js の場合の Cache-Control の追加方法
Nuxt.jsで、Cacheを保存しない設定をするには、NuxtAppで作成するPageに対して、
cache-control: no-cache
をRequestHeaderに追加するだけで完了します。
まずはnuxt.config.js
に以下を追記します。
・・・
serverMiddleware: [
'~/serverMiddleware/deliveryFrontend.js',
],
・・・
続いて、serverMiddleware
ディレクトリを作成して、その中にdeliveryFrontend.js
を作成して、以下の内容を追加します。
/** Client端末に Updateを即時反映させるために Cache を Offにする設定を追加する */
const express = require('express')
/** Express_Instanse */
const app = express()
app.use(function (req, res, next) {
// Cacheを保存しない設定を追加する
res.setHeader('cache-control', 'no-cache, no-store, must-revalidate')
next()
})
// ModuleをExportして、参照できるようにする。
module.exports = app

iframeで埋め込んでいるコンテンツの Cacheについて
iframeで埋め込んでいるコンテンツも Cacheが効いているので、その対応も場合によっては必要になります。

Cache-ControlのためのRequestHeaderの設定
- ブラウザに一切、キャッシュさせたくない場合
- サーバからクライアントへのHTTP応答ヘッダを
Cache-Control "no-cache"
にする。
- サーバからクライアントへのHTTP応答ヘッダを
- ブラウザにキャッシュさせるけど、変更ないか都度確認するようにしたい場合
- サーバからクライアントへのHTTP応答ヘッダに
Cache-Control "max-age=0"
とExpires "Mon, 26 Jul 1997 05:00:00 GMT"
をSetする。 - ブラウザ毎に片方しかサポートしていない場合があるので、両方のヘッダを指定しておいた方がいいです。
- 最初から既に期限切れ、という意味です。
- サーバからクライアントへのHTTP応答ヘッダに

Cache Control 関連の概念・意味についてまとまっているスクラップ記事
ここがわかりやすいので、まんま引用します。
キャッシュの流れ
- レスポンスを保存する
- 保存したレスポンスを再利用する
キャッシュの種類
- local (private) キャッシュ
- 特定のユーザー専用のキャッシュ
- ブラウザのキャッシュなどが該当する
- shared キャッシュ
- 複数のユーザがレスポンスを再利用するためのキャッシュ
- ProxyやCDNのキャッシュなどが該当する
キャッシュの設定
- public
- レスポンスをどのキャッシュ (local、shared ともに) にも保存し、再利用できる
- private
- レスポンスを local キャッシュのみに保存し、再利用できる
- no-cache
- レスポンスをどのキャッシュ (local、shared ともに) にも保存できる
- キャッシュが stale (有効期限が過ぎている) かどうかに関わらず、再利用時に必ずサーバーに確認を取る必要がある
- no-store
- レスポンスをどのキャッシュ (local、shared ともに) にも保存させない
- 個人情報などを扱うページについては、localキャッシュのみを許可する private を設定する。どこにもキャッシュされたくない場合は、no-store を設定する。(no-cache ではない!!)
- ちなみに、なにもCache-Control を設定しない場合、レスポンスはどこかでキャッシュされる可能性があるので、キャッシュされたくない値を使うときは注意する。