最近ニュースになった 2 つの Haskell Web フレームワークは、Yesod (0.8) とSnap (0.4) です。
Yesod が現在 Snap よりも多くの機能をサポートしていることは明らかです。しかし、Yesod が HTML、CSS、Javascript に使用する構文には我慢できません。
そのため、代わりにスナップを使用した場合に何が欠けているかを理解したいと思います. たとえば、データベースのサポートがあるようには見えません。セッションはどうですか?その他の機能は?
完全な開示:私はSnapの主要な開発者の1人です。
まず、Snapとは何かについてお話ししましょう。現在、Snapチームは、ハッキングに関する5つの異なるプロジェクト(snap-core、snap-server、heist、snap、およびxmlhtml)を維持しています。snap-serverは、snap-coreによって定義されたAPIを公開するWebサーバーです。heistはテンプレートシステムです。xmlhtmlは、heistが使用するXML/HTML解析およびレンダリングライブラリです。snapは、それらすべてを結合し、Webアプリを構成可能でモジュール化する強力なsnapletsAPIを提供する包括的なプロジェクトです。
Yesodには、ハッキングに関する多数のプロジェクトがあります。それらのほとんど(すべて?)はYesodカテゴリにリストされています。注目すべきもののいくつかは、yesod-core、warp、persistent、およびhamletです。
Haskell Web開発の現実は、それが知覚されているように見えるよりもはるかに排他的または選択ではないということです。一般に、プロジェクトは非常に緩く結合されており、かなり互換性があります。ワープ(YesodチームのWebサーバー)、heist(Snapチームのテンプレートシステム)、およびacid-state(Happstackプロジェクトの永続化システム)を使用してWebサイトを構築できます。hamletまたはpersistentでsnap-serverを使用することもできます。
そうは言っても、2つのプロジェクトには確かにいくつかの違いがあります。私が客観的に指摘できる最大の違いは、Yesodプロジェクトは通常、テンプレートHaskellと準引用を多用して簡潔なDSLを作成するのに対し、Snapプロジェクトは構成可能性を優先するコンビネータライブラリの構築に固執することです。私が考えることができる他のほとんどの違いは、主観的にスナップに偏っています。両方のプロジェクトにちなんで名付けられたアンブレラパッケージは、明らかに上記のコンポーネントに対して特定の選択を行い、これらの選択はプロジェクトの依存関係に反映されます。しかし、それでも、別の何かを引き込んでそれを使用することができないという意味ではありません。
Snapには、セッションと認証、複数のデータベースへのインターフェイス、および任意にネストされた動的にサイズ変更可能なリストの事前パッケージ化されたサポートを含むダイジェストファンクターを使用した優れたフォーム処理(こことここ)があります。これらは、プラグ可能なスナップレットの成長するエコシステムのほんの一部です。セッションと認証スナップレットは、バックエンドに依存しない方法で作成されます。したがって、少量のグルーコードを使用すれば、考えられるほぼすべての永続化システムでそれを使用できるはずです。将来的には、Snapはこのポリシーを可能な限り維持する予定です。
ほとんどの場合、Snap vs Yesod vs Happstackの選択は、機能の問題ではなく、個人的な好みの問題だと思います。フレームワークの1つに別のフレームワークが持っているものがないと誰かが言うときはいつでも、ほとんどの場合、必要なパッケージをインポートすることによって、他のフレームワークから不足している機能を簡単に取り込むことができます。
編集:大きな3つのHaskell Webフレームワークのより詳細な比較については、私の最近のブログ投稿をチェックしてください。いくつかのより広い一般化を使用したより大まかな(しかしおそらくより有用な)比較については、私のHaskellWebフレームワーク比較マトリックスを参照してください。
公正な警告: 私は Yesod の主任開発者です。
Javascript 構文のどこが気に入らないのかわかりません。変数補間を使用した単純な JavaScript です。CSS に関しては、Yesod に Lucius が追加され、プレーンな CSS も使用できるようになりました。HTML の場合、Heist (Snap が使用するもの) など、必要な他のライブラリを簡単に使用できます。そうは言っても、CSS/Javascript の構文で Yesod をスキップするのはちょっとおかしな話ですが、Snap にはそのための構文さえありません。静的ファイルのみのソリューションを歓迎します。
Yesod には、認証/承認、タイプ セーフな URL、ウィジェット、電子メール、およびさまざまな場所 (パンくずリスト、メッセージ、最終的な宛先) のシームレスなサポートが付属しています。さらに、Yesod には、コメントやマークダウンなどのアドオン パッケージのかなり豊富なセットと、例として選択できるいくつかの大規模な実世界のコード ベースがあります。これらのいずれかが魅力的である場合は、代替案がそれらをサポートしているかどうかを確認することをお勧めします.
ハムレットを試してみてください-あなたはそれを好きになるかもしれません. 表面的なレベルでの否定的な反応は珍しくありません。しかし、ハムレットを実際に使ったことのある人は誰も文句を言いません。
また、Happstack を使用してみませんか? 彼らが「ニュースに出ていない」からといって、彼らがしっかりした枠組みを持っていないというわけではありません.
あなたはおそらく yesod の古いバージョンを参照しています。最新の yesod バージョンには、html、javascript、および css の単純な構文があります。
yesod のテンプレート ライブラリ hamlet の html 構文は、完全な開始タグと終了タグ、およびすべての通常の html 属性を備えたプレーンな html です。はい、終了タグを省略して、id および class 属性のショートカットを使用できます。しかし、そうする必要はありません。プレーンな html を書き続けることができます。
それだけでなく、Snap のテンプレート ライブラリ Heist のように、HTML テンプレートを別のファイルに配置できます。
Java スクリプト テンプレート (julius) はプレーンな JavaScript ファイルであり、別のファイルにも存在します。
css テンプレートは確かに異なる構文を持っていますが、最近のバージョンの yesod はプレーンな css 構文も提供しています。
Heist を使用する場合、タイプ セーフな URL はありません。
Heist では、html テンプレートは毎回ハードドライブから読み込まれます。Yesod は、すべてのテンプレートを実行可能ファイルに直接コンパイルします。ハードドライブからファイルが読み取られません。したがって、応答ははるかに高速です。ベンチマークは自分で見ることができます。
Yesod ではうまく連携するウィジェットを作成できます。Snap はウィジェットをまったく扱いません。自分で巻く必要があります。