Comparación de los marcos web de Haskell Snap y Yesod

231

Los dos marcos web de Haskell en las noticias recientemente son Yesod (en 0.8) y Snap (en 0.4).

Es bastante obvio que Yesod actualmente admite muchas más funciones que Snap. Sin embargo, no soporto la sintaxis que Yesod usa para su HTML, CSS y Javascript.

Entonces, me gustaría entender lo que me estaría perdiendo si fuera con Snap en su lugar. Por ejemplo, no parece que haya soporte para bases de datos. ¿Qué hay de las sesiones? ¿Otras características?

Muchin
fuente
138
Personalmente, no soporto la sintaxis que html usa para html;)
Rehno Lindeque
2
¿Qué no le gusta de la sintaxis de la plantilla de aldea para generar html?
mxc
66
No me gusta que no pueda moverme entre Dreamweaver y Yesod porque la sintaxis es diferente.
Muchin
66
En general, el equipo de Yesod está muy abierto a nuevas ideas. Ahora que conozco su caso de uso, probablemente pueda recomendarle una buena solución. Sería mejor si envía un correo electrónico a la lista de desarrollo web, ya que SO no es el mejor lugar para una discusión colaborativa.
Michael Snoyman
76
¿La gente todavía usa Dreamweaver? ;)
DO.

Respuestas:

236

Divulgación completa: soy uno de los principales desarrolladores de Snap.

En primer lugar, hablemos sobre qué es Snap. En este momento, el equipo de Snap mantiene cinco proyectos diferentes sobre piratería: snap-core, snap-server, heist, snap y xmlhtml. snap-server es un servidor web que expone la API definida por snap-core. El atraco es un sistema de plantillas. xmlhtml es una biblioteca de análisis y representación XML / HTML utilizada por heist. snap es un proyecto general que los une a todos y proporciona la potente API de snaplets que hace que las aplicaciones web sean componibles y modulares.

Yesod tiene una serie de proyectos sobre piratería. La mayoría (¿todos?) De ellos figuran en la categoría Yesod . Algunos de los más notables son yesod-core, warp, persistent y hamlet.

La realidad del desarrollo web de Haskell es que es mucho menos una opción exclusiva que la que parece percibirse. En general, los proyectos están muy poco acoplados y son bastante intercambiables. Puede crear un sitio web utilizando warp (el servidor web del equipo Yesod), atraco (el sistema de plantillas del equipo Snap) y estado ácido (el sistema de persistencia del proyecto Happstack). También puede usar snap-server con hamlet o persistente.

Dicho esto, los dos proyectos definitivamente tienen algunas diferencias. La mayor diferencia que puedo señalar objetivamente es que los proyectos de Yesod suelen hacer un uso intensivo de Template Haskell y cuasiquoting para crear DSL concisos, mientras que los proyectos de Snap se adhieren a la construcción de bibliotecas de combinador que favorecen la componibilidad. Casi cualquier otra diferencia que se me ocurra estará sesgada subjetivamente hacia Snap. Los paquetes paraguas nombrados después de ambos proyectos obviamente tomarán decisiones específicas para los componentes mencionados anteriormente, y estas opciones se reflejarán en las dependencias del proyecto. Pero eso todavía no significa que no pueda sacar algo diferente y usarlo también.

Snap tiene sesiones y autenticación , interfaces para varias bases de datos y un buen manejo de formularios ( aquí y aquí ) que utiliza funciones digestivas que incluyen soporte preempacado para listas dinámicamente anidadas arbitrariamente. Estos son solo algunos de los ecosistemas en crecimiento de snaplets conectables . Las sesiones y los snaplets de autenticación se escriben de una manera que es independiente del back-end. Entonces, con una pequeña cantidad de código de pegamento, debería poder usarlo con casi cualquier sistema de persistencia que se le ocurra. En el futuro, Snap se mantendrá con esta política tan a menudo como sea posible.

