【问题标题】:Comparing Haskell's Snap and Yesod web frameworks比较 Haskell 的 Snap 和 Yesod Web 框架
【发布时间】:2013-02-22 01:24:08
【问题描述】:

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

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

所以,我想了解如果我改用 Snap 会错过什么。例如,看起来不存在数据库支持。会话怎么样?其他功能?

【问题讨论】:

  • 我个人无法忍受 html 用于 html 的语法 ;)
  • 生成html的hamlet模板语法你不喜欢什么?
  • 我不喜欢我不能在 Dreamweaver 和 Yesod 之间移动,因为语法不同。
  • 总的来说,Yesod 团队对新想法非常开放。既然我知道了您的用例,我可能会为您推荐一个好的解决方案。最好向 web-devel 列表发送电子邮件,因为 SO 不是协作讨论的最佳场所。
  • 人们还在使用 Dreamweaver? ;)

标签: haskell web-frameworks yesod haskell-snap-framework


【解决方案1】:

全面披露:我是 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 确实有 sessions 和 authentication,与多个数据库的接口,以及使用 digestive-functors 的良好表单处理(here 和 here),其中包括对任意嵌套的动态大小列表的预打包支持。这些只是growing ecosystem of pluggable snaplets 的一部分。会话和身份验证 snaplets 以与后端无关的方式编写。因此,只需少量粘合代码,您就可以将它与您能想到的任何持久性系统一起使用。未来,Snap 将尽可能多地坚持这一政策。

在很大程度上,我认为 Snap、Yesod 和 Happstack 的选择与其说是功能问题,不如说是个人品味问题。每当有人说其中一个框架没有另一个框架有的东西时,大多数时候通过导入必要的包从另一个框架中提取缺少的功能会很容易。

编辑:有关三大 Haskell Web 框架的更详细比较,请查看我最近的 blog post。对于使用一些更广泛的概括进行更粗略(但可能更有用)的比较,请参阅我的Haskell Web Framework Comparison Matrix

【讨论】:

  • Haskell Web 开发中友好竞争和混搭的双重性质似乎很有前景。也就是说,我建议尽快让 snap-auth 进行破解。会话和身份验证很重要。
  • Yesod 还有一个尚未发布的 mongodb 接口,用于持久化。
  • 发展速度对我有影响,因此提出了这个问题。看起来 Yesod 非常有前进的动力来增加功能,而 Snap 却一直停滞不前。自从我 6 个多月前第一次听说它以来,我只是不知道有哪些新功能。
  • Snap 势头不错。首先,它是去年 hackage 上下载次数最多的 Web 框架,尽管该项目直到 5 月才公开发布。其次,自 12 月发布 0.3 版本以来,我们看到活动大幅增加。会话库、auth、mongoDB、xmlhtml 库等都由 2011 年的大部分新贡献者开发。您通常还可以在 #snapframework IRC 频道中找到 30 人或更多人。这绝对是一个活跃的项目。
  • 在这两个中,我选择了 Snap,只是因为当时它的势头似乎更大。我对组件的质量印象深刻。 Heist 有一个漂亮简单和干净的设计,这可能是我在任何网络框架上看到的最好的模板系统,我用过的任何语言。 Snap monad 很容易使用,并且表现得和你预期的差不多,即没有令人讨厌的惊喜。我只是希望他们在 ByteStrings 或 Text 上进行标准化,因为您会不断地在它们之间进行转换!
【解决方案2】:

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

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

Yesod 提供对身份验证/授权、类型安全的 URL、小部件、电子邮件和各种小东西(面包屑、消息、最终目的地)的无缝支持。另外,Yesod 有一套相当丰富的附加包,用于诸如 cmets 和 markdown 之类的东西,还有一些大型的真实世界代码库可供选择。如果其中任何一个对您有吸引力,您可能需要检查您的替代方案是否支持它们。

【讨论】:

  • 很新,我还没有机会更新文档。但基本上,只需输入普通 CSS,并使用 #{...} 和 @{...} 进行插值,就像 Hamlet/Cassius/Julius 一样。也支持嵌套,但这将比这个评论多一点解释的空间;)。如果您向 web-devel 发送电子邮件,我们可以在文档更新时为您提供更多详细信息。
  • 在不压缩代码的情况下使用Julius 的任何更改?我是 usig Google Closure,我需要将元数据保存在 cmets 中以供编译器使用。
  • 我不认为这是讨论这种事情的好地方,但不需要压缩 Julius 代码(默认情况下不这样做)。如果您需要更多帮助,单独的 SO 问题或邮件列表线程将是更好的选择。
【解决方案3】:

试试小村庄——你可能最终喜欢它。肤浅的负面反应并不少见。然而,没有人真正使用过 hamlet 抱怨。

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

【讨论】:

  • yesod 的维护者建议尝试一个竞争框架。我们有一个多么棒的社区。​​span>
【解决方案4】:

您可能指的是旧版本的 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 根本不处理小部件。你必须自己动手。

【讨论】:

  • 正如我上面所描述的,您对类型安全 URL 的评论是不正确的,并且有助于使我提到的误解永久化。如果您说“Heist”而不是“Snap”会更准确。
  • 由于模板引擎和路由机制的结合,可以使用类型安全的 url。所以这不仅仅是抢劫。仅使用 hamlet 将无法在 Snap 中获得类型安全的 url。
  • 我不是在谈论小村庄。 web-routes 包最初是为 Happstack 编写的,它具有与 Snap 基本相同的路由接口。您可能需要一些胶水代码,但几乎总是如此。
  • 我不会对那个“胶水代码”做这么小的说明。您在下面提到的 Template Haskell 是以安全、简洁的方式使“粘合代码”成为可能的原因。我写了一篇小博文来解决这个问题:yesodweb.com/blog/yesod-template-haskell
  • 对于那些想要使用另一种(更弱,但更灵活)模板方法的人,据我所知,HStringTemplate 也适用于所有框架,并允许动态读取模板进行开发,缓存它们以供生产,如果需要,还可以通过准引用编译它们。 qq 支持大概是 13 行,如果有需求,我相信 heist 可以轻松添加它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多