最近新闻中的两个Haskell网络框架是Yesod(0.8)和Snap(0.4)。
很明显,Yesod目前支持的功能远远多于Snap。但是,我无法忍受Yesod用于其HTML,CSS和Javascript的语法。
所以,如果我选择使用Snap,我想了解一下我会失踪的东西。例如,看起来不像数据库支持那样。会议怎么样?其他功能?
答案 0 :(得分:236)
完全披露:我是Snap的主要开发者之一。
首先,我们来谈谈Snap是什么。现在,Snap团队在hackage上维护着五个不同的项目:snap-core,snap-server,heist,snap和xmlhtml。 snap-server是一个Web服务器,它公开snap-core定义的API。抢劫是一个模板系统。 xmlhtml是由heist使用的XML / HTML解析和呈现库。 snap是一个综合项目,将它们粘合在一起,并提供强大的snaplet API,使Web应用程序可组合和模块化。
Yesod有很多关于hackage的项目。大多数(全部?)列在Yesod category中。其中一些值得注意的是yesod-core,warp,persistent和hamlet。
Haskell网络开发的现实是,它似乎不是一种独特的或选择,而是看起来似乎被认为。一般来说,项目非常松散耦合,可以互换。您可以使用warp(Yesod团队的Web服务器),heist(Snap团队的模板系统)和酸状态(Happstack项目的持久性系统)构建一个网站。您也可以将snap-server与hamlet或persistent一起使用。
也就是说,这两个项目肯定存在一些差异。我可以客观地指出的最大区别是Yesod项目通常大量使用Template Haskell和quasiquoting来创建简洁的DSL,而Snap项目坚持构建有利于可组合性的组合库。几乎我能想到的任何其他差异都会主观偏向于Snap。以两个项目命名的伞包显然将为上述组件做出具体选择,这些选择将反映在项目依赖项中。但这仍然并不意味着你不能吸引不同的东西并使用它。
Snap确实有sessions和authentication,与几个数据库的接口,以及使用包含预先打包支持的here的精美表单处理(here和digestive-functors)对于任意嵌套的动态大小的列表。这些只是growing ecosystem of pluggable snaplets中的一部分。会话和身份验证快照以后端不可知的方式编写。因此,只需使用少量的胶水代码,您就可以将它与几乎任何您能想到的持久性系统一起使用。将来,Snap将尽可能坚持这一政策。
在大多数情况下,我认为Snap vs Yesod vs Happstack的选择不再是功能问题,而是个人品味问题。每当有人说其中一个框架没有其他框架的东西时,大多数情况下通过导入必要的软件包从其他框架中获取缺少的功能将非常容易。
编辑:有关三大Haskell Web框架的更详细比较,请查看我最近的blog post。对于使用更广泛的一般化的更粗略(但可能更有用)的比较,请参阅我的Haskell Web Framework Comparison Matrix
答案 1 :(得分:222)
公平警告:我是Yesod的首席开发人员。
我不确定你对Javascript语法不喜欢它:它是带有可变插值的普通javascript。至于CSS Yesod现在有Lucius,它允许你也使用纯CSS。对于HTML,您可以轻松使用任何其他所需的库,包括Heist(Snap使用的)。也就是说,当Snap甚至没有语法时,通过CSS / Javascript语法跳过Yesod会有点滑稽。当然欢迎您使用他们的静态文件解决方案。
Yesod提供无缝支持身份验证/授权,类型安全的URL,小部件,电子邮件以及各种各样的小东西(面包屑,消息,最终目的地)。此外,Yesod还提供了一套相当丰富的附加软件包,用于注释和降价,还有一些大型的真实代码库可供选择。如果其中任何一个对您有吸引力,您可能需要检查您的替代品是否支持它们。
答案 2 :(得分:29)
尝试一下哈姆雷特 - 你可能最终喜欢它。表面层面的负面反应并不罕见。但是,没有人实际上使用小村庄抱怨。
另外,为什么不使用Happstack?仅仅因为他们不是“新闻报道”并不意味着他们没有坚实的框架。
答案 3 :(得分:12)
你可能指的是旧版的yesod。最新的yesod版本具有html,javascript和css的简单语法。
yesod的模板库hamlet的html语法是纯HTML,带有完整的开始和结束标记以及所有正常的html属性。是的,您可以省略结束标记并使用id和class属性的快捷方式。但你没必要。你可以继续写简单的HTML。
不仅如此,html模板可以驻留在单独的文件中,就像在Snap的模板库Heist中一样。
Java脚本模板(julius)是普通的javascript文件,也驻留在单独的文件中。
css模板确实有不同的语法,但最近版本的yesod现在也提供了普通的css语法。
如果你选择Heist,你就不会有类型安全的网址。
在Heist中,每次都会从硬盘驱动器中读取html模板。 Yesod将所有模板直接编译到可执行文件中。没有从硬盘读取文件。因此响应速度更快。您可以自己查看基准测试。
在Yesod中,您可以创建可以很好地协作的小部件。 Snap根本不涉及小部件。你必须自己动手。