2010年 09月 15日

Plack-Middleware-StaticShared

http://github.com/cho45/Plack-Middleware-StaticShared

js とか css を纏めていっこにして配信してくれる Middleware を書きました。Plack::Middleware::JSConcat というが既にありますが、キャッシュコントロールがうまくできなかったのと、css も纏めたかったのでつくった次第です。

      enable "StaticShared",
          cache => Cache::Memcached::Fast->new(servers => [qw/192.168.0.11:11211/]),
          base  => './static/',
          binds => [
              {
                  prefix       => '/.shared.js',
                  content_type => 'text/javascript; charset=utf8',
                  filter       => sub {
                      WebService::Google::Closure->new(js_code => $_)->compile->code;
                  }
              },
              {
                  prefix       => '/.shared.css',
                  content_type => 'text/css; charset=utf8',
              }
          ];
        [% css = [
          '/css/base.css',
          '/css/site.css',
        ] %]

        [% IF debug %]
        [% FOR c IN css %] 
        <link rel="stylesheet" type="text/css" href="[% c %]"/>
        [% END %]
        [% ELSE %]
        <link rel="stylesheet" type="text/css" href="/.shared.css:[% version %]:[% css.join(',') %]"/>
        [% END %]


        [% js = [
          '/js/jquery-1.3.2.min.js',
          '/js/site-script.js',
        ] %]

        [% IF debug %]
        [% FOR j IN js %] 
        <script type="text/javascript" src="[% j %]"></script>
        [% END %]
        [% ELSE %]
        <script type="text/javascript" src="/.shared.js:[% version %]:[% js.join(',') %]"></script>
        [% END %]

みたいに使えます。version + ファイル名 をキーにキャッシュをつくり、クライアントにもほぼ無期限のキャッシュをさせます (update した際に version を更新する必要があります)。

悪意をもった人によって version を変えてアクセスされまくると、キャッシュが溢れそうなので verify する仕組みがほしいですがいいのが思いつかなかったのでとりあえず放置してあります。