Template::Toolkitでファイルのタイムスタンプを付加

Railsだとimage_tagを使えば画像ファイルの更新日時をくっつけて

<img src="foo.jpg?1234567890" />

みたいにしてくれて、画像が更新されればブラウザは画像をキャッシュしていても新しくリクエストしてくれたりする。で、Catalyst/Template::Toolkitだとどうやるんだろう?ってことで書いてみた。

これをlib/MyApp/Views/Pluginに置いて、MyApp::View::TTとかに書かれているPACKAGE->configに

PLUGIN_BASE => 'TclandSp::View::Plugin',

を追加して各テンプレートで

[% USE Ts %]

すれば、例えば

[% Ts.ts('/static/images/logo.jpg') %]

/static/images/logo.jpg?1234567890

になる。これをimgタグと組み合わせて

<img src="[% Ts.ts('/static/images/logo.jpg') %]" />

とかするといい。

以下メモ:

  • -M演算子perlインタプリタが起動してからの相対日数を返すので、606024=86400をかけて、さらにインタプリタの起動した時刻$^Tを足し合わせることで絶対時間が得られる
  • MyAppが入っちゃうのが残念。うまく回避したい。
  • imgタグやlinkタグもまとめて出力してくれるメソッドも定義したけど、altやwidth、heightなんかも指定したくなったときに不便だなと思ってもっぱらTs.tsだけ使ってる。
  • 複数テンプレートで共通で使うプラグインはPRE_PROCESSで呼んでるテンプレート中でまとめてUSEすると便利。

やっぱりフルスタックRailsはデカいけど便利だ。