blog

初めての Middleman シリーズ初めてのMiddleman:静的サイトのキャッシュとasset_hash拡張を使ったキャッシュのパージ

    • Ryuichi Nonaka
    この記事は書かれてから1年以上経過しており、内容が古い場合があります。

    前回の記事初めてのMiddleman:設定についてでMiddlemanの設定について一通り覚えました。今回は静的サイト運用時のキャッシュとMiddlemanのasset_hash拡張を使ったキャッシュのパージについてメモしておきます。

    静的サイトではExpiresヘッダーやCache-Controlヘッダーを使うことでユーザーのクライアント環境にアセットファイルをキャッシュさせることで再ダウンロードをさせることなくサイトを閲覧させることができます。パフォーマンスが良くなりAWSのような従量課金のホスティングサービスを利用している場合、コスト削減にもなります。

    ただし、アセットファイルを更新した際にキャッシュされたファイルを上手く更新できないと問題を引き起こす可能性があります。Middlemanは1つの方法としてキャッシュをパージするための拡張asset_hashをプリインしています。

    asset_hashとは

    asset_hashは画像やCSSなどのファイル名にhash値を追加し一意の名前のアセットファイルを生成します。ビルド後のファイルには元のファイル名のファイルは存在せず、このhash値の付いたファイルだけがビルドされます。

    sample.png -> sample-32aw43.png
    

    asset_hashを有効にする

    asset_hashはconfig.rbに設定を追記します。

    configure :build do
      activate :asset_hash
    end
    

    これだけでビルドされたファイルのファイル名が変わります。

    CSSや画像のリンクにasset_hashを適用するには

    CSSや画像のリンクにhash値の付いたリンクを付けるにはアセットヘルパーを使います。ビルド先に元ファイルが作られないため、アセットヘルパーを使わないリンクはすべて403になってしまうため注意が必要です。

    <html>
    <head>
      <%= stylesheet_link_tag 'layout' %>
      <%= javascript_include_tag 'application' %>
      <%= favicon_tag 'images/favicon.png' %>
    </head>
    <body>
      <p><%= link_to 'Blog', '/blog', :class => 'example' %></p>
      <p>Mail me at <%= mail_to 'fake@faker.com', "Fake Email Link", :cc => "test@demo.com" %></p>
      <p><%= image_tag 'padrino.png', :width => '35', :class => 'logo' %></p>
    </body>
    </html>
    

    asset_hashさせたくない場合

    asset_hashの対象外にしたいファイルにはignoreオプションを使います。

    configure :build do
      activate :asset_hash do |options|
        options.ignore = [/^assets\/images\/teaser\/eyecatch\.jpg/]
      end
    end
    

    OGPイメージなどはヘルパーが使えないため、今のところ除外するしかありません。OGP系の拡張機能で対応しているものがあるかもしれませんね。良い対応方法をご存じの方がいればコメントいただけると助かります。

    次回:初めてのMiddleman:Middleman::S3Syncで使うアクセスキーの管理方法について

    シリーズ

    1. 初めてのMiddleman:rbenv, bundler 環境でMiddlemanを使ったHello World
    2. 初めてのMiddleman:レイアウト機能でレイアウトとコンテンツを分離する
    3. 初めてのMiddleman:パーシャルを使ったコンテンツのモジュール化
    4. 初めてのMiddleman:SCSSのコンパイルとテンプレートの基礎
    5. 初めてのMiddleman:Sass MixinライブラリのBourbon, Neatを導入してみる
    6. 初めてのMiddleman:データファイルとデータファイルを使った動的ページ生成
    7. 初めてのMiddleman:サイトにブログ機能を追加する
    8. 初めてのMiddleman:Amazon S3にビルドされたファイルを同期する
    9. 初めてのMiddleman:HTML/CSS/JS/画像をビルド時に圧縮する
    10. 初めてのMiddleman:設定について
    11. 初めてのMiddleman:静的サイトのキャッシュとasset_hash拡張を使ったキャッシュのパージ
    12. 初めてのMiddleman:Middleman::S3Syncで使うAWS IAMユーザーのアクセスキー管理方法について
    13. 初めてのMiddleman:Helperを使ってGravatarのアイコンを表示する
    14. 初めてのMiddleman:アセットパイプラインを使った外部アセットファイルの読み込みと結合
    15. 初めてのMiddleman:Bowerを使ってjQueryなどのライブラリをロードする
    16. 初めてのMiddleman:スケルトンを自作する方法
    17. 初めてのMiddleman:Middleman Blogの記事データを使いやすく管理する方法
    18. 初めてのMiddleman:Middleman-blogのシングルブログを前提としたSkeletonを作った
    19. 初めてのMiddleman:Middleman-blogでマルチブログを試してSkeletonを作った
    20. 初めてのMiddleman:Markdown EngineをkramdownからRedcarpetに切り替える
    21. 初めてのMiddleman:RedcarpetとMiddleman::Rougeを使ったシンタックスハイライト
    22. 初めてのMiddleman:Middleman-Syntaxを使ったシンタックスハイライト
    23. 初めてのMiddleman:Middleman-Blogで記事毎に画像を管理する方法
    24. 初めてのMiddleman:Gulpを使ってサムネイル画像を生成する
    25. 初めてのMiddleman:Middleman-OGPのOGP画像指定を相対パスで設定する
    26. 初めてのMiddleman:Middleman-OGPでMiddleman-BLogにOGPを設定する
    27. 初めてのMiddleman:Middleman-Titleでタイトルタグを手軽に設定する
    28. 初めてのMiddleman:多言語化 - 言語ファイルの作成とヘルパーの埋め込み
    29. 初めてのMiddleman:Middleman-blogにカテゴリやシリーズなどのカスタムコレクションを追加する方法
    30. 初めてのMiddleman:Bowerで管理されているフォントファイルをインポートする

    コメント・フィードバック