Comparaison des frameworks Web Snap et Yesod de Haskell


231

Les deux frameworks web Haskell récemment publiés sont Yesod (à 0,8) et Snap (à 0,4).

Il est assez évident que Yesod prend actuellement en charge beaucoup plus de fonctionnalités que Snap. Cependant, je ne supporte pas la syntaxe utilisée par Yesod pour son HTML, CSS et Javascript.

Donc, j'aimerais comprendre ce qui me manquerait si j'allais avec Snap à la place. Par exemple, il ne semble pas que le support de base de données existe. Et les séances? Autres caractéristiques?


138
Personnellement, je ne supporte pas la syntaxe
utilisée

2
qu'est-ce que vous n'aimez pas dans la syntaxe du modèle de hameau pour générer du HTML?
mxc

6
Je n'aime pas que je ne puisse pas passer de Dreamweaver à Yesod car la syntaxe est différente.
Muchin

6
En général, l'équipe Yesod est très ouverte aux nouvelles idées. Maintenant que je connais votre cas d'utilisation, je peux probablement vous recommander une bonne solution. Il serait préférable d'envoyer un e-mail à la liste de développement Web, car SO n'est pas le meilleur endroit pour une discussion collaborative.
Michael Snoyman

76
Les gens utilisent toujours Dreamweaver? ;)
JO.

Réponses:


236

Divulgation complète: je suis l'un des principaux développeurs de Snap.

Tout d'abord, parlons de ce qu'est Snap. À l'heure actuelle, l'équipe Snap gère cinq projets différents sur le piratage: snap-core, snap-server, heist, snap et xmlhtml. snap-server est un serveur Web qui expose l'API définie par snap-core. le braquage est un système de modèles. xmlhtml est une bibliothèque d'analyse et de rendu XML / HTML utilisée par heist. snap est un projet parapluie qui les colle tous ensemble et fournit la puissante API snaplets qui rend les applications Web composables et modulaires.

Yesod a une multitude de projets sur le piratage. La plupart (tous?) D'entre eux sont répertoriés dans la catégorie Yesod . Certains des plus notables sont yesod-core, warp, persistent et hamlet.

