最近新闻中的两个 Haskell Web 框架是Yesod(0.8 版本)和Snap(0.4 版本)。
很明显,Yesod 目前支持的功能比 Snap 多得多。但是,我无法忍受 Yesod 用于其 HTML、CSS 和 Javascript 的语法。
所以,我想了解如果我改用 Snap,我会错过什么。例如,看起来不存在数据库支持。会话怎么样?其它功能?
全面披露:我是 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 类别中。其中一些值得注意的是 yesod-core、warp、persistent 和 hamlet。
Haskell Web 开发的现实是,它不像人们想象的那样是一种排他或选择。一般来说,这些项目非常松散耦合并且可以互换。您可以使用 warp(Yesod 团队的 Web 服务器)、heist(Snap 团队的模板系统)和 acid-state(Happstack 项目的持久性系统)来构建网站。您还可以将 snap-server 与 hamlet 或持久化一起使用。
也就是说,这两个项目肯定存在一些差异。我可以客观指出的最大区别是 Yesod 项目通常大量使用 Template Haskell 和 quasiquoting 来创建简洁的 DSL,而 Snap 项目则坚持构建有利于可组合性的组合库。几乎我能想到的任何其他差异都会在主观上偏向于 Snap。以这两个项目命名的伞包显然会针对上述组件做出具体的选择,而这些选择会体现在项目依赖中。但这并不意味着你不能引入不同的东西并使用它。
Snap 确实具有会话和身份验证、多个数据库的接口以及使用消化函子的良好表单处理(此处和此处) ,其中包括对任意嵌套的动态可调整大小列表的预打包支持。这些只是不断增长的可插拔 snaplets 生态系统中的一部分。会话和身份验证 snaplets 以与后端无关的方式编写。因此,只需少量胶水代码,您就可以将它与您能想到的任何持久性系统一起使用。未来,Snap 将尽可能多地坚持这一政策。
在大多数情况下,我认为 Snap、Yesod 和 Happstack 的选择与其说是功能问题,不如说是个人品味问题。每当有人说其中一个框架没有另一个框架有的东西时,大多数时候通过导入必要的包从另一个框架中提取缺少的功能会很容易。
编辑:有关三大 Haskell Web 框架的更详细比较,请查看我最近的博客文章。对于使用一些更广泛的概括进行更粗略(但可能更有用)的比较,请参阅我的Haskell Web 框架比较矩阵
公平警告:我是 Yesod 的首席开发人员。
我不确定您不喜欢 Javascript 语法的哪些方面:它是带有变量插值的纯 javascript。至于 CSS Yesod 现在有 Lucius,它允许你也使用纯 CSS。对于 HTML,您可以轻松使用所需的任何其他库,包括 Heist(Snap 使用的)。也就是说,跳过 Yesod 跳过 CSS/Javascript 语法有点有趣,而 Snap 甚至没有语法。当然欢迎您使用他们的静态文件解决方案。
Yesod 提供对身份验证/授权、类型安全的 URL、小部件、电子邮件和各种小东西(面包屑、消息、最终目的地)的无缝支持。此外,Yesod 有一套相当丰富的附加包,用于注释和降价等内容,以及一些大型的真实世界代码库可供选择。如果其中任何一个对您有吸引力,您可能需要检查您的替代方案是否支持它们。
试试哈姆雷特 - 你最终可能会喜欢它。肤浅的负面反应并不少见。然而,真正使用过小村庄的人都没有抱怨。
另外,为什么不使用 Happstack?仅仅因为它们不在“新闻中”并不意味着它们没有可靠的框架。
您可能指的是旧版本的 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 根本不处理小部件。你必须自己动手。