引言
自web编程伊始,人们就开始努力使开发过程尽量愉快。作为一个集体,我们持续的推进新 技术,以尝试解决一些长期滞留的安全威胁难点、HTTP的无状态性、需要用多种语言( HTML、CSS、Javascript)才能创建一个强大的web应用,等等。
Yesod借助Haskell编程语言,试图让web开发过程更简单。Haskell在编译时的正确性保证 不只囊括了类型正确;透明引用(referential transparency)保证了我们不会有意外的副 作用。代数数据类型(algebraic data types)的模式匹配,保证我们考虑到每一种情况。 构建于Haskell之上,很多类别的bug都完全消除。
不幸的是,只用Haskell还不够。Web在本质上是类型不安全的。即使是最简单的辨别整 型和字符串,也是不可能的:所有数据在web上都以裸字节方式传输,破坏了我们在类型安 全上的最大优势。每个web应用都需要验证输入数据的合法性。我将这个问题称作边界问题 :不管你的应用内部是多么的类型安全,在每一个与应用外部交互的边界处,你仍然需要 进行合法性校验。
类型安全
类型安全正是Yesod努力做到的。通过使用高级声明技术,你可以明确规定你所需要的输入 类型。这个过程反过来也可以:使用类型安全的URL,你可以确保你发送出去的数据是类型 正确的。
边界问题不只是在与客户端交互的时候才有:在存储和载入数据时同样有这个问题。再一 次,Yesod在边界问题上通过数据编组(marshalling of data)来帮助你。你可以用高层定 义来规范你的数据实体,并且安心于不知道数据存取的细节。
简明
我们都知道在web应用中有大量重复性(boilerplate)代码。只要有可能,Yesod就用 Haskell的特性来免去你的重复输入:
表单库使用Applicative型类(type class),减少一般场景所需的代码量。
路由以一种精炼的格式定义,而不牺牲类型安全。
写入/读取数据库的操作,由代码生成(code generation)自动完成。
Yesod中有两种方式的代码生成。为启动你的项目,我们提供了脚手架(scaffolding)工具 帮你创建文件和文件夹结构。然而,大部分代码生成是在编译时通过抽象编程(meta programming)完成的。这意味着你生成的代码永远不会过时(stale),因为升级库也会带动 升级所生成的代码。
但如果想要保持掌控,想确切知道他们的代码在做什么,你总是可以往编译器靠近,并且( 不用代码生成而是)手写你的所有代码。
性能
GHC是Haskell的主流编译器,它有惊人的性能表现,并且一直在改进中。仅仅是选择了 Haskell就给Yesod带来了巨大的性能优势。但那还不够:我们需要性能导向的架构。
我们的模板就是一个例子:通过编译时分析HTML、CSS、JavaScript,Yesod不仅避免了运 行时代价高昂的磁盘存取,还能优化代码的呈现(rendering)。但是架构设计更进一步:我 们利用先进的技术,如底层库中的conduits和builders保证我们的代码运行时占用常量内 存,而不致于耗尽珍贵的文件句柄和其它资源。Yesod提供的高层次抽象,让你得到高压缩 比且缓存好的CSS和JavaScript。
Warp作为Yesod的旗舰web服务器,是目前速度最快的Haskell服务器。把这两项技术结合在 一起,可以打造市面上速度最快的web应用布署方案。
模块化
Yesod催生了数十个软件包,其中大部分可以在Yesod以外使用。Yesod项目的目标之一是尽 可能回馈社区;因此,即便你不会在下个项目中使用Yesod,本书的大部分内容仍然会对你 有帮助。
当然,这些库是设计成能很好结合在一起的。使用Yesod框架能让你强烈感受到贯穿在众多 API间的一致性。
坚实的基础
我记得有次看见一个PHP框架,宣称它能支持UTF-8。这让我很惊讶:难道支持UTF-8不是自 动的吗?在Haskell界,字符编码这类问题已经被很好的解决了。事实上,我们经常遇到相 反的问题:有很多包都提供了强大且设计良好的解决办法。Haskell社区持续的在为每一项 挑战寻找最简洁、最有效的方案。
这样一个强大的生态系统的负面效应是选择困难。通过使用Yesod,大部分工具都已经为你 选好,并且它们保证可以一起工作。当然,你总是可以选择加入自己的解决方案。
举一个真实的例子,Yesod和Hamlet(默认的模板语言)使用了blaze-builder包来生成文本 内容。这个选择基于blaze提供了最快速生成UTF-8文本的接口。任何想使用其它库比如 text的人,替换起来也不会有问题。
Haskell介绍
Haskell是一门强大、快速、类型安全的函数式编程语言。本书假设你已经熟悉Haskell的 大部分基础知识。有两本很棒的Haskell学习书箱,并且都可以在线免费阅读:
Yesod使用的一些Haskell特性,是大部分Haskell入门教程都不会介绍的。虽然你很少需用 知道它们的工作原理,但从正式时就对所使用的工具有个全面的了解总是有好处的。这些 Haskell特性会在下一章中讲解。