2006/09/23
TTでFragment Cache(1)
RoRには、テンプレートの一部をキャッシュに突っ込める機能がある。
みたいに書くと、cache do からendまでの間がキャッシュに入り2回目からはexpireするまでキャッシュのものを使う仕組み。
TTにも、Template::Plugin::Cacheみたいなものがあったけれど、これはキャッシュにしたい箇所を別のテンプレートファイルに分けなきゃらなくて、そのページでしか使われないその部分だけをキャッシュするにはちょっと荷が重すぎ。
なんでRailsで上のようなことが簡単にできるかというと、do~end間が遅延評価されるから。
Fragment Cacheの仕組みを実現するには、
そこで、TTで遅延評価されている箇所や構文がないか調べてみると、MACROが近いものそうということに気づけました。
は、StashというTTの変数を扱うための構造へ変換され、partialとvariableは同列の変数情報として扱われる様子。
コンパイルされると、
という構造へ展開されます。sub{} があるので、このpartial変数は呼び出されるまで実行されないことになります。つまり、MACROは遅延評価ができる構造になってる。
TTでFragment Cacheの仕組みを実現するには、MACRO化されたエリアを呼び出してキャッシュの管理を行うプラグインを書けばよさそうということに。
来週がんばって作れればいいけれど。。。
Hello <%= @name %>
<% cache do %>
All the topics in the system:
<%= render_collection_of_partials "topic", Topic.find_all %>
<% end %>
みたいに書くと、cache do からendまでの間がキャッシュに入り2回目からはexpireするまでキャッシュのものを使う仕組み。
TTにも、Template::Plugin::Cacheみたいなものがあったけれど、これはキャッシュにしたい箇所を別のテンプレートファイルに分けなきゃらなくて、そのページでしか使われないその部分だけをキャッシュするにはちょっと荷が重すぎ。
なんでRailsで上のようなことが簡単にできるかというと、do~end間が遅延評価されるから。
Fragment Cacheの仕組みを実現するには、
- まず、<% cache %>に処理が移る
- <% cache %>がキャッシュするものを使うか、新たにレンダリングが必要か判別
- レンダリングが必要な場合は、do end ブロックの処理を実行
- 結果をキャッシュした後、表示
そこで、TTで遅延評価されている箇所や構文がないか調べてみると、MACROが近いものそうということに気づけました。
[% MACRO partial BLOCK %]
Text [% variable %]
[% END %]
は、StashというTTの変数を扱うための構造へ変換され、partialとvariableは同列の変数情報として扱われる様子。
コンパイルされると、
$stash->set('partial', sub {
});
という構造へ展開されます。sub{} があるので、このpartial変数は呼び出されるまで実行されないことになります。つまり、MACROは遅延評価ができる構造になってる。
TTでFragment Cacheの仕組みを実現するには、MACRO化されたエリアを呼び出してキャッシュの管理を行うプラグインを書けばよさそうということに。
来週がんばって作れればいいけれど。。。