蒸气—后端的快捷选择

我决定深入研究Vapor,以及它是否真的是可行的选择。

早在2月份,我播了一段播客,概述了开发移动应用程序时不同的后端选项。 简而言之,当寻找正确的选项时,有很多选择。 例如,对于Swift开发人员而言,Vapor已成为越来越合适的选择。 因此,我决定深入研究Vapor,以及它是否真的是可行的选择。

选择的多样性

纵观后端选择的前景,可能会造成混乱。 最后, 这实际上取决于团队的技能水平 。 例如,如果您使用JavaScript来构建Web和移动应用程序,那么Node.JS就很有意义。 另一方面,如果您是.Net开发人员团队,则Web API很有意义。 此外,如果您特别精​​通PHP,Python,Ruby,Go等…,则应保持自己的舒适度。

但是,对于专注于Apple产品的单个开发人员和开发人员团队(例如我),没有专用于服务器端应用程序的框架。 因此,最接近的选项是CloudKit,它适合于数据存储,但缺少以下选项:

  • Web和Apple设备外不支持
  • 不支持完整备份
  • 锁定到CloudKit数据模型中以建立关系
  • 没有Cron工作

但是,还有其他选项可以在服务器上的Swift中继续开发。

蒸气—服务器快速处理

自Swift于2015年末开源以来,已添加了与其他操作系统的兼容性。 将Swift迁移到服务器的第一批团队之一是Vapor团队。 自2018年5月发布3.0版以来,人们的兴趣日益浓厚。

在本文中,我将回顾Vapor并介绍以下内容:

  • 易于安装和部署
  • 蒸气开发
  • 数据库支持
  • 事件驱动的异步API

因此,让我们从开始变得容易开始。

蒸气入门

在我最近发表的这篇文章中,我展示了如何在Mac和Ubuntu以及Heroku之类的服务上安装Vapor。 简而言之, 我发现该过程非常简单有效 。 也就是说,它没有其他任何Web框架那么复杂。

例如,在Mac上,开发人员可以使用相当普遍的Homebrew来点击Vapor存储库并进行安装。 有权使用Vapor CLI工具后,该工具包括一个子命令,用于使用Vapor buildpack设置Heroku应用程序。

同样在Ubuntu上,您为Vapor添加apt仓库,并通过apt命令安装。 完成此操作后,您可以轻松地使用进程监视器和http服务器的组合来代理服务器。

如果您对此过程的更多细节感兴趣, 请查看这篇文章,深入了解Vapor并设置macOS,Heroku和Ubuntu。

蒸气开发

安装了Vapor之后,该过程的下一部分将开发该应用程序。 因此,IDE非常重要。

带有蒸气的开发人员工具

尽管存在问题,我们仍然可以使用Xcode在Swift中进行开发。 但是,由于有用于构建Swift应用程序的命令行工具,开发人员可以选择自己的工具。 目前,真正的限制是Swift通常仅在macOS和Ubuntu上受支持。 也就是说, 不支持其他Linux或Unix操作系统,也不支持Windows。 但是,社区肯定会在这些领域提供更多支持来向前发展。 同样,社区提供了很多软件包。

第三方对蒸气的支持

Node.js具有npm,Ruby具有gems,C#具有Nuget,Python具有pip,而Swift具有Swift Package Manager。 一般而言,Swift软件包管理器或SPM已被缓慢地用作主要的依赖项管理器。 从长远来看,尽管Cocoapods和Carthage仍在iOS开发领域占据统治地位,但SPM在未来不可避免地会占据主导地位 。 在讨论了外部对Vapor的支持之后,让我们讨论一下Vapor(及其当前的软件包支持)。

数据库支持和流利的ORM

我在使用各种ORM方面的经验是多种多样的。 鉴于我曾经在C#和Sequelize for Node.Js中使用实体框架,所以我有一些经验。 话虽如此, 使这些功能如此出色的是使用lambda和实现许多功能编程范例的能力。 结果,由于Swift具有这种能力,因此使用Fluent ORM非常容易学习。

