比较Haskell的Snap和Yesod web框架

最近新闻中的两个Haskell Web框架是Yesod (0.8)和Snap (0.4)。

很显然,Yesod目前比Snap支持更多的function。 但是,我受不了Yesod使用HTML,CSS和Javascript的语法。

所以,我想了解一下,如果我使用Snap而不使用Snap,我会错过什么。 例如,看起来不像数据库支持那里。 会话如何? 其他特性?

完全披露:我是Snap的主要开发人员之一。

首先,让我们来谈谈Snap是什么。 现在,Snap团队在hackage上维护了五个不同的项目:snap-core,snap-server,heist,snap和xmlhtml。 snap-server是一个web服务器,公开由snap-core定义的API。 heist是一个模板系统。 xmlhtml是由heist使用的XML / HTMLparsing和渲染库。 snap是一个综合性的项目,它提供了强大的snaplets API,使Web应用程序可组合和模块化。

Yesod拥有大量的hackage项目。 大部分(所有?)都列在Yesod类别中 。 一些值得注意的是肯定核心,翘曲,执着,和小村庄。

Haskell网站开发的现实是,它似乎比被认为是一个排他性或者select性要less得多。 一般来说,这些项目是非常松散的耦合,相当可以互换。 您可以使用warp(Yesod团队的Web服务器),heist(Snap团队的模板系统)和acid-state(Happstack项目的持久性系统)来构build网站。 你也可以使用哈姆雷特的snap-server或persistent。

也就是说,这两个项目肯定有一些分歧。 我可以客观地指出的最大的区别是,Yesod项目通常大量使用Template Haskell和quasiquoting来创build简洁的DSL,而Snap项目则坚持构build支持可组合性的组合器库。 就我所能想到的其他任何差异而言,主观上都会偏向Snap。 两个项目命名的伞包显然会为上述组件做出明确的select,这些select将反映在项目的依赖关系中。 但是,这并不意味着你不能拉扯不同的东西并使用它。

Snap有会话和身份validation ,与几个数据库的接口,以及使用消化函数的漂亮表单处理( 这里和这里 ),包括对任意嵌套的dynamic大小列表的预打包支持。 这些只是一些可插拔的生态系统的一部分 。 会话和身份validationsnaplets是以后端不可知论的方式编写的。 所以只要使用less量的胶水代码,就可以将其用于任何可以想到的持久性系统。 将来,Snap将会尽可能地坚持这一政策。

大多数情况下,我认为Snap vs Yesod vs Happstack的select不是一个特征问题,而是更多个人品味的问题。 每当有人说其中一个框架没有另一个框架的时候,大多数情况下,通过导入必要的软件包,很容易从其他框架中引入缺​​失的function。

编辑:三大Haskellnetworking框架的更详细的比较检查出我最近的博客文章 。 对于比较粗略的(但可能更有用的)比较,请参阅我的Haskell Web框架比较matrix

公平的警告:我是Yesod的首席开发人员。

我不确定你不喜欢的JavaScript语法:它是简单的JavaScript与可变插值。 至于CSS Yesod现在有Lucius,允许您也使用普通的CSS。 对于HTML,您可以轻松使用任何其他库,包括Heist(Snap使用的)。 也就是说,当Snap甚至没有它的语法时,跳过Yes / CSS / Javascript语法是件有趣的事情。 你当然欢迎他们只是静态文件的解决scheme。

Yesod带有对authentication/授权,types安全的URL,小部件,电子邮件以及各地(面包屑,邮件,最终目的地)的一些小东西的无缝支持。 另外,Yesod还有一套相当丰富的附加软件包,比如评论和降价,还有一些大型的现实代码库可供select。 如果这些对你有吸引力,你可能要检查你的替代品是否支持他们。

给哈姆雷特一个尝试 – 你可能会喜欢它。 表面上的负面反应并不罕见。 但是,没有人真正使用过哈姆雷特的抱怨。

另外,为什么不使用Happstack? 只是因为他们不是“新闻”,并不意味着他们没有一个坚实的框架。

你可能指的是老版本的yesod。 最新的yesod版本有html,javascript和css的纯语法。

yesod的模板库hamlet的html语法是纯html,具有完整的开始和结束标记以及所有正常的html属性。 是的,您可以省略结束标签,并使用id和class属性的快捷方式。 但是你不需要。 您可以继续编写纯html。

不仅如此,HTML模板可以驻留在单独的文件中,就像在Snap的模板库Heist中一样。

Java脚本模板(julius)是普通的JavaScript文件,也驻留在单独的文件中。

css模板确实有不同的语法,但是最近版本的yesod现在也提供了简单的css语法。

如果你跟海斯特一起去,你将不会有types安全的url。

在Heist html模板每次都从硬盘读取。 Yesod将所有模板直接编译到可执行文件中。 没有文件从硬盘读取。 因此,反应速度更快。 你可以自己看基准。

在Yesod中,您可以创build合作良好的小部件。 Snap根本不处理小部件。 你将不得不推出自己的。