静的ファイルを配信する場合にはパスにバージョンを含めるのがいいんじゃなかろうか
最近、思っていることを。
なお、バージョンとは言ってますが、Gitのコミットハッシュ値でもUnixタイムスタンプでも何でもいいです
静的ファイル配信パターン
WEBアプリで静的ファイルを配信するパターンは以下3つあるんじゃないかとなんとなく思っています。
1. パスに特になにもつけない
<link rel="stylesheet" type="text/css" href="/static/css/hoge.css" /> <img src="/static/img/hoge.png" /> <script src="/static/js/hoge.js"></script>
2. パスにクエリストリングでバージョンを付ける
<link rel="stylesheet" type="text/css" href="/static/css/hoge.css?v=1" /> <img src="/static/img/hoge.png?v=1" /> <script src="/static/js/hoge.js?v=1"></script>
3. パスにバージョンを含める
<link rel="stylesheet" type="text/css" href="/static/v1/css/hoge.css" /> <img src="/static/v1/img/hoge.png" /> <script src="/static/v1/js/hoge.js"></script>
この中でどれがいい?
1はいろいろ辛そうなのでなしとして、2よりも自分は3がいいと考えています。
以下、その理由をば。
任意のタイミングで確実にリリースできる
これは2のパターンでも当てはまるので、3だけではないですが。
リリースしたタイミングで新しいファイルとしてロードされます。
クライアントのキャッシュを気にしないでも大丈夫。
新旧のバージョンが混在できる
LBから切り離して、アプリサーバを1台ずつローリングアップデートするパターンなんかでも問題なく。
古いアプリサーバにアクセスしたクライアントは古いバージョンのファイルを見て、新しいアプリサーバにアクセスしたクライアントは新しいバージョンのファイルを見て、動作します。
2だと(初めてアクセスした|キャッシュの期限が切れた)クライアントがサーバ側が古い状態で、最新の静的ファイルにアクセスしてしまう可能性があるかと(ブルーグリーンデプロイメントしているなら問題ないかもしれませんが)
事前にリリースできる
現在動作しているアプリには影響を与えず、安心安全に本番環境に事前にリリースできます。
これは2だと無理ではないでしょうか。
補足
ディレクトリではなく、ファイルにバージョンを含めるパターンはどうか?
<script src="/static/js/bundle-abcdefg1234xxxxxxxx.js"></script>
的な。CSS/JSはいいですが、画像のことを考えるとディレクトリにバージョンを含めたほうがいいんじゃないかと思います。
まとめ
久しぶりにブログを書きました。
もし違うよとかもっといい方法があるよということであれば、コメントしていただければ幸いです。
ではでは。