Confronto tra i framework Web Snap e Yesod di Haskell


231

I due framework Web Haskell nelle notizie recentemente sono Yesod (a 0,8) e Snap (a 0,4).

È abbastanza ovvio che Yesod attualmente supporta molte più funzioni di Snap. Tuttavia, non sopporto la sintassi utilizzata da Yesod per HTML, CSS e Javascript.

Quindi, vorrei capire cosa mi sarei perso se fossi andato con Snap invece. Ad esempio, non sembra che il supporto del database sia presente. Che ne dici di sessioni? Altre caratteristiche?


138
Personalmente non sopporto la sintassi che html usa per html;)
Rehno Lindeque,

2
cosa non ti piace della sintassi del modello hamlet per generare HTML?
mxc,

6
Non mi piace che non riesca a spostarmi tra Dreamweaver e Yesod perché la sintassi è diversa.
Muchin,

6
In generale, il team di Yesod è molto aperto a nuove idee. Ora che conosco il tuo caso d'uso, posso probabilmente consigliarti una buona soluzione per te. Sarebbe meglio se invii un'email all'elenco di sviluppo web, poiché SO non è il posto migliore per una discussione collaborativa.
Michael Snoyman,

76
Le persone usano ancora Dreamweaver? ;)
GU.

Risposte:


236

Informativa completa: sono uno dei principali sviluppatori di Snap.

Prima di tutto, parliamo di cos'è Snap. In questo momento il team di Snap mantiene cinque diversi progetti sull'hackage: snap-core, snap-server, rapina, snap e xmlhtml. snap-server è un web server che espone l'API definita da snap-core. la rapina è un sistema di modelli. xmlhtml è una libreria di analisi e rendering XML / HTML utilizzata da Heist. snap è un progetto ombrello che li incolla tutti insieme e fornisce la potente API di snaplet che rende le app Web componibili e modulari.

Yesod ha una serie di progetti sull'hackage. La maggior parte (tutti?) Di questi sono elencati nella categoria Yesod . Alcuni di quelli notevoli sono yesod-core, warp, persistent e hamlet.

La realtà dello sviluppo web di Haskell è che è molto meno un'esclusiva o una scelta di quanto sembri essere percepita. In generale, i progetti sono accoppiati in modo molto approssimativo e abbastanza intercambiabili. È possibile creare un sito Web usando warp (il web server del team Yesod), rapina (il sistema di template del team Snap) e acid-state (il sistema di persistenza del progetto Happstack). È inoltre possibile utilizzare snap-server con hamlet o persistente.

Detto questo, i due progetti hanno sicuramente delle differenze. La differenza più grande che posso sottolineare oggettivamente è che i progetti Yesod in genere fanno un uso pesante di Template Haskell e quasiquoting per creare DSL concisi, mentre i progetti Snap continuano a costruire librerie combinatrici che favoriscono la componibilità. Quasi tutte le altre differenze che mi vengono in mente saranno soggettivamente distorte verso Snap. I pacchetti ombrello che prendono il nome da entrambi i progetti faranno ovviamente scelte specifiche per i componenti sopra menzionati, e queste scelte si rifletteranno nelle dipendenze del progetto. Ma ciò non significa ancora che non puoi inserire qualcosa di diverso e usarlo anche tu.

Snap ha sessioni e autenticazione , interfacce per diversi database e una buona gestione dei moduli ( qui e qui ) usando digestivi-funzioni che includono il supporto preconfezionato per elenchi dinamicamente nidificati arbitrariamente. Questi sono solo alcuni dei crescenti ecosistemi di snaplet innestabili . Le sessioni e gli snaplet di autenticazione sono scritti in modo indipendente dal back-end. Quindi con una piccola quantità di codice colla dovresti essere in grado di usarlo con qualsiasi sistema di persistenza a cui riesci a pensare. In futuro, Snap seguirà questa politica il più spesso possibile.

