css/app.css?201905201034
Laravel Mixのコンパイルではこれを自動化出来ます。
詳しくはドキュメントを読んでください。
バージョン付け/キャッシュ対策 | アセットのコンパイル(Laravel Mix) 5.5 Laravel
試してみる
webpack.mix.js に version() を追加します。
mix.js('resources/js/app.js', 'public/js')
.sass('resources/sass/app.scss', 'public/css')
;
↓
mix.js('resources/js/app.js', 'public/js')
.sass('resources/sass/app.scss', 'public/css')
.version()
;
さらにテンプレートから呼び出す際に mix() を使うようにします(デフォルトで使われていると思います)。
<link rel="stylesheet" href="css/app.css"></script>
↓
<link rel="stylesheet" href="{{ mix('css/app.css') }}"></script>
これが出来たら、コンパイル。
npm run dev
どうなるのか?
public直下に「mix-manifest.json」というファイルが作られます。中身はこんな感じ。
{
"/js/app.js": "/js/app.js?id=aaee48fee431a0c6c25f",
"/css/app.css": "/css/app.css?id=35978cdc6a38f7d64fbb"
}
描画するときには、これに従って「/css/app.css」が「/css/app.css?id=35978cdc6a38f7d64fbb」に変換されて読み込まれるという仕組み。id部分がコンパイルごとに更新されるので、コンパイルとコンパイルの間はキャッシュが使われ、コンパイルが行われるとキャッシュが更新されるという仕組みになります。手動だとついidを更新し忘れて慌てるので、これは便利。
開発環境では要らない、本番環境だけ欲しいという人は、ドキュメントで紹介されている「npm run productionのときだけバージョン付けをする」方法を使うと良いと思います。
if (mix.inProduction()) {
mix.version();
}
ちなみに:CloudFrontを使っている場合
CloudFrontのキャッシュが強力すぎるので、これまではcssやjsはディレクトリごとキャッシュから外していましたが、バージョン付けを行うことでCloudFrontのキャッシュも更新されるようになったので、すべてキャッシュするように設定変更しました。おかげでより高速になりました。コンパイルしてまとめたCSSやJSは重いですからね……