博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第一节 介绍
阅读量:6258 次
发布时间:2019-06-22

本文共 1840 字,大约阅读时间需要 6 分钟。

简介

自从有WEB开发,我们一直想让开发过程变得更加舒适。作为社区,我们不断的推出新技术来试着解决http无状态性带来的安全问题,致力于创建强大的WEB应用。

Yesod试图通过发挥Haskell编程语言的优势来简化Web开发过程。 Haskell强大的编译时保证正确性不仅包括类型;引用透明性确保我们没有任何意外的副作用。代数数据类型的模式匹配可以帮助保证我们已经考虑到了每种可能的情况。通过构建Haskell,整个代码类型层面的bug都消失了。

不幸的是,使用Haskell是不够的。就其本质而言,网络不是类型安全的。即使是最简单的区分整数和字符串的情况也是不可能的:Web上的所有数据都以原始字节的形式传输,避免了我们在类型安全方面的最大努力。每个开发者都遇到验证表单输入的任务。我将此问题称为边界问题:尽管您的应用程序在内部是类型安全的,但是与外部世界的每个边界仍然需要进行控制和隔离。

类型安全

这就是Yesod的用武之地。通过使用高级声明技术,您可以指定您期望的确切输入类型。 此过程也以另一种方式工作:使用类型安全的http参数传输过程,可以确保您发送的数据类型正确。

边界问题不仅仅是处理客户端时的问题:持久化和加载数据时存在同样的问题。 再次,Yesod通过为您执行数据封装和传输,将您的数据保存在正确的边界上。 您可以在高级别定义中指定实体,并且无须了解底层细节。

简洁

我们都知道Web应用程序中涉及很多样板编码。 在任何可能的情况下,Yesod都会尝试使用Haskell的功能来让您愉快的工作:

表单库通过利用Applicative类型类来减少用于常见情况的代码量。

路由以非常简洁的格式声明,而不会牺牲类型安全性。

通过代码生成自动处理与数据库之间的数据序列化。

在Yesod中,我们有两种代码生成方式。 为了让您的项目启动,我们提供了一个脚手架工具来设置您的文件和文件夹结构。 但是,大多数代码生成都是在编译时通过元编程完成的。 这意味着您生成的代码永远不会过时,因为简单的库升级将使您生成的所有代码保持最新。

但是对于那些喜欢保持控制并且确切知道他们的代码在做什么的人来说,你总是可以更接近编译器并自己编写所有代码。

性能

Haskell的主要编译器GHC具有惊人的性能特征,并且一直在不断改进。这种语言选择本身使Yesod比其他产品具有更大的性能优势。但这还不够:我们需要一个专为性能而设计的架构。

我们的模板方法就是一个例子:通过允许在编译时分析HTML,CSS和JavaScript,Yesod既避免了运行时昂贵的磁盘I / O,又可以优化此代码的渲染。但架构决策更深入:我们在底层库中使用管道和构建器等高级技术,以确保我们的代码在常量内存中运行,而不会耗尽宝贵的文件句柄和其他资源。通过提供高级抽象,您可以获得高度压缩和正确缓存的CSS和JavaScript。

Yesod的王牌Web服务器Warp是最快的Haskell Web服务器。当这两项技术相结合时,它可以生成最快的Web应用程序部署解决方案之一。

模块化

Yesod催生了数十个软件包,其中大部分都可以在Yesod之外的环境中使用。该项目的目标之一是尽可能地回馈社区; 因此,即使您不打算在下一个项目中使用Yesod,本书的很大一部分仍可能与您的需求相关。

当然,这些库都设计为可以很好地集成在一起。 使用Yesod框架可以让您在各种API中保持一致的强烈感觉。

坚实的基础

我记得有一次看到PHP框架广告支持UTF-8。这让我感到惊讶:你的意思是UTF-8支持不是自动的吗?在Haskell世界中,字符编码等问题已得到很好的解决和完全支持。事实上,我们通常遇到相反的问题:有许多软件包为问题提供强大而精心设计的支持。 Haskell社区不断突破界限,为每项挑战找到最清洁,最有效的解决方案。

这种强大生态系统的缺点是面临太多的选择。通过使用Yesod,您已经拥有为您选择的大多数工具,并且可以保证它们可以一起工作。当然,您始终可以选择自己的解决方案。

作为一个真实的例子,Yesod和Hamlet(默认的模板语言)使用blaze-builder来生成文本内容。之所以选择是因为blaze提供了生成UTF-8数据的最快接口。任何想要使用其他优秀库之一的人,比如文本,都没有问题。

转载于:https://juejin.im/post/5b857186e51d4538a751fc77

你可能感兴趣的文章
HTTP Error 500.19
查看>>
我在博客园的这一年
查看>>
红黑树
查看>>
Jackson使用ObjectManage#readValue传入泛型T的问题
查看>>
Python正则表达式中的re.S的作用
查看>>
从零开始构建一个centos+jdk7+tomcat7的docker镜像文件
查看>>
Source Insight 中文注释为乱码解决办法(完美解决,一键搞定)
查看>>
【LoadRunner】安装LoadRunner
查看>>
Linux内存管理 (15)页面迁移
查看>>
在高并发、高负载的情况下,如何给表添加字段并设置DEFAULT值?
查看>>
Cocos2d-x 3.0final 终结者系列教程13-贪食蛇游戏案例(全)
查看>>
Nginx的try_files指令和命名location使用实例
查看>>
IO多路复用之select
查看>>
pd_ds中的hash
查看>>
买书不读是一种什么病?
查看>>
微信接口开发报错invalid credential, access_token is invalid or not latest hint
查看>>
nohup 部署springboot 使用命令
查看>>
MQ产品比较-ActiveMQ-RocketMQ
查看>>
暂时没有想好呢。
查看>>
windows服务 MVC之@Html.Raw()用法 文件流的读写 简单工厂和工厂模式对比
查看>>