比较Haskell的Snap和Yesod网络框架

235
最近新闻中涉及到的两个Haskell Web框架是Yesod(版本为0.8)和Snap(版本为0.4)。
很明显,Yesod目前支持的功能比Snap多得多。然而,我无法忍受Yesod用于HTML、CSS和JavaScript的语法。
因此,我想了解一下如果我选择Snap会失去什么。例如,似乎没有数据库支持。会话呢?其他功能呢?

139
就我个人而言,我无法忍受 HTML 使用的语法 ;) - Rehno Lindeque
2
你不喜欢 Hamlet 模板语法生成 HTML 的哪些方面? - max
6
我不喜欢Dreamweaver和Yesod之间的切换,因为它们的语法不同。 - Muchin
6
通常,Yesod团队非常愿意接受新想法。现在我知道了您的用例,我可能可以为您推荐一个好的解决方案。如果您发送一封电子邮件到web-devel列表,那将是最好的选择,因为SO不是进行协作讨论的最佳场所。 - Michael Snoyman
77
人们还在使用 Dreamweaver 吗? ;) - OJ.
显示剩余3条评论
4个回答

239

完全透明化:我是Snap的主要开发人员之一。

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

Yesod在hackage上有大量的项目。大多数(全部?)都列在Yesod category中。其中一些著名的是yesod-core、warp、persistent和hamlet。

Haskell Web开发的现实是,它比看起来要少得多的“排他性选择”。通常,这些项目非常松散耦合且相当可互换的。您可以使用warp(Yesod团队的Web服务器)、heist(Snap团队的模板系统)和acid-state(Happstack项目的持久性系统)构建网站。您还可以使用snap-server与hamlet或persistent。

说实话,这两个项目确实有一些不同之处。我可以客观地指出最大的区别是,Yesod 项目通常大量使用 Template Haskell 和 quasiquoting 来创建简洁的 DSL,而 Snap 项目则坚持构建组合库,更注重可组合性。我能想到的任何其他差异都会对 Snap 产生主观偏见。以这两个项目命名的伞形包显然会为上述组件做出具体选择,并且这些选择将反映在项目依赖项中。但这仍然并不意味着您不能引入其他不同的内容并将其用于项目中。
Snap确实提供会话身份验证,接口连接多个数据库,以及使用digestive-functors的良好表单处理机制(here and here),其中包括对任意嵌套动态大小列表的预打包支持。这些只是越来越多的可插拔snaplets生态系统的一部分。会话和身份验证snaplets的编写方式是后端无关的。所以只需要少量的胶水代码,你就可以将它与几乎所有你能想到的持久性系统一起使用。未来,Snap将尽可能坚持此策略。
在大多数情况下,我认为Snap vs Yesod vs Happstack的选择更多地取决于个人喜好而不是功能问题。每当有人说某个框架没有另一个框架具有的某些功能时,大多数时候我们很容易通过导入必要的软件包从其他框架中拉取缺失的功能。

编辑:如果您想进行更详细的比较,可以查看我最近的博客文章。如果您想使用一些更广泛的概括来进行更粗略(但可能更有用)的比较,请查看我的Haskell Web Framework Comparison Matrix


34
Haskell网络开发中友好竞争和混合匹配的双重特性似乎非常有前途。话虽如此,我建议尽快将snap-auth上传到hackage。会话和身份验证非常重要。 - Dan Burton
2
Yesod还有一个尚未发布的与mongodb接口用于持久化的功能。 - max
4
开发速度对我有影响,所以问这个问题。看起来Yesod在增加新特性方面具有推动力,而Snap则一直停滞不前。我只是不知道自从6个月前第一次听说它以来,有哪些新特性。 - Muchin
3
Snap的发展势头不错。首先,尽管该项目直到去年5月才公开发布,但它在去年成为了Hackage上下载量最大的Web框架。其次,自从去年12月推出0.3版本以来,我们看到了活动量的大幅增加。会话、认证、MongoDB、xmlhtml库等各种库都得到了人们的积极开发,其中大部分贡献者是2011年新加入的。你还可以在#snapframework IRC频道中找到30多个人或更多。这绝对是一个活跃的项目。 - mightybyte
2
我选择Snap,是因为当时它似乎有更大的动力。我对组件的质量印象非常深刻。Heist拥有美丽简洁的设计,可能是我使用过的任何语言的任何Web框架中最好的模板系统。Snap monads易于使用,并且表现几乎与您预期的相同,即没有令人讨厌的意外。我只希望他们能够在ByteStrings或Text上标准化,因为你不断地在它们之间转换! - Andrew
显示剩余2条评论