La réalité du développement Web Haskell est que c'est beaucoup moins un choix ou une exclusivité qu'il n'y paraît. En général, les projets sont très peu couplés et assez interchangeables. Vous pouvez créer un site Web en utilisant warp (le serveur Web de l'équipe Yesod), heist (le système de modèles de l'équipe Snap) et acid-state (le système de persistance du projet Happstack). Vous pouvez également utiliser snap-server avec hamlet ou persistant.

Cela dit, les deux projets présentent certainement des différences. La plus grande différence que je peux souligner objectivement est que les projets Yesod font généralement un usage intensif du modèle Haskell et des quasiquotes pour créer des DSL concis, tandis que les projets Snap s'en tiennent à la création de bibliothèques de combinateurs qui favorisent la composabilité. À peu près toutes les autres différences auxquelles je peux penser seront subjectivement biaisées vers Snap. Les packages parapluie nommés d'après les deux projets vont évidemment faire des choix spécifiques pour les composants mentionnés ci-dessus, et ces choix seront reflétés dans les dépendances du projet. Mais cela ne signifie toujours pas que vous ne pouvez pas tirer quelque chose de différent et l'utiliser également.

Snap a des sessions et une authentification , des interfaces vers plusieurs bases de données et une gestion agréable des formulaires ( ici et ici ) à l'aide de foncteurs digestifs qui incluent une prise en charge préemballée pour des listes de taille dynamique imbriquées arbitrairement. Ce ne sont là que quelques-uns de l' écosystème croissant des agrafes enfichables . Les sessions et les snaplets d'authentification sont écrits d'une manière indépendante du back-end. Donc, avec une petite quantité de code de colle, vous devriez pouvoir l'utiliser avec à peu près n'importe quel système de persistance auquel vous pouvez penser. À l'avenir, Snap respectera cette politique aussi souvent que possible.

Pour la plupart, je pense que le choix de Snap vs Yesod vs Happstack est moins une question de fonctionnalités et plus de goût personnel. Chaque fois que quelqu'un dit que l'un des cadres n'a pas quelque chose qu'un autre possède, la plupart du temps, il sera assez facile d'extraire les fonctionnalités manquantes de l'autre cadre en important le package nécessaire.

EDIT: Pour une comparaison plus détaillée des trois grands frameworks Web Haskell, consultez mon récent article de blog . Pour une comparaison plus grossière (mais peut-être plus utile) à l'aide de généralisations plus larges, voir ma matrice de comparaison du cadre Web Haskell


34
La double nature de la compétition amicale et du mix-and-match dans le développement Web Haskell semble très prometteuse. Cela dit, je recommanderais d'obtenir l'authentification instantanée pour le piratage dès que possible. Les sessions et l'authentification sont un gros problème.
Dan Burton

2
Yesod a également une interface encore inédite avec mongodb pour persistant.
mxc

4
La vitesse de développement a une influence sur moi, d'où cette question. Il semble que Yesod ait une dynamique d'avance en ajoutant des fonctionnalités tandis que Snap est resté stagnant. Je ne sais tout simplement pas quelles sont les nouvelles fonctionnalités depuis que j'en ai entendu parler il y a 6+ mois.
Muchin

3
Snap a une assez bonne dynamique. Tout d'abord, c'était le framework web le plus téléchargé sur le piratage l'année dernière, même si le projet n'a été lancé publiquement qu'en mai. Deuxièmement, depuis la sortie de la version 0.3 en décembre, nous avons constaté une forte augmentation de l'activité. Les bibliothèques pour les sessions, auth, mongoDB, la bibliothèque xmlhtml et bien plus sont toutes travaillées par des personnes qui sont pour la plupart de nouveaux contributeurs en 2011. Vous pouvez également trouver généralement 30 personnes ou plus dans le canal IRC #snapframework. C'est définitivement un projet actif.
mightybyte

2
Des deux, je suis tombé sur Snap simplement parce que, à l'époque, il semblait avoir le plus grand élan. J'ai été extrêmement impressionné par la qualité des composants. Heist a une conception magnifiquement simple et épurée qui est probablement le meilleur système de modèles que j'ai vu sur n'importe quel framework Web sur n'importe quel langage que j'ai utilisé. Les monades Snap sont faciles à utiliser et se comportent à peu près comme vous vous y attendez, c'est-à-dire sans mauvaises surprises. Je souhaite juste qu'ils normalisent sur ByteStrings ou Text car vous convertissez constamment entre eux!
Andrew

223

Juste avertissement: je suis le développeur principal de Yesod.

Je ne sais pas ce que vous n'aimez pas dans la syntaxe Javascript: c'est du javascript simple avec une interpolation variable. Quant au CSS Yesod a maintenant Lucius qui vous permet également d'utiliser du CSS simple. Pour HTML, vous pouvez facilement utiliser n'importe quelle autre bibliothèque de votre choix, y compris Heist (ce que Snap utilise). Cela dit, il est un peu une drôle de chose à sauter sur Yesod CSS / Javascript syntaxe, lorsque le Calage ne même pas avoir une syntaxe pour elle. Vous êtes certainement les bienvenus dans leur solution de fichiers statiques.

Yesod est livré avec une prise en charge transparente de l'authentification / autorisation, des URL de type sécurisé, des widgets, des e-mails et un tas de petites choses partout (fil d'Ariane, messages, destination finale). De plus, Yesod a un ensemble assez riche de modules complémentaires pour des choses comme les commentaires et la démarque, et quelques grandes bases de code du monde réel à choisir pour des exemples. Si l'un de ces éléments vous intéresse, vous pouvez vérifier si vos alternatives les prennent en charge.


C'est très nouveau, je n'ai pas encore eu l'occasion de mettre à jour la documentation. Mais en gros, il suffit de taper du CSS normal et d'utiliser # {...} et @ {...} pour l'interpolation comme Hamlet / Cassius / Julius. L'imbrication est également prise en charge, mais cela prendra un peu plus d'espace à expliquer que ce commentaire;). Si vous envoyez un e-mail via Web-Devel, nous pouvons vous donner plus de détails là-bas pendant que la documentation se rattrape.
Michael Snoyman

