これは Mayaa Advent Calendar 2015 の20日目です。昨日は「Mayaaに慣れた僕がJSF2.x Faceletsを試してみる」でした。
さて、クリスマスまであと6日です。
僕のよく行く飲食店もクリスマスモードになっています\(^o^)/
アドベントカレンダーも残すところあお6回、最後はまとめ記事になると思いますので、記事を書けるのはあと5回、名残惜しさもあります。
しかしそうこうするうちに今日があと3時間を切っていたので油断なりません。「頓挫したカレンダー」にならぬよう最後まで頑張ります!
テンプレートエンジンを比較してみて
昨日までの3回に渡って色々なテンプレートエンジンを試してみました。
ためしてみることで、それぞれの特徴がわかりました。
マトリックスにしてみるとこんな感じです。
名前 | 独立性 | パフォーマンス | デザインフレンドリー | 手軽さ |
---|---|---|---|---|
Mayaa | △ (Servlet依存) |
△ | ◎ | △ (Mayaaファイル作成が必要) |
Mixer2 | ◎ | ? JAXB次第 |
○ | △ |
Thymeleaf | ◎ | ◎ Velocityより速いらしい |
△ | ◎ |
JSF2.0 Facelets | △ | ? |
× | ○ |
それぞれの特長
Mayaa
特長
- デザイナーとの協業の追求については、一日の長がある
- とにかくそれ専用として設計されているため機能が充実している
- ドキュメントや実績が豊富
このブログのアドベントカレンダーを最初から読んでくだされば、デザイナーとの協業は心配することがないと思います。
欠点
- Servletに依存が強い(JSPと同じレイヤーであるため、JSPの置き換えにしかならない)
- パフォーマンスが不利であること
- HTML5 サポートとうたえていない
- 閉じタグ忘れなどinvalidなHTMLすら扱えるようにするために利用しているnekoHTMLパーサーがHTML5に対応していないため
HTML5問題についてはnekoHTMLをオフにして、XHTMLをテンプレートとして使用すれば他のテンプレートエンジンと同等になるため、実質的に大きく劣っているわけではありません。
他2については設計上の思想から仕方がないところです。
Mixer2
特長
- PathAdjusterなどMayaaの影響を受けた機能を備えている
- Mayaa同様テンプレートに制御情報を記述させない設計
- Java標準のJAXBを利用しているため、独立性が強く
- JUnitと親和性が強く、デザインをユニットテストできる
欠点
- 制御情報をJavaで書かなければならないためコード量が多い
- 同じid属性を使用するため、デザイナーとプログラマーが同時に使わなければならない
Thymeleaf
特長
- m:idをいちいち定義せずすぐに使える
- 依存性が低く単独でも動作する
- Spring Bootなどに標準対応している
- パフォーマンスが良い
欠点
- テンプレートに制御情報の記述が必要
JSF2.x Facelets
特長
- Java標準であること
欠点
- 完全な意味での、プログラマー・デザイナーの協業は達成できない
どのテンプレートエンジンを使うべきか
以上を踏まえて考えると、僕は次のように思います。
Mayaaが向いているプロジェクトではMayaaを使うべき
Mayaaが向いている案件とは、
- 一つの機能に対して、非常に頻繁にデザインの書き換えを行う
- または、非常に沢山のバリエーションを作る
- コンシューマー向けでデザインを重視したサイト
- SEOが必要でサーバーサイドテンプレートエンジンが必要
詳しくは8日目も参考にしてください。
SEOが不要であれば、SPAにしてしまうことも選択肢の一つ
SEOが不要であれば、サーバーサイドはJSONだけを吐き出せば良く、フロント側はBackbone.jsやAngularJS、React.jsを使うという作戦も検討の余地があります。
CRUDを作るとき、AngularJSは非常に手っ取り早いです。Angularではjsファイルを使いまわして、HTMLファイルを複数作るなんてことも出来ます。
コンシューマー向けではない場合は、JSF / Thymeleaf が選択候補に上がる
フレームワークに何を使うかで判断が分かれると思います。
Java EEの時はJSF, Springの時はThymeleafが良いと思います。
デザイン重視ではあるが、多くのバリエーションを作成しない場合は、Thymeleafが有力
デザインのバリエーションを並立する場合、制御情報のコピペが発生してしまうことが懸念点であるので、Thymeleafはデメリットが出てきますが、変更であれば、その問題がありません。
費用対効果を考えた上で、デザイナーを自立させるよりも、プログラマーとデザイナーが都度協力したほうが良い判断であれば、MayaaよりもThymeleafの方が向いています。
デザインをJUnitでテストしたい時は、Mixer2しかない
現状、ユニットテスト可能な唯一のテンプレートエンジンがMixer2です。
そのため、むしろ、機能の変更が頻繁に発生するときに威力を発揮するかもしれません。
機能の変更に対するデザインへのリグレッションテストが自動でできるのはMixer2だけです。
まとめ
このように、それぞれのテンプレートエンジンは、ターゲットとしている問題が微妙に違っていて、それぞれのニーズがあるかぎり、どれかがどれかを排除してしまうことはないものです。
プロジェクトを開始する際にどのテンプレートエンジンを使えばよいか、そのプロジェクトの性格から判断するべきです。
その時、この記事が参考になれば、幸いです。