比较Haskell的Snap和Yesod Web框架


231

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

很明显,Yesod目前比Snap支持更多的功能。但是,我无法忍受Yesod用于HTML,CSS和Javascript的语法。

因此,我想了解如果我选择使用Snap,将会缺少什么。例如,看起来好像没有数据库支持。会议怎么样?其他特性?


138
我个人无法忍受html用于html的语法;)
Rehno Lindeque 2011年

2
您不喜欢用于生成HTML的Hamlet模板语法的什么?
mxc 2011年

6
我不喜欢在Dreamweaver和Yesod之间移动,因为语法不同。
Muchin

6
通常,Yesod团队非常乐于接受新想法。现在,我知道了您的用例,我可能会为您推荐一个好的解决方案。最好将电子邮件发送到Web开发列表,因为SO并不是进行协作讨论的最佳场所。
Michael Snoyman 2011年

76
人们还在使用 Dreamweaver吗?;)
OJ。

Answers:


236

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

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

Yesod有很多关于黑客的项目。其中大多数(全部?)列在Yesod类别中。其中一些值得注意的是yesod-core,warp,persistent和hamlet。

Haskell Web开发的现实是,与其说它似乎是排他性的,要么它是一种选择。通常,这些项目之间的耦合非常松散,并且可以互换。您可以使用warp(Yesod团队的Web服务器),heist(Snap团队的模板系统)和acid-state(Happstack项目的持久性系统)来构建网站。您也可以将快照服务器与hamlet或persistant一起使用。

也就是说,这两个项目肯定有一些差异。我可以客观地指出的最大区别是,Yesod项目通常大量使用Template Haskell和准引用来创建简洁的DSL,而Snap项目则坚持构建有利于可组合性的组合器库。我能想到的几乎所有其他差异都会在主观上偏向Snap。以两个项目命名的伞形软件包显然将为上述组件做出特定选择,这些选择将反映在项目依赖项中。但这仍然并不意味着您不能使用其他功能。

Snap确实具有会话身份验证,与多个数据库的接口以及使用摘要功能的良好表单处理(此处此处),其中包括对任意嵌套的动态可调整大小列表的预包装支持。这些只是不断增长的可插入快照的生态系统中的一部分。会话和身份验证快照的编写方式与后端无关。因此,使用少量的粘合代码,您应该能够将其与您能想到的几乎所有持久性系统一起使用。将来,Snap将尽可能多地坚持这一政策。

在大多数情况下,我认为选择Snap vs Yesod vs Happstack并不是功能上的问题,而是个人风格的选择。每当有人说一个框架没有另一个框架拥有的东西时,大多数时候,通过导入必要的包来从另一个框架中获取缺少的功能是很容易的。

编辑:有关三大Haskell Web框架的更详细比较,请查看我最近的博客文章。要使用更广泛的概括进行更粗略(但可能更有用)的比较,请参阅我的Haskell Web框架比较表


34
Haskell Web开发中友好竞争和混合搭配的双重性质似乎非常有前途。就是说,我建议尽快进行快照身份验证。会话和身份验证很重要。
丹·伯顿

2
Yesod还具有一个尚未发布的mongodb接口,用于持久化。
mxc 2011年

4
发展的速度对我有影响,因此这个问题。看起来Yesod具有前进的动力添加功能,而Snap仍然停滞不前。自六个月前我第一次听说它以来,我只是不知道这些新功能是什么。
Muchin

3
Snap的势头很好。首先,尽管该项目直到五月份才公开启动,但它是去年下载次数最多的黑客攻击Web框架。其次,自从12月发布0.3版本以来,我们发现活动量大大增加。会话,auth,mongoDB,xmlhtml库等库都由2011年大部分是新参与者的人们使用。在#snapframework IRC频道中,您通常还可以找到30个或更多人员。这绝对是一个活跃的项目。
mayybyte

2
我之所以选择两人中的Snap,只是因为当时它似乎有更大的动力。组件的质量给我留下了深刻的印象。Heist设计精美,简洁美观,这可能是我在使用任何语言的任何Web框架上看到的最佳模板系统。Snap monad易于使用,并且表现出与您期望的差不多的效果,即没有令人讨厌的惊喜。我只是希望它们能够在ByteStrings或Text上实现标准化,因为您不断在它们之间进行转换!
安德鲁(Andrew)

223

合理的警告:我是Yesod的首席开发人员。

我不确定您对Javascript语法不满意的地方:它是带有变量插值的普通javascript。至于CSS,Yesod现在拥有Lucius,它还允许您使用普通CSS。对于HTML,您可以轻松使用所需的任何其他库,包括Heist(Snap的用途)。也就是说,当Snap甚至没有语法时,跳过Yesod跳过CSS / Javascript语法是一件很有趣的事情。当然欢迎您使用仅静态文件的解决方案。

Yesod随附了对身份验证/授权,类型安全的URL,小部件,电子邮件以及到处都是的一些小东西(面包屑,消息,最终目标)的无缝支持。另外,Yesod有一套相当丰富的附加程序包,可用于注释和减价等活动,还有一些大型的实际代码库可供选择。如果这些对您有吸引力,则您可能需要检查您的替代产品是否支持它们。


这是非常新的,我还没有机会更新文档。但基本上,只需键入普通CSS,然后像Hamlet / Cassius / Julius一样使用#{...}和@ {...}进行插值。还支持嵌套,但是比该注释要花更多的空间来解释;)。如果您通过电子邮件发送web-devel,我们可以在文档更新时为您提供更多详细信息。
Michael Snoyman 2011年

Julius不压缩代码的情况下可以使用任何更改吗?我是usig Google Closure,需要将元数据保留在编译器的注释中。
Andras Gyomrey 2014年

1
我认为这不是讨论此类问题的好地方,但是并不需要压缩Julius代码(默认情况下不会压缩)。如果您需要更多帮助,那么单独的SO问题或邮件列表主题将是更好的选择。
Michael Snoyman 2014年

29

尝试一下小村庄-您可能最终会喜欢它。肤浅的负面反应并不罕见。然而,没有人实际使用过小村庄。

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


21
yesod的维护者建议尝试使用竞争性框架。我们有一个很棒的社区。
mxc

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根本不处理小部件。您将不得不自己动手。


1
如上文所述,您对类型安全URL的评论是不正确的,并且有助于使我提到的误解永存。如果您说“抢劫”而不是“捕捉”,那将更加准确。
mayybyte

3
由于模板引擎和路由机制的组合,因此可以使用类型安全的url。因此,不仅是抢劫案。您不会仅使用hamlet在Snap中获得类型安全的url。
Vagif Verdi

1
我不是在谈论小村庄。Web路由程序包最初是为Happstack编写的,它具有与Snap相同的路由接口。您可能需要一些粘合代码,但情况总是如此。
mayybyte

4
我不会对“胶水代码”说得太小。您在下面引用的Template Haskell是使“胶水代码”以安全,简洁的方式变为可能的原因。我写了一个小博客文章来解决这个问题:yesodweb.com/blog/yesod-template-haskell
Michael Snoyman 2011年

3
据我所知,对于那些想要使用另一种(较弱但更灵活)的模板化方法的人,HStringTemplate在所有框架中也能很好地发挥作用,并允许即时读取模板以进行开发,将其缓存以用于生产以及编译。如果需要,可以通过准引号将它们插入。QQ支撑可能是13行,如果有需求,我毫不怀疑抢劫案可以轻松地添加。
sclv 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.