226

提醒一下:我是Yesod的首席开发人员。

我不确定您对JavaScript语法有何不喜:它只是普通的JavaScript,具有变量插值。至于CSS,Yesod现在有Lucius,允许您还使用纯CSS。对于HTML,您可以轻松地使用任何其他库,包括Heist(Snap使用的库)。也就是说,如果Snap甚至没有语法来处理CSS / JavaScript,那么跳过Yesod似乎有点可笑。您当然可以使用他们的解决方案,即仅使用静态文件。

Yesod无缝支持身份验证/授权、类型安全的URL、小部件、电子邮件以及各种小功能(面包屑、消息、终极目标等)。此外,Yesod还有一些相当丰富的附加包,用于评论和Markdown等功能,并且还有一些大型的真实代码库供您参考。如果这些功能中的任何一个对您有吸引力,您可能需要检查一下其他选择是否支持它们。


非常新,我还没有更新文档的机会。但基本上,只需输入普通CSS,并使用#{...}和@{...}进行插值,就像Hamlet/Cassius/Julius一样。嵌套也受支持,但需要比这个评论更多的空间来解释;如果您发送电子邮件至web-devel,我们可以在文档更新之前在那里为您提供更多详细信息。 - Michael Snoyman
有没有不压缩代码就能使用Julius的方法?我正在使用Google Closure,需要在注释中保留元数据以供编译器使用。 - Andras Gyomrey
1
我认为这不是讨论这种事情的好地方,但没有要求将Julius代码压缩(默认情况下它不会这样做)。如果您需要更多帮助,单独的SO问题或邮件列表线程可能更好。 - Michael Snoyman

29

尝试一下Hamlet - 你可能会最终喜欢它。表面上的负面反应并不罕见,但实际使用过Hamlet的人没有人会抱怨。

另外,为什么不使用Happstack?仅仅因为他们不在新闻中,并不意味着他们没有稳固的框架。


21
Yesod的维护者建议尝试一下竞争框架。我们拥有一个很棒的社区。 - max

12

你可能指的是旧版本的Yesod。最新的Yesod版本具有纯HTML、JavaScript和CSS的语法。

Yesod的模板库Hamlet的HTML语法是包含完整开放和闭合标签以及所有正常HTML属性的纯HTML。是的,您可以省略关闭标签并使用id和class属性的快捷方式。但是你不必这样做,你可以继续编写纯HTML。

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

Java脚本模板(julius)是纯JavaScript文件,也存储在单独的文件中。

CSS模板确实具有不同的语法,但是Yesod的最新版本现在也提供了纯CSS语法。

如果您选择Heist,您将没有类型安全的URL。

在Heist中,HTML模板每次都会从硬盘中读取。Yesod直接将所有模板编译到可执行文件中,不需要从硬盘中读取任何文件。因此响应速度更快。你可以自己看看基准测试。

在Yesod中,你可以创建良好配合的小部件。Snap根本不处理小部件。你将不得不自己设计。


1
正如我上面所描述的,你关于类型安全URL的评论是不正确的,并且帮助延续了我提到的误解。如果你说“Heist”而不是“Snap”,那将更准确。 - mightybyte
3
由于模板引擎和路由机制的结合,类型安全的URL是可能的。因此,这不仅适用于Heist。仅仅使用hamlet在Snap中是无法获得类型安全的URL。 - Vagif Verdi
1
我不是在谈论哈姆雷特。web-routes包最初是为Happstack编写的,它具有与Snap基本相同的路由接口。你可能需要一些粘合代码,但这几乎总是情况。 - mightybyte
我同意Haskell Web框架更像是一组库的编译,可以轻松地以新的方式重新组合。 - Vagif Verdi
4
我会尽力完成翻译任务。以下是需要翻译的内容:我不会仅仅将“胶水代码”视为小问题。下面你所提到的Template Haskell正是以一种安全、简明的方式使得“胶水代码”成为可能。我写了一个小博客来解释这一点:http://www.yesodweb.com/blog/yesod-template-haskell - Michael Snoyman
3
想采用另一种(更弱但更灵活)的模板方法的人,HStringTemplate也可以很好地与所有框架配合使用,据我所知,它允许在开发过程中即时读取模板,对于生产环境进行缓存,并通过引用编译将其编译进去。如果需要,qq支持可能只需要添加大约13行代码,我毫不怀疑Heist可以轻松实现这一点,只要有需求。 - sclv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接