Toute modification à utiliser Juliussans que le code soit compressé? Je suis en train d'utiliser Google Closureet je dois conserver les métadonnées dans les commentaires pour le compilateur.
Andras Gyomrey

1
Je ne pense pas que ce soit un bon endroit pour discuter d'une telle chose, mais il n'y a aucune obligation de compresser le code Julius (il ne le fait pas par défaut). Si vous avez besoin de plus d'aide, une question SO séparée ou un fil de liste de diffusion serait un meilleur pari.
Michael Snoyman

29

Essayez le hameau - vous pourriez finir par l' aimer. Une réaction négative à un niveau superficiel n'est pas rare. Cependant, personne qui a réellement utilisé le hameau ne se plaint.

Aussi, pourquoi ne pas utiliser Happstack? Ce n'est pas parce qu'ils ne font pas partie de l'actualité qu'ils n'ont pas de cadre solide.


21
un mainteneur de yesod suggérant d'essayer un cadre concurrent. quelle grande communauté nous avons.
mxc

12

Vous vous référez probablement à l'ancienne version de yesod. Les dernières versions de yesod ont une syntaxe simple pour html, javascript et css.

La syntaxe html du hameau de la bibliothèque de modèles de yesod est du html ordinaire avec des balises d'ouverture et de fermeture complètes et tous les attributs html normaux. Oui, vous pouvez omettre la fermeture des balises et utiliser des raccourcis pour les attributs id et class. Mais ce n'est pas obligatoire. Vous pouvez continuer à écrire du html ordinaire.

Non seulement cela, mais les modèles html peuvent résider dans des fichiers séparés, tout comme dans la bibliothèque de modèles de Snap Heist.

Les modèles de script Java (julius) sont des fichiers javascript simples, résidant également dans des fichiers séparés.

Le modèle css a en effet une syntaxe différente, mais la version récente de yesod fournit désormais également une syntaxe css simple.

Si vous allez avec Heist, vous n'aurez pas d'URL sécurisées.

Dans Heist, les modèles html sont lus à chaque fois depuis le disque dur. Yesod compile tous les modèles directement dans l'exécutable. Aucun fichier n'est lu à partir du disque dur. Ainsi, la réponse est beaucoup plus rapide. Vous pouvez voir les repères vous-même.

Dans Yesod, vous pouvez créer des widgets qui coopèrent bien. Snap ne traite pas du tout avec les widgets. Vous devrez lancer le vôtre.


1
Comme je le décris ci-dessus, votre commentaire sur les URL sécurisées de type est incorrect et contribue à perpétuer l'idée fausse que je mentionne. Ce serait plus précis si vous disiez "Heist" au lieu de "Snap".
mightybyte

3
Les URL de type sécurisé sont possibles grâce à une combinaison de moteur de modèle ET de mécanisme de routage. Ce n'est donc pas seulement Heist. Vous n'obtiendrez pas d'URL de type sécurisé dans Snap simplement en utilisant hamlet.
Vagif Verdi du

1
Je ne parle pas de hameau. Le package web-routes a été initialement écrit pour Happstack qui a essentiellement la même interface de routage que Snap. Vous aurez probablement besoin d'un petit code de colle, mais ce sera à peu près toujours le cas.
mightybyte

4
Je ne ferais pas un si petit point de ce «code de colle». Le modèle Haskell auquel vous faites référence ci-dessous est ce qui rend ce "code de collage" possible de manière sûre et concise. J'ai écrit un petit article de blog pour répondre à cela: yesodweb.com/blog/yesod-template-haskell
Michael Snoyman

3
Pour ceux qui veulent aller avec une autre approche de modèle (plus faible, mais plus flexible), HStringTemplate joue également bien avec tous les cadres, pour autant que je sache, et permet de lire des modèles à la volée pour le développement, de les mettre en cache pour la production, et aussi de compiler les via quasiquotation si vous le souhaitez. Le support qq est peut-être de 13 lignes, et je ne doute pas que heist puisse l'ajouter trivialement, s'il y avait une demande.
sclv
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.