複数のCSSをまとめるApacheのハンドラ
ふと思いたって適当に書いてみました。
小さく分割されたバラバラなcssファイルを、1つのファイルに連結して出力します。更新日時を見て、分割ファイルのいずれかが更新されてたら、連結ファイルを書き換えます。(ついでにminifyもカマしてみてますがこれはどうかな?)
もちろん開発環境向けなわけですが、本番環境にはそのまま連結ファイルを上げればいいってことで。
今のとこ、configでディレクトリを指定してその下のcssファイルを全部読むって感じになってるんだけど、これだと結局1種類しかできないので素敵じゃないかもと思うので、どうしようか考え中です。
package Apache::ConcatCSS; use strict; use Apache::Constants qw(:common); use Apache::Log (); use CSS::Squish; use CSS::Minifier qw(minify); sub handler { my $r = shift; return DECLINED unless $r->content_type() eq 'text/css'; my $log = $r->server->log; my $file = $r->filename; my $dir = $r->dir_config('CSSBaseDirectory'); my @files = <$dir/*.css>; return DECLINED if ( -e $r->finfo && !if_modified( ( stat _ )[9], @files ) ); my $squished = CSS::Squish->concatenate(@files); my $minified = minify( input => $squished ); open my $out, '>', $file or return SERVER_ERROR; print $out $minified; close $out; $r->send_http_header(); $r->print($minified); return OK; } sub if_modified { my $mtime = shift; for my $css (@_) { return 1 if $mtime < ( stat $css )[9]; } return; } 1; __END__ =head1 NAME Apache::ConcatCSS =head1 SYNOPSIS # in httpd.conf <Location /css> SetHandler perl-script PerlHandler Apache::ConcatCSS PerlSetVar CSSBaseDirectory /path/to/css_directory </Location> =head1 DESCRIPTION =head1 METHODS =head1 AUTHOR Hiroaki Yoshida E<lt>yoshidaster at gmail.comE<gt> =head1 SEE ALSO L<CSS::Minifier> L<CSS::Squish> =cut