比较Haskell的Snap和Yesod Web框架

如何解决比较Haskell的Snap和Yesod Web框架

|| 最近新闻中的两个Haskell Web框架是Yesod(0.8)和Snap(0.4)。 很明显,Yesod目前比Snap支持更多的功能。但是,我无法忍受Yesod用于HTML,CSS和Javascript的语法。 因此,我想了解如果我选择使用Snap,将会缺少什么。例如,看起来好像没有数据库支持。会议怎么样?其它功能?     

解决方法

全面披露:我是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框架比较表     ,合理警告:我是Yesod的首席开发人员。 我不确定您对Javascript语法的不满意之处:它是带有可变插值的普通javascript。至于CSS,Yesod现在拥有Lucius,它还允许您使用普通CSS。对于HTML,您可以轻松使用所需的任何其他库,包括Heist(Snap的用途)。也就是说,当Snap甚至没有语法时,跳过Yesod跳过CSS / Javascript语法是一件很有趣的事情。当然欢迎您使用仅静态文件的解决方案。 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,则不会输入安全的网址。 在Heist中,每次都会从硬盘读取html模板。 Yesod将所有模板直接编译到可执行文件中。没有从硬盘读取文件。因此,响应速度更快。您可以自己查看基准。 在Yesod中,您可以创建相互配合良好的小部件。 Snap根本不处理小部件。您将不得不自己动手。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?