Cache Control (ja)

koseki edited this page Sep 13, 2010 · 28 revisions

キャッシュのコントロール

ウェブサーバ側で各コンポーネントに対して遠い未来の Expires ヘッダを設定し、ブラウザの HTTP リクエストを減らすことは、ウェブサイトのパフォーマンスを確保する上で高い効果があります。ただし、それを実現するためには、コンポーネントが更新された際にコンポートの名前を変更し、ブラウザに最新のコンポーネントを再度キャッシュさせる必要があります。

SmallCage では、ファイル名の中にバージョン番号を埋め込み、バージョン番号付きのファイル名をサイト全体での参照関係を維持する形で更新できる仕組みを提供しています。

実装上の制限

現時点では、バージョン番号にSubversionのリビジョン番号を利用しています。 --latest が付いたファイル、もしくは --latest が付いたファイルを生成するsmcファイルが、Subversionにコミットされている必要があります。

今後、Subversion以外の方法でバージョン番号を設定できるように機能を追加、修正する予定です。

1.ファイル名の変更

キャッシュをコントロールするファイル名を変更します。例えば foo--latest.js のように --latest を付けた名前に変更します。

2. リンクの書き換え

HTMLCSS 等、キャッシュするファイルにリンクする場合は、例えば src="foo--latest.js" のように、ファイル名の通りリンクします。開発環境では --latest が付いたファイル名がそのまま参照されるので、通常通りブラウザでのテストが可能です。

3. ライブラリのインポート

smc import cache を実行すると、キャッシュコントロールに必要なファイル一式がインポートされます。

/_smc/filters
/_smc/filters/cache_filter.rb
/_smc/filters/filters.yml
/_smc/rakelib/cache.rake

4. ファイル名、リンクの置換

公開サーバでのデプロイの際に rake cache:update を実行します。 rake cache:update は、次の2つの処理を行います。

  • —latestが付いたファイルをバージョン番号付きのファイルにコピー。
    • 例) foo--latest.jsfoo-123.js にコピー。
  • smc updateを実行し、ソースに含まれる—latest付きのリンクをバージョン番号付きに置換。
    • 例) src="foo--latest.js"src="foo-123.js" に置換。

( _smc ディレクトリ以下に Rakefile がある場合は、 cd _smc でディレクトリを移動してから rake cache:update するか、もしくは-fを指定して rake -f _smc/Rakefile cache:update を実行します。)

5. 古いファイルの削除

古いバージョン番号付きのファイルを削除するには rake cache:delete_old を実行します。(表示中のページでのリンク切れを避けるため、 cache:update 時に自動で削除はしないようになっています。)

キャッシュコントロールの為に生成された全てのファイルを削除するには rake cache:clean を実行します。

対象になる拡張子

以下のファイルがキャッシュコントロールの対象になります。

  • *--latest.css
  • *--latest.js
  • *--latest.png
  • *--latest.jpg
  • *--latest.gif
  • *--latest.ico

cache:update タスクの詳細

default--latest.css.smc のようにsmcで出力するファイルがあり、その中でも logo--latest.png が参照されているといった場合のために、 smc update とバージョン番号付きファイルへのコピーを2回繰り返すことがあります。1回目で全てのファイル名を確定し、2回目で内容を確定します。

  1. --latest がついたsmcファイルが見つかったら smc update を実行する。
  2. バージョン番号付きのファイル名でコピー。
    • この段階で全ファイル名が確定します。
    • バージョン番号は smc ファイルがあればそちらを参照します。
  3. smc update でリンクを置換。
  4. バージョン番号付きのファイルに再度コピー。

1と4は、 --latest 付きのファイルがsmcで生成される場合のみ実行されます。

キャッシュフィルタの詳細

smc update の最後に --latest が付いたリンクをバージョン番号で置換するのが、キャッシュフィルタの機能です。ソースが以下の正規表現にマッチしたら、

%r{(["'])(?!https?://)([^"']+--latest\.(?:css|js|png|gif|jpg|ico))(["'])}

数字の付いたファイルを探しに行き、一番大きいもので置換します。

You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
Press h to open a hovercard with more details.