比较Haskell的Snap和Yesod Web框架

Muc*_*hin 231 haskell web-frameworks yesod haskell-snap-framework

最近新闻中的两个Haskell网络框架是Yesod(0.8)和Snap(0.4).

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

所以,如果我选择使用Snap,我想了解我会失踪的内容.例如,看起来不像数据库支持那样.会议怎么样?其他特性?

mig*_*yte 237

完全披露:我是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类别中.其中一些值得注意的是yesod-core,warp,persistent和hamlet.

Haskell Web开发的现实是,它远不是一种独特的选择,而是一种似乎被认为的独特或选择.一般来说,这些项目非常松散,可以互换.您可以使用warp(Yesod团队的Web服务器),heist(Snap团队的模板系统)和酸状态(Happstack项目的持久性系统)构建一个网站.您还可以将snap-server与hamlet或persistent一起使用.

也就是说,这两个项目肯定存在一些差异.我可以客观地指出的最大区别是Yesod项目通常大量使用Template Haskell和quasiquoting来创建简洁的DSL,而Snap项目坚持构建有利于可组合性的组合库.几乎我能想到的任何其他差异都会主观偏向于Snap.以两个项目命名的伞包显然将为上述组件做出具体选择,这些选择将反映在项目依赖项中.但这并不意味着你不能拉入不同的东西并使用它.

Snap确实具有会话身份验证,与几个数据库的接口,以及使用消化函数的良好表单处理(此处此处),其中包括对任意嵌套的动态大小列表的预打包支持.这些只是一些不断增长的可插拔snaplet生态系统.会话和身份验证快照以后端不可知的方式编写.因此,只需使用少量的胶水代码,您就可以将它与几乎任何您能想到的持久性系统一起使用.将来,Snap将尽可能坚持这一政策.

在大多数情况下,我认为Snap vs Yesod和Happstack的选择不再是功能问题,而是个人品味问题.每当有人说其中一个框架没有其他框架所具有的东西时,大多数情况下通过导入必要的软件包很容易从其他框架中获取缺少的功能.

编辑:有关三大Haskell Web框架的更详细比较,请查看我最近的博客文章.有关使用更广泛的一般化的更粗略(但可能更有用)的比较,请参阅我的Haskell Web框架比较矩阵

  • Haskell网络开发中友好竞争和混合搭配的双重性质似乎非常有希望.也就是说,我建议尽快将snap-auth转移到hackage上.会话和身份验证是一个大问题. (34认同)
  • 发展速度对我有影响,因此这个问题.看起来非常像Yesod具有前进动力增加功能,而Snap仍然停滞不前.我不知道自从我6个多月前第一次听到它以来有什么新功能. (3认同)
  • Snap的势头非常好.首先,尽管该项目直到5月才公开发布,但它是去年下载最多的hackage网络框架.其次,自12月份发布0.3以来,我们看到活动大幅增加.会话,auth,mongoDB,xmlhtml库等的图书馆都在2011年为大多数新贡献者提供服务.您通常也可以在#snapframework IRC频道中找到30个或更多人.这绝对是一个活跃的项目. (3认同)
  • Yesod还有一个尚未发布的mongodb接口,用于持久化. (2认同)
  • 在我为Snap而奋斗的两个人中,仅仅是因为当时似乎有更大的动力.我对组件的质量印象非常深刻.Heist有一个非常简单和干净的设计,可能是我在任何使用过任何语言的Web框架上看到的最好的模板系统.Snap monad易于使用,并且表现得非常符合您的预期,即没有令人讨厌的惊喜.我只是希望他们在ByteStrings或Text上标准化,因为你不断在它们之间进行转换! (2认同)

Mic*_*man 223

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

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

Yesod提供无缝支持身份验证/授权,类型安全的URL,小部件,电子邮件以及各种各样的小东西(面包屑,消息,最终目的地).此外,Yesod还提供了一套相当丰富的附加软件包,用于注释和降价,还有一些大型的真实代码库可供选择.如果其中任何一个对您有吸引力,您可能需要检查您的替代品是否支持它们.


Gre*_*ber 29

试试哈姆雷特 - 你最终可能会喜欢它.表面层面的负面反应并不罕见.然而,实际上没有使用过哈姆雷特的人抱怨.

另外,为什么不使用Happstack?仅仅因为他们不是"在新闻中"并不意味着他们没有一个坚实的框架.

  • yesod的维护者建议尝试使用竞争框架.我们拥有多么伟大的社区. (20认同)

Vag*_*rdi 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根本不涉及小部件.你必须自己动手.

  • 我不会对"胶水代码"这么小的说法.您在下面引用的模板Haskell是以安全,简洁的方式使"粘合代码"成为可能的原因.我写了一篇小博文来解决这个问题:http://www.yesodweb.com/blog/yesod-template-haskell (4认同)
  • 由于模板引擎和路由机制的组合,可以使用类型安全URL.所以这不仅仅是海斯特.只需使用hamlet,你就不会在Snap中获得类型安全的URL. (3认同)
  • 对于那些想要采用另一种(更弱但更灵活)的模板方法的人来说,HStringTemplate也可以很好地适用于所有框架,据我所知,它允许动态读取模板进行开发,缓存它们用于生产,还可以编译如果需要,他们可以通过quasiquotation.qq的支持可能是13行,我毫不怀疑,如果有需求,抢劫可以琐碎添加它. (3认同)