【メモ】デザイナーの人が「CSSファイルがキャッシュされて更新が反映されない」と嘆いていたので

今さらな話ですけどなんかSlackでそんな話が出ててGist作ったのでついでにメモっておきます。






解決策:ファイルの更新日時を付与して呼び出す

<link rel="stylesheet" href="/css/sample.css?1632201991">

ありふれた手段ですがこれが一番最適ですよね。シンプルだし。他に検討する必要もないです。

で、それをデザイナーが更新しているテンプレートファイル(Smarty3)上で実現するための方策として相談を受けたエンジニアの1人が提案していたのがこれ。

<link rel="stylesheet" href="/css/sample.css?{$smarty.now}">

これやると確かにキャッシュされなくはなるけど、毎回キャッシュ更新するのはやりすぎじゃないの?



Smarty3での解決策:動的プラグインを使いましょう



動的プラグインで追加する関数名が「filemtime」でいいのかどうかについては議論の余地はあると思いますが、これならスマートに解決出来るでしょう。今までやってなかったのが不思議ですが、誰もあんまり気にしてなかったのかな。難点をあげるとすればファイルを必ず絶対パスで指定しないといけないことかなあ。サーバ構造に疎いデザイナーの人でもそれぐらいは大丈夫だとは思うんですけどね。


ポイント:クラスの中で使うときは$thisを渡す

普通にプログラムで使うときはドキュメントにあるとおりの使い方で良いんですけど、


registerPlugin() — 動的にプラグインを登録する

registerPlugin() | Smarty


クラスの中で使うときには工夫が必要でした(Gist内の「index.class.php」で記述)。ドキュメントによると$thisのところをオブジェクトの参照やクラス名にすれば特定のクラスの関数も指定出来るらしいです。試してませんけど。



おまけの感想

デザイナやエンジニアの技術力がどうとか言うよりもむしろ、Smartyが既に「失われた技術」になりつつあるんじゃねーかなーという気がしたお話しでした。CakePHPはテンプレートエンジンないんだっけ。LaravelならBladeだしなあ。Smartyも使いこなせば便利ですけどね、でももう枯れすぎたかなあ。