如果不能正常显示,请查看原文 , 或返回

令世人惊叹的服务器端 Swift!

时至今日,Swift 已然演变成了一门开源、跨平台的编程语言,有许多个团队正在竞相利用 Swift 语言能够用于 Web 开发。其中最主要的框架分别是:Perfect、Vapor 以及 IBM 的 Kitura,它们在 GitHub 上已经获得了超过 13,000 个星星了,并且热度依然不减!接下来我们将会聊一聊这些框架的优缺点,并且介绍如何入门服务器端 Swift 开发。(其中的几个框架仅支持 Swift 3!)跟随 Edward 一起来现场编程,并且将一个 Swift 应用部署到云端!


概述 (0:00)

我在 Apple 发布 Swift 之后就开始使用 Swift 了。那时候我还不是一名 iOS 开发者(当时我只是一个对什么都感兴趣的开发者而已),但是 Swift 发布之后,我瞬间就爱上了这门语言(因此,这也就是为什么两年半之后,我才能在此时此刻站在这里为大家演讲)。

我就职于 Stormpath,这是一家从事用户管理以及用户存储系统的公司。如果您打算构建一个 Web 应用程序或者后端服务,那么不妨考虑使用 Storempath 来帮助您构建一些不错的东西。在此之前,我还工作于 PadMapper(我开发了这款 iOS 应用),成立了 StudentRND 这样一个非营利性组织,负责教授学生技术以及如何编写代码。

我打算以一个旁观者的角度来讨论服务端 Swift 开发,比较各个框架以及服务端 Swift 开发所处的位置。我首先简要概述下服务端 Swift 生态系统,介绍几个流行的服务端框架,以及一个简单的 “Hello,World!”应用程序,接着通过现场编码演示如何部署服务端 Swift 开发环境,编写一个 “Hello,World!”应用,然后将其部署到 Heroku 云服务器上。

为什么使用 Swift 来开发 Web? (1:58)

