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あんまり使われてないってことですかね。。へんてこな英語付きのパッチ送ってみるか。