Posted at

wallflowerコマンド一発で静的ページを書き出す

More than 5 years have passed since last update.

MojoliciousでMiddleman的なことをする簡易版 - Qiita [キータ] の記事について、tokuhirom氏から「 wallflower 使ったらどうなる?」と意見をもらった。具体的には App::Wallflower モジュールに同封されているコマンドもしくは Wallflower モジュールを指すことになるんだけど、ドキュメント等によると本来動的であるPlackアプリケーションを静的HTMLのサイトに変換することを目的とされている。SongmuさんのRijiの内部でも使われている。詳しくはチュートリアルがあるのでこの辺りを…

で、試した見たところ、MojoliciousはPSGIを簡単に吐いてくれるので wallflower コマンド一発で静的HTMLを見事に書き出してくれた。例えばこんなアプリがある。


lib/MyApp.pm

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をとりわけ明示しなくてもよい。なので共通で使用するレイアウトの部分でメニューを用意した。


templates/layout/default.html.ep

<!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寄せ」ならこうかな!