我们大多数人都有过使用 Swift 为 iOS 或 Mac OS X 开发应用程序的经历(包括瞎折腾)。随着 12 月份 Swift 正式开源,开发者已经开始尝试服务端开发,使用 Swift 构建 web 应用程序。那么问题来了,为什么我们要用 Swift 进行 web 开发呢?

  1. 相比较其他一些流行的 web 编程语言(Python,Ruby),Swift 是一门快速和安全的语言。它可以执行本机代码 (native code)。
  2. 这是一门强类型语言,引入了可选类型,你可以确保永远不会有任何空指针的错误。
  3. 不同于其他安全语言(Java 或 C#),Swift 表达更加清晰。这是一个不错方式帮助我们快速构建应用,同时又不用操心一些编译器的事情: 1)构建一款没有崩溃的应用程序,2)缩短应用开发周期。
  4. 开发者热衷 Swift。移植 Swift 到更多平台想想都让人兴奋。

一家开发 iOS 应用程序的公司赞助了我的一个朋友;他们使用 PHP 的 Laravel 打造应用后台,同时使用 Swift 语言开发 iOS 应用程序。此外,该公司还赞助了服务端 Swift 开发,因为他们希望自己的前端开发人员(移动端程序员)和服务端开发人员(接口制定者)之间能够具有更多灵活性。鼓励后端开发者学习 Swift 不仅能提高效率,又能同时推动前端和后端的发展。

接下来我会介绍四个主要的服务端 Swift 开发框架,分别是:PerfectVaporKituraZewo

Perfect (4:40)

如果你对服务端 Swift 生态系统有所了解,想必都听说过 Perfect 开源框架。 Perfect 起初是由来自加拿大的团队开发,仅有 2、3 个成员。去年10月份或者11月份的时候,我记得他们四处奔波参加活动,“随着 Swift 开源代码,你将能够依托它在服务器上构建一些很酷的东西。”

Perfect 目前在 Github 上收获星星最多:7200+ 星星(像 Rails,Expressjs,JDjango 等最流行的 web 框架在 Github 上的星星大多在 2 万到 3 万之间)。不难看出服务端 Swift 开发极具潜力。他们的目标是将 Swift 做的和 Rails 一样。团队正试图构建一个完整的框架,从而允许你使用 Swift 做任何事。此外,框架还集成了一套强大的功能特性。然而, Rails 整体略显庞大(你必须以 Rail 的方式做一些事情)。Perfect 也同样存在这样的问题:它具有非常棒的功能,但仅向开发者提供寥寥几个方法用以开发应用。

首先让我们看看 Perfect 的相关代码(请见视频)。你可以试着运行应用程序,Perfect 工程中自带了一个 http 服务器,你可以用来运行 fastCGI 模块并将其连接至 Apache 或 NGINX。接着,你可以编写一个模块供 Perfect 服务器运行。这里,我们将构建一个 “ Hello,World!” 应用程序。当用户访问 localhost 时,浏览器页面输出 “Hello,World!”。Perfect 要求你在模块里注册一个名为 PerfectServerModuleInit 的全局函数。你可以在函数中初始化路由表,为每个路由地址绑定一个路由处理闭包。在路由处理程序中,你可以返回一个实现了 handleRequest 方法的类。我们会将 ”Hello,World!“ 文字追加到 Response 的文本段中,同时还要告诉它:“这个请求已经完成”。

我一直使用 Node.js 构建服务端应用,在此之前是 PHP。 以我对语法的偏好来说感觉有点奇怪,但它完全能胜任工作。

Vapor (7:30)

Vapor 框架在 Github 上受欢迎程度位居第二(4000+ 星星),它是受 Laravel 启发。Laravel是一套简洁、优雅的 PHP Web开发框架,拥有非常清晰的语法表达方式。

当我刚开始入坑服务端 Swift 开发之时,他们就为此提供了大量的文档。Vapor 的其中一位缔造者 Tanner 是我早先提到的家伙:公司赞助了 Vapor 两位程序员进行全职开发。经过这两位开发者的不懈努力,他们成功构建了一个伟大的 Web 框架(有点像 Perfect - Perfect 团队筹集了150万美元来继续打造和商业化服务器端 Swift 开发) 。

让我们来看看 Vapor 的示例代码(见视频),同样是构建一个“Hello,World!” 应用程序,我们导入了 Vapor 模块,并创建一个应用程序对象。于此同时我们需要为 “/” 路由地址绑定一个处理程序,返回字符串“Hello,World!”。然后,我们启动应用程序,…这里所做的工作和 Perfect 其实是一样的,最后均构建了一个基本的 “Hello,World!” 应用程序。

我喜欢这个例程,因为它展现了 Swift 语言的表达性。这里,我们返回了一个 “Hello,World!” 字符串,但是 Perfect 中定义了协议返回一个 response。你不必只返回一个字符串,可以返回例如一个模板引擎或 JSON 数据,之后应用程序中再转换成正确的数据。

IBM Kitura (9:28)

Kitura 由 IBM 开发维护,项目始于今年二月底。它在 Github 上流行程度位居第三(3000+星星) 。IBM 收购了一家名为 Strongloop 的公司,曾是 Express.js 的维护者 - 这并不奇怪,Kitura 同样也是 Express.js 风格的框架。 从语法上来看 Kitura 类似于 Vapor。我们首先导入 Kitura 库,创建一个路由对象,然后将处理程序绑定到 “/” 路由地址上。当运行 http 服务器时,会返回给我们一个包含 “Hello,World!“ 的响应。

Kitura 语法近似于 Vapor。但在很多使用方式都有所不同,但假如你熟悉 Express,这看起来会很亲切。

Zewo (10:35)

不同于其他三者,Zewo 在 Github 上并非是第四流行框架(1000+星星)。虽然已经存在很多不同的 Swift web 框架(例如 Rails 的 Swift ,Sails 的 Swift ,Swift Express 等等),不过 Zewo 则完全不同,它是一个超级模块:它由50个不同的包组成,你可以选择部分包来构建你的 web 应用程序。如果你想搭建自己的 http 服务器,或者构建一个 web 应用程序框架却不想编写每一个组件时,你可以使用 Zewo 的不同库来私人定制属于你的 Web 服务器和 Web 应用程序框架。此外,由于 Swift 开源了代码,Zewo 的基础构件可以同 Vapor 互换。这也是为什么本次演讲主题是『令世人惊叹的服务器端 Swift』。

Open Swift (11:35)

Open Swift 小组维护着一个名为 S4 的项目 - S4 代表着服务端 Swift 开发标准。他们一直沿用一套通用的中间件工作,包括请求、响应和服务器……当为服务端 Swift 应用程序构建中间件时,我们会组合不同的协议。当然你可以单独为 Vapor 和 Zewo 构建部分中间件。此外,我还在 Slack 频道中看到来自 IBM Kitura 和 Perfect 的开发者。接下来的几个月里,它有望成为所有服务器端框架的标准。

Zewo 语法与 Kitura 和 Vapor 很近似。由于其超强的模块化特性,我们必须导入两个不同的模块才能进行工作。首先我们创建一个路由对象,然后绑定一个处理程序给 /路由地址,当我们访问时会得到“Hello,World!” 响应文字。这里我创建了一张简明表从功能特性和 Swift 版本来对比这些框架。

所有这些框架都提供了一个基本的模板设置引擎。 Kitura 提供的一些外链同样还包括 ORM;你可以使用它来连接数据库以及转换成 Swift 对象。如果你打算开始尝试,推荐使用 Perfect,Vapor ,Zewo 和 Kitura 四个框架中的一个。尽管 Kitura 起步较晚(二月下旬才开始),但他们仍在不断追赶当中。以上提到的这些都值得你去捣鼓一番,将会非常有趣。

上述这些框架使用的 Swift 版本也各有不同(Swift2.2:Perfect。不同日期的 Swift 3版本:Vapor,5月31日;Kitura,5月9日;Zewo,4月12日)。你不禁要问,为什么会有这么多的 Swift 版本? 其原因归咎于: Swift 包管理器 (Package Manager)。

Swift 包管理器 (14:28)

Swift Package Manager 仅支持 Swift 3 开发预览版。部分原因是 Swift 3 最初看起来类似于 Swift 2(你所要做的就是建立一个 Swift 3 的快照)。然而,当前发布版本在一个半月前的基础上又进行了大刀阔斧地改动,现在所有的项目都是在不同的 Swift 3 版本上。此外,Foundation 框架还没有完全实现。许多框架开发者正在等待 Swift 3 发布以便用于生产环境。

接下来我会快速向你们演示编码第一个 Vapor 应用例程,首先部署 Swift 开发环境,接着编写一个之前展示过的 “Hello,World!” 例程,并部署到 Heroku 上。快速而又简单

安装 Swift 版本管理器 (15:53)

首先,我们将安装 Swiftenv。如果你不太熟悉 Python 或者 Ruby 语言(也没有关系),因为在很多其他编程语言中,社区都会提供一款工具帮助你管理当前使用语言的版本。Swift 亦是如此,因为版本更新太过频繁,你要面对诸多不同版本的 Swift 快照。

首先,我们需要安装 Swiftenv

$ git clone https://github.com/kylef/swiftenv.git
~/.swiftenv

$ echo 'export SWIFTENV_ROOT="$HOME/.swiftenv"' >>
~/.bash_profile
$ echo 'export PATH="$SWIFTENV_ROOT/bin:$PATH"' >>
~/.bash_profile
$ echo 'eval "$(swiftenv init -)"' >> ~/.bash_profile

Kyle Fuller 编写了 Swiftenv ,他是 Swift 生态系统中一位多产的贡献者。我们所要做的是克隆他的代码仓,移动到我们自己的目录,设置一些环境变量,并确保添加环境变量到我们的 bash 配置文件中。

安装 Swift 5-31 (17:10)

我们使用 Swiftenv 安装最新版本的 Swift 开发预览版(由于我们使用 Vapor 开发,所以需要安装 5月 31 号的快照):

返回