なっく日報

技術やら生活やらのメモ

静的ファイルを配信する場合にはパスにバージョンを含めるのがいいんじゃなかろうか

最近、思っていることを。

なお、バージョンとは言ってますが、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はいいですが、画像のことを考えるとディレクトリにバージョンを含めたほうがいいんじゃないかと思います。

まとめ

久しぶりにブログを書きました。

もし違うよとかもっといい方法があるよということであれば、コメントしていただければ幸いです。

ではでは。