web-dev-qa-db-ja.com

HaskellのSnapおよびYesod Webフレームワークの比較

最近のニュースにある2つのHaskell Webフレームワークは、 Yesod (0.8で)と Snap (0.4で)です。

Yesodが現在Snapよりも多くの機能をサポートしていることは明らかです。ただし、YesodがHTML、CSS、およびJavascriptに使用する構文は我慢できません。

そのため、代わりにSnapを使用した場合に不足しているものを理解したいと思います。たとえば、データベースサポートがあるようには見えません。セッションはどうですか?その他の機能は?

230
Muchin

完全な開示:私はSnapの主な開発者の一人です。

まず、Snapとは何かを説明しましょう。現在、Snapチームは、ハッキングに関する5つの異なるプロジェクト、snap-core、snap-server、heist、snap、およびxmlhtmlを管理しています。 snap-serverは、snap-coreで定義されたAPIを公開するWebサーバーです。 heistはテンプレートシステムです。 xmlhtmlは、強盗が使用するXML/HTML解析およびレンダリングライブラリです。 snapは、それらをすべて接着し、Webアプリを構成可能かつモジュール式にする強力なスナップレットAPIを提供するアンブレラプロジェクトです。

Yesodには、ハッキングに関する多数のプロジェクトがあります。それらのほとんど(すべて?)は Yesodカテゴリー にリストされています。注目すべきもののいくつかは、yes-core、warp、persistent、hamletです。

HaskellのWeb開発の現実は、認識されているように思えるほど排他的または選択的ではないということです。一般に、プロジェクトは非常に疎結合で、かなり互換性があります。 warp(YesodチームのWebサーバー)、heist(Snapチームのテンプレートシステム)、acid-state(Happstackプロジェクトの永続性システム)を使用してWebサイトを構築できます。また、hamletまたはpersistentでsnap-serverを使用することもできます。

ただし、2つのプロジェクトには間違いなくいくつかの違いがあります。私が客観的に指摘できる最大の違いは、Yesodプロジェクトは通常、テンプレートHaskellと準クォートを使用して簡潔なDSLを作成するのに対し、Snapプロジェクトはコンポーザビリティを促進するコンビネーターライブラリの構築に固執することです。私が考えることができる他の違いについては、スナップに主観的に偏っています。両方のプロジェクトにちなんで名付けられたアンブレラパッケージは、明らかに上記のコンポーネントに対して特定の選択を行い、これらの選択はプロジェクトの依存関係に反映されます。しかし、それはあなたが別の何かを引き出して、それを同様に使用できないという意味ではありません。

Snapには sessions および authentication 、いくつかのデータベースへのインターフェース、およびNiceフォーム処理( here および here )があります digestive-functors これには、任意にネストされた動的にサイズ変更可能なリストのサポートがあらかじめパッケージ化されています。これらは プラグイン可能なスナップレットのエコシステムの成長 のほんの一部です。セッションおよび認証スナップレットは、バックエンドに依存しない方法で記述されます。そのため、少量のグルーコードを使用すれば、考えられるほぼすべての永続性システムで使用できるはずです。将来、Snapはこのポリシーをできるだけ頻繁に使用します。

ほとんどの場合、Snap vs Yesod vs Happstackの選択は機能の問題ではなく、個人的な好みの問題だと思います。フレームワークの1つに他のフレームワークにはないものがあると誰かが言うときはいつでも、ほとんどの場合、必要なパッケージをインポートすることで、他のフレームワークから欠落している機能を簡単に取り込むことができます。

編集:3つのHaskell Webフレームワークのより詳細な比較については、最近の ブログ投稿 をご覧ください。いくつかのより一般的な一般化を使用した、より粗い(しかしおそらくより有用な)比較については、私の Haskell Web Framework Comparison Matrix を参照してください

236
mightybyte

公正な警告:私はYesodの主任開発者です。

Javascript構文について、あなたが嫌い​​なものはわかりません。それは、変数補間を備えたプレーンなJavaScriptです。 CSSについては、YesodにLuciusが追加され、プレーンCSSも使用できるようになりました。 HTMLの場合、Heist(Snapが使用するもの)など、必要な他のライブラリを簡単に使用できます。とはいえ、Snapがhaveの構文でさえない場合に、CSS/Javascript構文についてのYesodをスキップするのは少しおもしろいことです。静的ファイルのみのソリューションを歓迎します。

Yesodには、認証/承認、タイプセーフURL、ウィジェット、電子メール、あらゆる場所(パンくずリスト、メッセージ、最終的な宛先)の小さなものがシームレスにサポートされています。さらに、Yesodには、コメントやマークダウンのようなもののためのかなり豊富なアドオンパッケージのセットがあり、いくつかの実例のコードベースがあります。これらのいずれかがあなたにとって魅力的であれば、あなたの代替がそれらをサポートしているかどうかをチェックしたいかもしれません。

222
Michael Snoyman

ハムレットを試してみてください終了好きかもしれません。表面的なレベルでの否定的な反応は珍しくありません。しかし、実際にsed hamletを持っている人は文句を言いません。

また、なぜHappstackを使用しないのですか?彼らが「ニュース」ではないからといって、強固なフレームワークがないということにはなりません。

29
Greg Weber

おそらく、古いバージョンのyesodを参照しています。最新のyesodバージョンには、html、javascript、cssの単純な構文があります。

Yesodのテンプレートライブラリハムレットのhtml構文は、完全な開始タグと終了タグ、およびすべての通常のhtml属性を持つプレーンなhtmlです。はい、終了タグを省略して、idおよびclass属性のショートカットを使用できます。しかし、あなたはする必要はありません。プレーンなhtmlを書き続けることができます。

それだけでなく、HTMLテンプレートは、SnapのテンプレートライブラリHeistのように、別々のファイルに置くことができます。

Javaスクリプトテンプレート(julius)はプレーンなjavascriptファイルであり、別のファイルにもあります。

Cssテンプレートの構文は実際には異なりますが、yesodの最近のバージョンではプレーンなCSS構文も提供されるようになりました。

Heistを使用する場合、タイプセーフURLはありません。

Heistでは、htmlテンプレートは毎回ハードドライブから読み取られます。 Yesodは、すべてのテンプレートを実行可能ファイルに直接コンパイルします。ハードドライブからファイルは読み込まれません。したがって、応答ははるかに高速です。ベンチマークは自分で確認できます。

Yesodでは、うまく連携するウィジェットを作成できます。 Snapはウィジェットをまったく扱いません。あなたは自分で転がす必要があります。

12
Vagif Verdi