JSAN::ServerSide
JSAN.useを使ってjavascript内で動的ロードすると、更新されていないjavascriptファイルも再読み込みされてうれしくない、という時にJSAN::ServerSideを使うようです。
以下のような
#!/usr/lcoal/bin/perl use strict; use warnings; use JSAN::ServerSide; my $server = JSAN::ServerSide->new( js_dir => $ENV{JSAN_PREFIX}, uri_prefix => '/js', ); $server->add( 'Test.More' ); $server->add( 'Class' ); for my $uri ( $server->uris ) { print "$uri\n"; }
ほぼpodのサンプルコードのままのコードを実行すると、
/js/Test/More.js /js/Class.js
というように、template中のscriptタグに指定するのに適した形でスクリプトパスを取得できる。$ENV{JSAN_PREFIX}ていうのはjsan shellで必要な環境変数で、jsan shellからはこのパスの下にJSANモジュールがインストールされます。今回の説明では/usr/local/jsという値になっています。このままでもいいのだけど、これだとスクリプ更新時にユーザ側で強制ロードが必要なので、typesterさんのCatalyst実装のマネしてみました。
$ diff -u /usr/local/lib/perl5/site_perl/5.8.8/JSAN/ServerSide.pm /Users/tkoyachi/lib/perl/JSAN/ServerSide.pm --- /usr/local/lib/perl5/site_perl/5.8.8/JSAN/ServerSide.pm 2006-06-20 00:30:10.000000000 +0900 +++ /Users/tkoyachi/lib/perl/JSAN/ServerSide.pm 2006-06-20 22:11:02.000000000 +0900 @@ -9,6 +9,7 @@ use URI::ToDisk; use JSAN::Parse::FileDeps; use Params::Validate qw( validate SCALAR ); +use File::stat; my %Dependencies; @@ -89,7 +90,15 @@ _follow_deps( $c, \@classes, \%seen ); } - return map { $self->_class_to_uri($_) } @classes; + return map { + my $path = $self->_class_to_path($_); + my $result = $path->uri; + my $file_stat = stat($path->path); + if ( $file_stat && -f _ && -r _ ) { + $result .= '?' . $file_stat->mtime; + } + $result; + } @classes; } sub _follow_deps
で結果は
/js/Test/More.js?1150285718 /js/Class.js?1150288860
という感じに。結果自体は満足だけど問題はJSANあんまり使われてないってことですかね。。へんてこな英語付きのパッチ送ってみるか。