Vergleich der Snap- und Yesod-Webframeworks von Haskell

231

Die beiden Haskell-Webframeworks in den letzten Nachrichten sind Yesod (bei 0,8) und Snap (bei 0,4).

Es ist ziemlich offensichtlich, dass Yesod derzeit viel mehr Funktionen als Snap unterstützt. Ich kann die Syntax, die Yesod für HTML, CSS und Javascript verwendet, jedoch nicht ausstehen.

Ich würde gerne verstehen, was mir fehlen würde, wenn ich stattdessen Snap verwenden würde. Sieht zum Beispiel nicht so aus, als ob Datenbankunterstützung vorhanden ist. Wie wäre es mit Sitzungen? Andere Eigenschaften?

Muchin
quelle
138
Persönlich kann ich die Syntax nicht ertragen, die HTML für HTML verwendet;)
Rehno Lindeque
2
Was gefällt Ihnen an der Hamlet-Template-Syntax zum Generieren von HTML nicht?
MXC
6
Ich mag es nicht, dass ich nicht zwischen Dreamweaver und Yesod wechseln kann, weil die Syntax unterschiedlich ist.
Muchin
6
Im Allgemeinen ist das Yesod-Team sehr offen für neue Ideen. Nachdem ich Ihren Anwendungsfall kenne, kann ich Ihnen wahrscheinlich eine gute Lösung empfehlen. Es ist am besten, wenn Sie eine E-Mail an die Webentwicklungsliste senden, da SO nicht der beste Ort für eine gemeinsame Diskussion ist.
Michael Snoyman
76
Leute benutzen immer noch Dreamweaver? ;)
ABl.

Antworten:

236

Vollständige Offenlegung: Ich bin einer der Hauptentwickler von Snap.

Lassen Sie uns zunächst darüber sprechen, was Snap ist. Derzeit verwaltet das Snap-Team fünf verschiedene Projekte zum Thema Hackage: Snap-Core, Snap-Server, Heist, Snap und XMLTML. Snap-Server ist ein Webserver, der die von Snap-Core definierte API verfügbar macht. Überfall ist ein Schablonensystem. xmlhtml ist eine XML / HTML-Analyse- und Rendering-Bibliothek, die von heist verwendet wird. snap ist ein Dachprojekt, das sie alle zusammenklebt und die leistungsstarke snaplets-API bereitstellt, die Web-Apps zusammensetzbar und modular macht.

Jessod hat eine Vielzahl von Projekten zum Thema Hackage. Die meisten (alle?) Sind in der Kategorie Jessod aufgeführt . Einige der bemerkenswerten sind Jessod-Core, Warp, Persistent und Hamlet.

Die Realität der Haskell-Webentwicklung ist, dass es viel weniger eine exklusive Wahl ist, als wahrgenommen zu werden scheint. Im Allgemeinen sind die Projekte sehr locker gekoppelt und ziemlich austauschbar. Sie können eine Website mit Warp (dem Webserver des Yesod-Teams), Heist (dem Vorlagensystem des Snap-Teams) und Acid-State (dem Persistenzsystem des Happstack-Projekts) erstellen. Sie können auch einen Snap-Server mit Weiler oder persistent verwenden.

Das heißt, die beiden Projekte haben definitiv einige Unterschiede. Der größte Unterschied, auf den ich objektiv hinweisen kann, besteht darin, dass Yesod-Projekte in der Regel stark von Template Haskell und Quasiquoting Gebrauch machen, um präzise DSLs zu erstellen, während Snap-Projekte beim Erstellen von Kombinatorbibliotheken bleiben, die die Kompositionsfähigkeit fördern. Fast alle anderen Unterschiede, die mir einfallen, werden subjektiv auf Snap ausgerichtet sein. Die nach beiden Projekten benannten Dachpakete werden offensichtlich spezifische Entscheidungen für die oben genannten Komponenten treffen, und diese Entscheidungen werden sich in den Projektabhängigkeiten widerspiegeln. Das heißt aber immer noch nicht, dass Sie etwas anderes nicht hineinziehen und es auch verwenden können.

Snap bietet Sitzungen und Authentifizierung , Schnittstellen zu mehreren Datenbanken und eine nette Formularverarbeitung ( hier und hier ) mit Digestive-Funktoren , die vorgefertigte Unterstützung für beliebig verschachtelte, dynamisch große Listen enthält. Dies sind nur einige der wachsenden Ökosysteme steckbarer Snaplets . Die Sitzungen und Authentifizierungs-Snaplets werden auf eine Art und Weise geschrieben, die Back-End-unabhängig ist. Mit einer kleinen Menge Klebercode sollten Sie ihn also mit nahezu jedem erdenklichen Persistenzsystem verwenden können. In Zukunft wird Snap so oft wie möglich an dieser Richtlinie festhalten.

