ぼっち大学生のプログラミング日記

得た知識やコードを並べることで自身の成長を試みるためのブログです。

静的ファイル (Resource ファイル) のキャッシュについて

jsファイルやcssファイルなどの静的ファイルは,一度サーバーを立ち上げるとサーバーにキャッシュが残ってしまうため,静的ファイルに変更を加えたとしても前のバージョンが適用されてしまうということが多々あります.

 

Webアプリケーションが運用できるまで出来上がっていればよいのですが,開発中だといちいちサーバーをクリーンしなければいけないのでかなり面倒ですね.

 

僕もこの壁に当たったことがあり,自動的に静的ファイルが更新されるようにクラスを作成しました.

 

 

1つ重要なのが,静的ファイルに異なるパラメータを渡すと,違うファイルとして扱われるということです.

以下に例を示します.

 

style.css

style.css?20190526

 

実はこの2つのファイルは,参照は同じだけど違うファイルとしてみなされます.

 

これを利用して,自動的に現在時刻をパラメータとして渡せば,新しいバージョンの静的ファイルが適用されるというわけです.

 以下のようなクラスを作成します.

 

 

f:id:champon1020:20190526181035p:plain

 

この戻り値が,パラメータ付き静的ファイル名となります.

あとは,これをアプリケーションスコープに格納すれば万事OKです.

HTML側で格納された値を取り出しましょう.

 

f:id:champon1020:20190526181611p:plain

 

今回はThymeleafを使って取り出してあります.

cssの配置は 

    webapp -> resources -> css -> ~.css

って感じです.(maven)

 

 

 

とまぁ,自作で静的ファイルにパラメータを渡していたわけですが...

 

数週間後にSpring管理下でできる実装クラスを見つけてしまいました笑

https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/servlet/resource/VersionResourceResolver.html

 

VersionResoruceResolverという実装クラスは,その名の通りリソースファイルのバージョン管理をしてくれるクラスです.

原理はさっき僕が作ったパラメータ付きの静的ファイルを作るのと同じで,乱数がcssファイルの末尾に自動的に付加されます.

 

web.xmlservlet.xmlの設定は以下のようになります.

 

f:id:champon1020:20190526185446p:plain

f:id:champon1020:20190526213935p:plain



 

web.xmlではリソースファイルのURLフィルターを追加し,servlet.xmlではVersionResourceResolverを実装します.

 

もちろんJavaファイルでも実装できますよ!

 

あとは,呼び出すだけです.

 

f:id:champon1020:20190526185656p:plain

 

今回はThymeleafで実装したのでよくわからない感じでcssを参照することになりましたが,jspの場合はもう少し簡単なコードになってた気がします.

 

 

 

結論:Spring最強