Per la maggior parte penso che la scelta di Snap vs Yesod vs Happstack sia meno un problema di funzionalità e più di gusto personale. Ogni volta che qualcuno dice che uno dei framework non ha qualcosa che ha un altro, il più delle volte sarà abbastanza facile estrarre la funzionalità mancante dall'altro framework importando il pacchetto necessario.

EDIT: per un confronto più dettagliato dei tre grandi framework Web Haskell dai un'occhiata al mio recente post sul blog . Per un confronto più approssimativo (ma forse più utile) utilizzando alcune generalizzazioni più ampie, vedere la mia matrice di confronto Haskell Web Framework


34
La doppia natura della competizione amichevole e del mix-and-match nello sviluppo web di Haskell sembra molto promettente. Detto questo, consiglierei di trasferire snap-auth al più presto possibile. Sessioni e autenticazione sono un grosso problema.
Dan Burton,

2
Yesod ha anche un'interfaccia non ancora rilasciata a mongodb per persistente.
MXC

4
La velocità di sviluppo ha un'influenza su di me, quindi questa domanda. Sembra proprio che Yesod abbia un impulso in avanti nell'aggiungere funzionalità mentre Snap è rimasto stagnante. Semplicemente non so di persona quali sono le nuove funzionalità da quando ne ho sentito parlare 6+ mesi fa.
Muchin,

3
Snap ha un buon slancio. Prima di tutto, lo scorso anno è stato il framework Web più scaricato sugli hacker, anche se il progetto non è stato lanciato pubblicamente fino a maggio. In secondo luogo, dalla versione 0.3 di dicembre, abbiamo visto un forte aumento delle attività. Le librerie per sessioni, auth, mongoDB, la libreria xmlhtml e altre ancora sono state lavorate da persone che sono per lo più nuovi collaboratori nel 2011. Di solito puoi anche trovare 30 o più persone nel canale IRC #snapframework. È sicuramente un progetto attivo.
mightybyte,

2
Dei due ho optato per Snap semplicemente perché, all'epoca, sembrava avere un momento maggiore. Sono stato estremamente colpito dalla qualità dei componenti. Heist ha un design meravigliosamente semplice e pulito che è probabilmente il miglior sistema di template che ho visto su qualsiasi framework web in qualsiasi linguaggio che ho usato. Le monadi Snap sono facili da lavorare e si comportano praticamente come ti aspetteresti, cioè senza brutte sorprese. Vorrei solo che si standardizzassero su ByteStrings o su Text mentre vi convertite costantemente tra di loro!
Andrew

223

Avviso equo: sono lo sviluppatore principale di Yesod.

Non sono sicuro di cosa non ti piaccia della sintassi Javascript: è semplicemente JavaScript con interpolazione variabile. Per quanto riguarda i CSS, Yesod ora ha Lucius che ti permette di usare anche CSS semplici. Per HTML, puoi facilmente usare qualsiasi altra libreria che desideri, incluso Heist (ciò che Snap usa). Detto questo, si tratta di un po 'di una cosa divertente per saltare Yesod su CSS la sintassi / Javascript, quando Snap non ha nemmeno ha una sintassi per esso. Sei certamente il benvenuto nella loro soluzione di soli file statici.

Yesod viene fornito con supporto continuo per autenticazione / autorizzazione, URL sicuri per i tipi, widget, e-mail e un sacco di piccole cose ovunque (briciole di pane, messaggi, destinazione finale). Inoltre, Yesod ha un set abbastanza ricco di pacchetti aggiuntivi per cose come commenti e markdown, e alcune grandi basi di codice del mondo reale da scegliere per esempi. Se qualcuno di questi è interessante per te, potresti voler verificare se le tue alternative li supportano.


È molto nuovo, non ho ancora avuto la possibilità di aggiornare la documentazione. Ma in sostanza, basta digitare CSS normale e usare # {...} e @ {...} per l'interpolazione proprio come Amleto / Cassio / Giulio. Anche la nidificazione è supportata, ma ci vorrà un po 'più di spazio per spiegare di questo commento;). Se invii un'e-mail di sviluppo web, possiamo fornirti ulteriori dettagli mentre la documentazione raggiunge.
Michael Snoyman,

