Data::JavaScript::Compactor

Data::JavaScript::Compactor - This module provides a means to compact javascript.

ma.laさんのdel.icio.us経由で知ったモジュール Data::JavaScript::Compactor。余計な空白を落としたりコメントを削除したり改行を削除したりしてJavaScript のソースを短くするモジュールです。

どんぐらい短くなるものかと試しに使ってみつつ、簡単なベンチマークも取ってみました。サンプルに使ったのは prototype.js のコード。HTML::Prototype::Useful から吐かせて Data::JavaScript::Compactor に渡して、という感じ。

#!/usr/local/bin/perl
use strict;
use Benchmark;
use String;
use HTML::Prototype::Useful;
use Data::JavaScript::Compactor;

my $p = HTML::Prototype::Useful->new;
my $js = $p->define_javascript_functions;

printf(
    "original: %d bytes\ncompact: %d bytes\n",
    String->new($js)->length,
    String->new(Data::JavaScript::Compactor->compact($js))->length
);

Benchmark::timethis(100, sub { Data::JavaScript::Compactor->compact($js) });

以下、結果。

original: 30093 bytes
compact: 21622 bytes
timethis 100: 17 wallclock secs ( 1.19 usr + 15.57 sys = 16.76 CPU) @  5.97/s (n=100)

1.5倍弱短くなりました。そんなに圧縮率は高くないですね。あと、結構CPU時間を食ってるような気がする。

で、実際に短くしたコードは動くものかと CatalystCatalyst::Plugin::Prototype で Ajax な Hello, World アプリケーションを作って試してみたのですが、残念ながら動かず。あいたた。デバッグしたところ原因になってるのは

  • replace_extra_whitespace
  • join_all

の二つのメソッドで、これらを通ると prototype.js が動かなくなってしまうみたい。まあいずれ直でしょう。簡単な JavaScript なら動くけど、prototype.js ぐらいのコードになってくるとまだ厳しいのかも。メールしておこう。

テスト用アプリケーションを作る途中で TT のプラグイン作ったので CPAN にあげておきました。