Zum größten Teil denke ich, dass die Wahl von Snap vs Yesod vs Happstack weniger eine Frage der Funktionen als vielmehr des persönlichen Geschmacks ist. Wenn jemand sagt, dass eines der Frameworks nicht über etwas verfügt, das ein anderes hat, ist es meistens ziemlich einfach, die fehlenden Funktionen aus dem anderen Framework zu übernehmen, indem das erforderliche Paket importiert wird.

BEARBEITEN: Einen detaillierteren Vergleich der drei großen Haskell-Webframeworks finden Sie in meinem letzten Blogbeitrag . Einen gröberen (aber möglicherweise nützlicheren) Vergleich mit einigen breiteren Verallgemeinerungen finden Sie in meiner Haskell Web Framework-Vergleichsmatrix

mächtig
quelle
34
Die doppelte Natur von freundschaftlichem Wettbewerb und Mix-and-Match in der Haskell-Webentwicklung scheint sehr vielversprechend. Trotzdem würde ich empfehlen, Snap-Auth so schnell wie möglich zu hacken. Sitzungen und Authentifizierung sind eine große Sache.
Dan Burton
2
Yesod hat auch eine noch nicht veröffentlichte Schnittstelle zu Mongodb für dauerhafte.
mxc
4
Die Geschwindigkeit der Entwicklung hat einen Einfluss auf mich, daher diese Frage. Es sieht sehr danach aus, als hätte Yesod Funktionen zum Hinzufügen von Vorwärtsdynamik, während Snap stagniert hat. Ich weiß einfach nicht ohne weiteres, was die neuen Funktionen sind, seit ich vor mehr als 6 Monaten zum ersten Mal davon gehört habe.
Muchin
3
Snap hat eine ziemlich gute Dynamik. Erstens war es das am häufigsten heruntergeladene Webframework für Hackage im letzten Jahr, obwohl das Projekt erst im Mai öffentlich gestartet wurde. Zweitens haben wir seit der Veröffentlichung von 0.3 im Dezember einen starken Anstieg der Aktivität festgestellt. Bibliotheken für Sitzungen, auth, mongoDB, die xmlhtml-Bibliothek und mehr werden von Personen bearbeitet, die 2011 größtenteils neue Mitwirkende sind. Im IRC-Kanal #snapframework finden Sie normalerweise auch 30 oder mehr Personen. Es ist definitiv ein aktives Projekt.
mächtiges Byte
2
Von den beiden habe ich mich für Snap entschieden, nur weil es zu dieser Zeit den größeren Schwung zu haben schien. Ich war sehr beeindruckt von der Qualität der Komponenten. Heist hat ein wunderschön einfaches und klares Design, das wahrscheinlich das beste Template-System ist, das ich in einem Web-Framework in einer von mir verwendeten Sprache gesehen habe. Die Snap-Monaden sind einfach zu handhaben und verhalten sich so, wie Sie es erwarten würden, dh keine bösen Überraschungen. Ich wünschte nur, sie würden entweder ByteStrings oder Text standardisieren, da Sie ständig zwischen ihnen konvertieren!
Andrew
223

Faire Warnung: Ich bin der Hauptentwickler von Jessod.

Ich bin mir nicht sicher, was Ihnen an der Javascript-Syntax nicht gefällt: Es ist einfaches Javascript mit variabler Interpolation. Was CSS betrifft, hat Yesod jetzt Lucius, mit dem Sie auch einfaches CSS verwenden können. Für HTML können Sie problemlos jede andere gewünschte Bibliothek verwenden, einschließlich Heist (was Snap verwendet). Das heißt, es ist ein bisschen eine lustige Sache Yesod über CSS / Javascript - Syntax zu überspringen, wenn Schnapp nicht einmal haben eine Syntax für sie. Sie sind sicherlich zu ihrer Lösung nur statischer Dateien willkommen.

Yesod bietet nahtlose Unterstützung für Authentifizierung / Autorisierung, typsichere URLs, Widgets, E-Mails und eine Reihe kleiner Dinge (Brotkrumen, Nachrichten, Endziel). Außerdem verfügt Yesod über eine Reihe von Zusatzpaketen für Kommentare und Preisnachlässe sowie einige große reale Codebasen, aus denen Sie beispielsweise auswählen können. Wenn eines davon für Sie attraktiv ist, sollten Sie prüfen, ob Ihre Alternativen es unterstützen.

