MojoliciousでMiddleman的なことをする簡易版 - Qiita [キータ] の記事について、tokuhirom氏から「 wallflower 使ったらどうなる?」と意見をもらった。具体的には App::Wallflower
モジュールに同封されているコマンドもしくは Wallflower
モジュールを指すことになるんだけど、ドキュメント等によると本来動的であるPlackアプリケーションを静的HTMLのサイトに変換することを目的とされている。SongmuさんのRijiの内部でも使われている。詳しくはチュートリアルがあるのでこの辺りを…
で、試した見たところ、MojoliciousはPSGIを簡単に吐いてくれるので wallflower
コマンド一発で静的HTMLを見事に書き出してくれた。例えばこんなアプリがある。
package MyApp;
use Mojo::Base 'Mojolicious';
sub startup {
my $self = shift;
my $r = $self->routes;
# Rootコントローラはつくらず auto_render でテンプレートを直接レンダリングさせる
$r->get('/')->to('root#index');
$r->get('/about.html')->to('root#about');
$r->get('/news.html')->to('root#news');
}
1;
テンプレート内でリンクを張っているとそこを wallflower
が辿ってくれるので、URLをとりわけ明示しなくてもよい。なので共通で使用するレイアウトの部分でメニューを用意した。
<!DOCTYPE html>
<html>
<head><title><%= title %></title></head>
<body>
<ul id="menu">
<li><a href="/index.html">Top</a></li>
<li><a href="/about.html">About</a></li>
<li><a href="/news.html">News</a></li>
</ul>
<%= content %>
</body>
</html>
あとは個別に
- index.html
- about.html
- news.html
の中身を適当に書く。そしていよいよ wallflower
コマンド実行。-a
もしくは --application
で渡すオプションは mojo generate app MyApp
で生成されるスクリプトを指定してみた。
$ wallflower -a script/my_app -d public
200 / => public/index.html [283]
304 /index.html
200 /about.html => public/about.html [287]
200 /news.html => public/news.html [285]
おお、出来た出来た\(^o^)/ 当然「Any Plack Application」に対応しています。「Plack寄せ」ならこうかな!