Qualche modifica da utilizzare Juliussenza la compressione del codice? Sono usig Google Closuree ho bisogno di conservare i metadati nei commenti per il compilatore.
Andras Gyomrey,

1
Non penso che questo sia un buon posto per discutere di una cosa del genere, ma non è necessario che il codice Julius sia compresso (non lo fa per impostazione predefinita). Se hai bisogno di ulteriore assistenza, una domanda SO separata o un thread della mailing list sarebbe una scommessa migliore.
Michael Snoyman,

29

Fai una prova a Amleto: potresti finire per apprezzarlo. Una reazione negativa a livello superficiale non è rara. Tuttavia, nessuno che abbia effettivamente utilizzato il villaggio si lamenta.

Inoltre, perché non usare Happstack? Solo perché non sono "nelle notizie" non significa che non hanno un quadro solido.


21
un manutentore di yesod che suggerisce di provare un framework concorrente. che grande comunità abbiamo.
mxc,

12

Probabilmente ti riferisci alla vecchia versione di yesod. Le ultime versioni di yesod hanno una sintassi semplice per html, javascript e css.

La sintassi html della frazione della libreria dei modelli di yesod è semplice HTML con tag di apertura e chiusura completi e tutti i normali attributi html. Sì, puoi omettere i tag di chiusura e utilizzare le scorciatoie per gli attributi id e class. Ma non devi. Puoi continuare a scrivere HTML semplice.

Non solo, ma i modelli html possono risiedere in file separati, proprio come nella libreria dei modelli di Heist di Snap.

I modelli di script Java (julius) sono semplici file javascript, che risiedono anche in file separati.

Il modello CSS ha effettivamente una sintassi diversa, ma la versione recente di yesod ora fornisce anche una sintassi CSS semplice.

Se vai con Heist non avrai URL di tipo sicuro.

In Heist i modelli html vengono letti ogni volta da hard disk. Yesod compila tutti i modelli direttamente nell'eseguibile. Nessun file viene letto dal disco rigido. Quindi la risposta è molto più veloce. Puoi vedere tu stesso i benchmark.

In Yesod puoi creare widget che cooperano bene. Snap non si occupa affatto dei widget. Dovrai rotolare il tuo.


1
Come ho descritto sopra, il tuo commento sul tipo di URL sicuri è errato e aiuta a perpetuare il malinteso che cito. Sarebbe più preciso se dicessi "Colpo" invece di "Scatto".
mightybyte,

3
Gli URL di tipo sicuro sono possibili grazie a una combinazione di motore modello e meccanismo di routing. Quindi non è solo Heist. Non otterrai URL di tipo sicuro in Snap solo usando hamlet.
Vagif Verdi,

1
Non sto parlando di frazione. Il pacchetto web-route è stato originariamente scritto per Happstack che ha essenzialmente la stessa interfaccia di routing di Snap. Probabilmente avrai bisogno di un piccolo codice di colla, ma è quasi sempre così.
mightybyte,

4
Non vorrei sottolineare un punto così piccolo di quel "codice colla". Il modello Haskell a cui ti riferisci di seguito è ciò che rende possibile quel "codice colla" in modo sicuro e conciso. Ho scritto un piccolo post sul blog per rispondere a: yesodweb.com/blog/yesod-template-haskell
Michael Snoyman,

3
Per coloro che vogliono seguire un altro approccio di templating (più debole, ma più flessibile), HStringTemplate gioca anche bene con tutti i framework, per quanto ne so, e consente di leggere al volo modelli per lo sviluppo, memorizzarli nella cache per la produzione e anche compilare li in via quasiquotation se lo si desidera. Il supporto per qq è forse di 13 righe e non ho dubbi che Heist potrebbe aggiungerlo in modo banale, se richiesto.
sclv,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.