En su mayor parte, creo que la elección de Snap vs Yesod vs Happstack es menos una cuestión de características y más de gusto personal. Cada vez que alguien dice que uno de los marcos no tiene algo que otro tenga, la mayoría de las veces será bastante fácil extraer la funcionalidad faltante del otro marco importando el paquete necesario.

EDITAR: Para una comparación más detallada de los tres grandes marcos web de Haskell, consulte mi reciente publicación de blog . Para una comparación más áspera (pero posiblemente más útil) usando algunas generalizaciones más amplias, consulte mi Matriz de comparación de marcos web de Haskell

revs mightybyte
fuente
34
La naturaleza dual de la competencia amistosa y la combinación en el desarrollo web de Haskell parece muy prometedora. Dicho esto, recomendaría obtener la autenticación instantánea para piratear lo antes posible. Las sesiones y la autenticación son un gran problema.
Dan Burton el
2
Yesod también tiene una interfaz aún inédita para mongodb para persistente.
mxc
44
La velocidad de desarrollo tiene una influencia en mí, de ahí esta pregunta. Parece que Yesod tiene un impulso hacia adelante agregando características, mientras que Snap se ha mantenido estancado. Simplemente no sé de antemano cuáles son las nuevas características desde que escuché por primera vez hace más de 6 meses.
Muchin
3
Snap tiene bastante buen impulso. En primer lugar, fue el marco web más descargado sobre piratería el año pasado, aunque el proyecto no se lanzó públicamente hasta mayo. En segundo lugar, desde el lanzamiento de 0.3 en diciembre, hemos visto un gran aumento en la actividad. Las bibliotecas para sesiones, auth, mongoDB, la biblioteca xmlhtml y más están siendo trabajadas por personas que en su mayoría son nuevos contribuyentes en 2011. También puede encontrar 30 o más personas en el canal IRC #snapframework. Definitivamente es un proyecto activo.
mightybyte
2
De los dos elegí Snap simplemente porque, en ese momento, parecía tener un mayor impulso. Me ha impresionado mucho la calidad de los componentes. Heist tiene un diseño maravillosamente simple y limpio que es probablemente el mejor sistema de plantillas que he visto en cualquier framework web en cualquier idioma que haya usado. Las mónadas Snap son fáciles de trabajar y se comportan como se espera, es decir, sin sorpresas desagradables. ¡Solo desearía que se estandarizaran en ByteStrings o Text ya que constantemente estás convirtiendo entre ellos!
Andrew
223

Advertencia justa: soy el desarrollador principal de Yesod.

No estoy seguro de lo que no le gusta de la sintaxis de Javascript: es JavaScript simple con interpolación variable. En cuanto a CSS, Yesod ahora tiene Lucius, que le permite usar también CSS simple. Para HTML, puede usar fácilmente cualquier otra biblioteca que desee, incluido Heist (que utiliza Snap). Dicho esto, es un poco divertido omitir Yesod sobre la sintaxis CSS / Javascript, cuando Snap ni siquiera tiene una sintaxis para ello. Sin duda, eres bienvenido a su solución de solo archivos estáticos.

Yesod viene con soporte transparente para autenticación / autorización, URL de tipo seguro, widgets, correo electrónico y un montón de pequeñas cosas por todas partes (migas de pan, mensajes, destino final). Además, Yesod tiene un conjunto bastante rico de paquetes complementarios para cosas como comentarios y rebajas, y algunas bases de código grandes del mundo real para elegir por ejemplo. Si alguno de estos es atractivo para usted, es posible que desee verificar si sus alternativas los respaldan.

