2012/01/29

Xslate テンプレートの圧縮

xslate を Webアプリで御利用の皆様におかれましては、こちらで紹介されているようなテンプレートの preload を行っていると思いますが、せっかくなので、同じフェーズで HTML の圧縮を軽く行ってみました。

sub load_all_template {
    my $tx = shift;

    for my $path ( @{$tx->{path}} ) {
        dir($path)->recurse(callback => sub {
            my $file = shift;
            if ( $file =~ m!^$path/(.*$tx->{suffix})$! ) {
                _backup_file($file);
                _filter_file($file);
            }
        });
        dir($path)->recurse(callback => sub {
            my $file = shift;
            if ( $file =~ m!^$path/(.*$tx->{suffix})$! ) {
                $tx->load_file($1);
                _repair_file($file);
            }
        });
    }
}

_filter_file($file); というのがその実体です。
(実際はそこからさらに _filter_template が呼ばれる)

sub _filter_template {
    my $template_ref = shift;

    $$template_ref =~ s/\n[\s\t\r\n]+</\n</g;
    $$template_ref =~ s/>[\s\t\r\n]+</></g;
}

空白やタブ、改行を取っ払っているだけで、テンプレートの記述を壊さないようにゆるく処理しています。

スペースインデントだったので、15% くらい容量減りました。gzip するにせよ、もとが小さいに越したことはないし、プリロード時点で行うのでリクエストの処理速度には悪影響がありません。細かく言えば、吐き出す容量が減る分、処理は少し良くなるはずです。

今回、ばーっと書いてみたのですが、xslate に load_from_string 的なの欲しいと思った。

サイト内検索