Michael Snoyman
quelle
Es ist sehr neu, ich hatte noch keine Gelegenheit, die Dokumentation zu aktualisieren. Aber im Grunde geben Sie einfach normales CSS ein und verwenden Sie # {...} und @ {...} für die Interpolation, genau wie Hamlet / Cassius / Julius. Das Verschachteln wird ebenfalls unterstützt, aber das braucht etwas mehr Zeit zum Erklären als dieser Kommentar;). Wenn Sie eine E-Mail an web-devel senden, können wir Ihnen dort weitere Details mitteilen, während die Dokumentation aufholt.
Michael Snoyman
Änderungen, die Juliusohne Komprimierung des Codes verwendet werden sollen? Ich benutze Google Closureund muss Metadaten in Kommentaren für den Compiler behalten.
Andras Gyomrey
1
Ich denke nicht, dass dies ein guter Ort ist, um so etwas zu diskutieren, aber es ist nicht erforderlich, dass Julius-Code komprimiert wird (dies ist standardmäßig nicht der Fall). Wenn Sie weitere Unterstützung benötigen, ist eine separate SO-Frage oder ein Mailinglisten-Thread die bessere Wahl.
Michael Snoyman
29

Probieren Sie den Weiler aus - vielleicht gefällt er Ihnen am Ende . Eine negative Reaktion auf oberflächlicher Ebene ist keine Seltenheit. Doch niemand, der tatsächlich hat verwendet Weiler beklagt.

Warum nicht auch Happstack verwenden? Nur weil sie nicht "in den Nachrichten" sind, heißt das nicht, dass sie keinen soliden Rahmen haben.

Greg Weber
quelle
21
Ein Betreuer von Jessod schlägt vor, einen konkurrierenden Rahmen auszuprobieren. Was für eine großartige Gemeinschaft wir haben.
MXC
12

Sie beziehen sich wahrscheinlich auf die alte Version von Jessod. Die neuesten Jessod-Versionen haben eine einfache Syntax für HTML, Javascript und CSS.

Die HTML-Syntax von Jessods Weiler für die Vorlagenbibliothek ist einfaches HTML mit vollständigen Tags zum Öffnen und Schließen und allen normalen HTML-Attributen. Ja, Sie können das Schließen von Tags weglassen und Verknüpfungen für ID- und Klassenattribute verwenden. Das musst du aber nicht. Sie können weiterhin einfaches HTML schreiben.

Darüber hinaus können sich HTML-Vorlagen in separaten Dateien befinden, genau wie in der Vorlagenbibliothek Heist von Snap.

Java-Skriptvorlagen (julius) sind einfache Javascript-Dateien, die sich auch in separaten Dateien befinden.

Die CSS-Vorlage hat zwar eine andere Syntax, aber die aktuelle Version von yesod bietet jetzt auch eine einfache CSS-Syntax.

Wenn Sie sich für Heist entscheiden, haben Sie keine typsicheren URLs.

In Heist werden HTML-Vorlagen jedes Mal von der Festplatte gelesen. Yesod kompiliert alle Vorlagen direkt in die ausführbare Datei. Es wird keine Datei von der Festplatte gelesen. Somit ist die Antwort viel schneller. Sie können die Benchmarks selbst sehen.

In Jessod können Sie Widgets erstellen, die gut zusammenarbeiten. Snap befasst sich überhaupt nicht mit Widgets. Sie müssen Ihre eigenen rollen.

Vagif Verdi
quelle
1
Wie ich oben beschrieben habe, ist Ihr Kommentar zu typsicheren URLs falsch und hilft, das von mir erwähnte Missverständnis aufrechtzuerhalten. Es wäre genauer, wenn Sie "Heist" anstelle von "Snap" sagen würden.
mächtiger Byte
3
Typensichere URLs sind aufgrund einer Kombination aus Template-Engine UND Routing-Mechanismus möglich. Es ist also nicht nur Heist. Sie erhalten in Snap keine typsicheren URLs, wenn Sie nur hamlet verwenden.
Vagif Verdi
1
Ich spreche nicht von Weiler. Das Webroutenpaket wurde ursprünglich für Happstack geschrieben, das im Wesentlichen dieselbe Routing-Schnittstelle wie Snap hat. Sie werden wahrscheinlich einen kleinen Klebercode benötigen, aber das wird so ziemlich immer der Fall sein.
mächtiger Byte
4
Ich würde diesen "Klebercode" nicht so klein machen. Die Vorlage Haskell, auf die Sie sich unten beziehen, ermöglicht diesen "Klebercode" auf sichere und präzise Weise. Ich schrieb einen kleinen Blog-Beitrag, um das zu beheben
Michael Snoyman
3
Für diejenigen, die einen anderen (schwächeren, aber flexibleren) Template-Ansatz wählen möchten, funktioniert HStringTemplate meines Wissens auch mit allen Frameworks und ermöglicht das sofortige Lesen von Vorlagen für die Entwicklung, das Zwischenspeichern für die Produktion und das Kompilieren auf Wunsch per Quasiquotation. Die qq-Unterstützung beträgt vielleicht 13 Zeilen, und ich habe keinen Zweifel, dass heist sie trivial hinzufügen könnte, wenn Nachfrage besteht.
sclv