Michael Snoyman
fuente
Es muy nuevo, todavía no he tenido la oportunidad de actualizar la documentación. Pero básicamente, simplemente escriba CSS normal y use # {...} y @ {...} para la interpolación al igual que Hamlet / Cassius / Julius. La anidación también es compatible, pero eso tomará un poco más de espacio para explicar que este comentario;). Si envía un correo electrónico a desarrollo web, podemos brindarle más detalles allí mientras la documentación se pone al día.
Michael Snoyman
¿Algún cambio para usar Juliussin comprimir el código? Estoy usig Google Closurey necesito mantener metadatos en los comentarios para el compilador.
Andras Gyomrey
1
No creo que este sea un buen lugar para discutir tal cosa, pero no es necesario comprimir el código de Julius (no lo hace de manera predeterminada). Si necesita más ayuda, una mejor pregunta para SO o un hilo de lista de correo sería una mejor opción.
Michael Snoyman
29

Dar una aldea prueba- es posible que terminan gustando. Una reacción negativa a nivel superficial no es infrecuente. Sin embargo, nadie que haya usado la aldea se queja.

Además, ¿por qué no usar Happstack? El hecho de que no estén "en las noticias" no significa que no tengan un marco sólido.

Greg Weber
fuente
21
un mantenedor de yesod sugiriendo probar un marco competitivo. Qué gran comunidad tenemos.
mxc
12

Probablemente se refiera a la versión anterior de yesod. Las últimas versiones de yesod tienen una sintaxis simple para html, javascript y css.

La sintaxis html de la aldea de la biblioteca de plantillas de yesod es html simple con etiquetas completas de apertura y cierre y todos los atributos html normales. Sí, puede omitir las etiquetas de cierre y usar accesos directos para los atributos de identificación y clase. Pero no tienes que hacerlo. Puede continuar escribiendo html simple.

No solo eso, sino que las plantillas html pueden residir en archivos separados, al igual que en la biblioteca de plantillas Heist de Snap.

Las plantillas de script Java (julius) son archivos javascript simples, que también residen en archivos separados.

La plantilla css tiene una sintaxis diferente, pero la versión reciente de yesod ahora también proporciona una sintaxis css simple.

Si vas con Heist, no tendrás urls de tipo seguro.

En Heist, las plantillas html se leen desde el disco duro cada vez. Yesod compila todas las plantillas directamente en el ejecutable. No se lee ningún archivo desde el disco duro. Por lo tanto, la respuesta es mucho más rápida. Puedes ver los puntos de referencia tú mismo.

En Yesod puedes crear widgets que cooperen muy bien. Snap no trata con widgets en absoluto. Tendrás que rodar el tuyo.

Vagif Verdi
fuente
1
Como describí anteriormente, su comentario sobre las URL de tipo seguro es incorrecto y ayuda a perpetuar la idea errónea que menciono. Sería más preciso si dijeras "Heist" en lugar de "Snap".
mightybyte
3
Las URL seguras de tipo son posibles debido a una combinación de motor de plantilla Y mecanismo de enrutamiento. Entonces no es solo Heist. No obtendrá urls de tipo seguro en Snap simplemente usando Hamlet.
Vagif Verdi
1
No estoy hablando de aldea. El paquete de rutas web se escribió originalmente para Happstack, que tiene esencialmente la misma interfaz de enrutamiento que tiene Snap. Probablemente necesitará un pequeño código de pegamento, pero ese siempre será el caso.
mightybyte
44
No haría una pequeña observación de ese "código de pegamento". La plantilla Haskell a la que se refiere a continuación es lo que hace posible ese "código de pegamento" de una manera segura y concisa. Escribí una pequeña publicación de blog para abordar eso: yesodweb.com/blog/yesod-template-haskell
Michael Snoyman
3
Para aquellos que quieren ir con otro enfoque de plantillas (más débil, pero más flexible), HStringTemplate también funciona bien con todos los marcos, hasta donde yo sé, y permite leer plantillas sobre la marcha para el desarrollo, almacenarlas en caché para la producción y también compilar ellos a través de cuasiquotación si lo desea. El soporte qq es quizás de 13 líneas, y no tengo dudas de que el atraco podría agregarlo trivialmente, si hubiera demanda.
sclv