同样重要的是它对各种数据库软件的支持。 截至目前,已支持:

  • 的MySQL
  • 玛丽亚数据库
  • MongoDB
  • PostgreSQL的
  • SQLite的

可以看出,有足够的数据库支持。 更不用说,但是它对那些数据库的支持相当深。

深度数据库支持

例如,我遇到了一个问题,该问题是我按标题搜索对象–一个相当简单的关键字搜索REST API列表操作。 但是,我没有意识到的是,许多书名都带有假字母 ,特别是重音符号。 换句话说,如果用户在标题为é的情况下搜索带有e的内容,则不会显示该结果。 尽管如此,PostgreSQL中还是有代码可以取消字符串的重音 ,例如可以进行小写或大写转换。 添加必要的功能后,我可以使用Fluent的API调用该功能:

let columnId = PostgreSQLColumnIdentifier.column("Game", "title") 
let column = PostgreSQLExpression.column(columnId)
let arg = GenericSQLFunctionArgument.expression(column)
let args : [GenericSQLFunctionArgument] = [arg]
let expression = PostgreSQLExpression.function("unaccent", args)

如上所示,这可能不是理想的,但它可以工作。 此外,您始终可以使用Database Kit API访问较低级别的直接SQL代码。 但是,使Fluent ORM如此强大的真正原因是使用SwiftNIO异步API。

编程的未来

简而言之,Apple发起的事件驱动的网络应用程序框架SwiftNIO提供了一组类型,用于处理基于回调的异步API,例如数据库查询。

另外,Vapor提供了一组功能,这些功能使复杂的查询可以在代码中访问。 也就是说, SwiftNIO和Vapor提供了期货和承诺以及用于处理多个对象(例如转换)的API 。 尽管如此, 我发现最大的摩擦是Xcode和Swift编译器的组合提供了误导性的错误消息。 目前,这在Swift和Xcode中是很普遍的抱怨,但这无疑是一个值得一提的问题。 同样,在进行各种HTTP调用时,我使用了相同的异步API,并发现它非常可靠。

API的REST

与URLRequest相对, HTTP API是Promise / future友好的 ,这是很好的改进。 但是,可以轻松地使Swift中的任何异步调用变得友好。 除了Fluent ORM,HTTP和Async API外,我还使用了Auth,Crypto和Routing API。 简而言之,所有工作都完美无缺。

例如,从JSON或Multipart编码数据进行序列化不需要太多实现。 也就是说,如果您要实现正确实现Codable的类型,那么在创建健壮的REST API时就不需要花费太多精力。 但是,如果您确实需要自定义类型以使用Codable,则强烈建议发布有关改进JSON解码方式的文章。

蒸气软件或Swift-ly Switch?

综上所述, Vapor已经是一个健康的框架,可以启动任何新的服务器端应用程序 。 但是,我绝不建议任何人以此重写整个应用程序。

总的来说, 如果您已经是Swift团队,并且您希望将某些(如果不是全部)代码移到新框架中,则我强烈建议您将Vapor作为您的首选。 更不用说,如果您使用的Web框架正在成为负担并享受Swift的多功能性,那么使用Vapor会是一个很好的选择 。 (除此之外,我唯一要说明的是,如果您要为企业而建,我会考虑Kitura,IBM团队在该领域拥有丰富的经验,而Kitura似乎更专注于这些方面。)

另一方面,如果您使用的Web框架对您的团队表现良好,并且大多数开发都不在Swift中进行,那么切换到Vapor是没有意义的。 最后,我只想指出,Vapor在Apple客户端应用程序之外运行良好。 例如, 我成功地使用VueJs和Axios构建了一个Web应用程序, 并且在服务器-客户端通信方面没有困难。 如果您有兴趣入门,请订阅此新闻通讯,入门指南以及有关如何使用Vapor开发健壮应用程序的更新。