Swift Web 开发之 Vapor - 入门(一)

简介

Vapor 是一个基于纯 Swift 构建出的 Web 开发框架,目前可以运行在 macOS 和 Ubuntu ,用于构建出漂亮易用的网站或者 API 服务。

官方称是用的最多的 Swift web 框架,理由是因其在 IBM Swift Package CatalogBETA - Most Essential 排名第一。But 对于一些星星党并不这么觉得,Perfect 星星还是多一些的 ;]。 个人觉得对于初心者朋友们选择一款主流、优雅、更新活跃的框架学习就好了,不必太在意那些。

当我第一眼看到 Vapor 的时候最吸引我的是 vapor.codes 这个网站,做的很漂亮,包括文档页面风格,很符合我的胃口,域名也很有个性,都说 vapor 是受 Laravel 启发,了解框架主要部件和一些语法后让我想起了 Python 的 Flask 框架,包括组件化思想、中间件,想起来都应该非常容易上手即扩展。

文档

Vapor 有一份比较完整的文档在 docs.vapor.codes,你也可以在 Github 上对文档提出 issue 和 pr,不过目前看来 exmple 还比较缺少,稍稍高级一点的 API 或着最佳实践很难找到,估计也是因为整个这一块还比较新颖,成熟度不高,用户也相对较少的原因,不过相信在 Swift 日趋成熟的状态下,各个框架也会发展得越来越好。特别是在 Server APIs Project 完成之后,相信会有一个大的转变,对了 Vapor 的核心开发成员 Logan Wright(@LoganWright) 也是Server APIs Project 团队的一员,所以看好 Vapor 的未来应该是没有错的。

另外推荐一下 Ray Wenderlich 的一系列 Vapor ship教程,每个视频都是简短截说,非常实用,你可以在 vapor.university 上找到,当然上面还有其他优秀的视频教程和文章。

组件

Vapor 使用 Swift Package Manager 做依赖和包管理,不过以我个人目前的使用感受来看 Swift Package Manager 还不是很好用。

Vapor 封装了几乎常见的所有 web 开发部件,比如路由、授权认证、模版引擎、中间件、数据库ORM、JSON解析、Web sockets… 足以拿来让我们应付普通的 web 设计,让我们只需要更多的关心业务逻辑便可快速开发出自己的网站。该系列后面的文章会详细深入对每个部件进行探究。

从 Toolbox 开始

安装

Mac 用户推荐用 Homebrew 安装 vapor toolbox,toolbox 也是 Swift 写的,仓库在这里

# install Vapor Toolbox
brew install vapor/tap/toolbox

第一次安装的时候遇到问题,卡在 unset CC; swift build -c release 很久不动,后来又可以了,估计还是因为网络问题,建议大家安装时都开上代理。#11

介绍

vapor toolbox 是封装的一套命令行工具,基础命令如下:

Usage: vapor <new|build|run|fetch|clean|test|xcode|version|self|heroku|docker>

Xcode

我们可以使用 vapor xcode 生成 xcode 项目,然后就可以直接使用 xcode 进行 web 开发了,编辑源代码,Command + R 一切还是那么熟悉(对于 iOS 开发者来说)。:]

注意:因为这个 .xcodeproj 项目的目录结构都是 vapor 自动生成的,所以目录结构有变动我们可以再执行一次 vapor xcode 命令重新生成,并且在为了不干扰其他协同人员在 linux 环境下开发,推荐在 .gitignore 中加入这一行 *.xcodeproj 以忽略其进入 git。

Hello, World

前面讲了这么多介绍、环境、工具,这里主要带大家跑起来一个 hello,world 项目。

Toolbox

整个流程都会基于 Vapor Toolbox 的命令完成,所以你的第一步应该是装好这个东西。

Mac 用户推荐用 Homebrew 安装 vapor toolbox,toolbox 也是 Swift 写的,仓库在 Github

# macOS
brew install vapor/tap/toolbox

# Ubuntu
curl -sL swift.vapor.sh/ubuntu | bash

第一次安装的时候遇到问题,卡在 unset CC; swift build -c release 很久不动,后来又可以了,估计还是因为网络问题,建议大家安装时都开上代理。#11

更多可以参考官方文档页面 install Toolbox

New Project

如果你是 iOS 开发者,这里请暂时先忘掉 Xcode,因为所有环境和开发都能在 Linux 中完成。

vapor new Hello

执行完成后大概会看到这样的界面:

Cloning Template [Done]

                                      **
                                    **~~**
                                  **~~~~~~**
                                **~~~~~~~~~~**
                              **~~~~~~~~~~~~~~**
                            **~~~~~~~~~~~~~~~~~~**
                          **~~~~~~~~~~~~~~~~~~~~~~**
                         **~~~~~~~~~~~~~~~~~~~~~~~~**
                        **~~~~~~~~~~~~~~~~~~~~~~~~~~**
                       **~~~~~~~~~~~~~~~~~~~~~~~~~~~~**
                       **~~~~~~~~~~~~~~~~~~~~~~~~~~~~**
                       **~~~~~~~~~~~~~~~~~~~~~++++~~~**
                        **~~~~~~~~~~~~~~~~~~~++++~~~**
                         ***~~~~~~~~~~~~~~~++++~~~***
                           ****~~~~~~~~~~++++~~****
                              *****~~~~~~~~~*****
                                 *************
                        
                        _       __    ___   ___   ___
                       \ \  /  / /\  | |_) / / \ | |_)
                        \_\/  /_/--\ |_|   \_\_/ |_| \
                          a web framework for Swift

                      Project "Hello" has been created.
               Type `cd Hello` to enter the project directory.
                                    Enjoy!

vapor new 命令将会从 vapor/basic-template 拉取初始工程,目录结构如下:

.
├── Config
│   └── production
├── Localization
├── Public
│   ├── images
│   └── styles
├── Resources
│   └── Views
└── Sources
    └── App
        ├── Controllers
        └── Models

项目采用 MVC 架构,ModelControllerSource/App 下,同级还有个 main.swift,这就是整个程序的主文件,Resources/Views 里放的是页面模版。

main.swift

import Vapor

let drop = Droplet()

drop.get("hello") { req in
    return "Hello, world."
}

drop.run()

大家感受一下路由,最终这份代码将会在浏览器中呈现出 “Hello, world.” 这个字符串,这一篇文章暂时并不会说太多代码,只是让大家了解感受下 Vapor 开发的整个流程,后面会深入其中。

Fetch

编译之前需要拉取项目所有的第三方库,也就是依赖包,Vapor 使用 Swift Package Manager 来管理包,使用 toolbox 中的 vapor fetch 命令进行拉取依赖,拉取到本地后后所有的包源码将会在 Packages 目录中,如下:

CLibreSSL-1.0.0     Fluent-1.1.0        Node-1.0.1          Turnstile-1.0.3
CMySQL-1.0.0        FluentMySQL-1.0.1   PathIndexable-1.0.0 Vapor-1.2.0
Console-1.0.1       JSON-1.0.1          Polymorphic-1.0.1   VaporMySQL-1.1.0
Core-1.0.0          Jay-1.0.0           Routing-1.0.1
Crypto-1.0.1        Leaf-1.0.3          Socks-1.2.0
Engine-1.3.0        MySQL-1.0.2         TLS-1.1.0

这一步就像是 iOS 开发中的 pod install … ;]

Build

拉取完依赖之后就可以执行 vapor build 开始编译项目,然而其实 vapor build 也会去 Fetching Dependencies,所以直接执行这个命令也是可以的。

编译完成后你会在项目根目录下发现一个 .build 目录,这里面将会存放项目所有源码编译后的文件。

如果使用 xcode 只要不更新依赖,直接 Command+B 进行编译, Command+R 运行。

Run

编译成功后通过下面这条命令来启动服务器。

vapor run serve

如果看到 Server starting... 的字样,那就可以通过浏览器访问 http://localhost:8080 进行访问了。

部署

Vapor 支持任何能运行 Swift 环境的地方,轻松搭配 Nginx 等通用服务器程序进行部署。比如 Digital Ocean、Docker、Heroku、AWS 等等,甚至还支持一键部署到 Heroku,Heroku 为个人用户提供了一个免费沙盒(512 MB RAM │ 1 web/1 worker),只是会在闲置30分钟后自动睡眠,如果你想尝试,Just do it,非常简单。

社区

捐赠

作为一个非营利开源项目组织,他们非常愿意接受资金赞助以保持项目积极发展,所以如果你喜欢这个项目并想支持 Vapor,这将会是一个很好的方式。

Vapor 在 OpenCollective 开通了捐赠页面,在其 Github 主页可以找到相关链接,

OpenCollective 是一个用于开源社区募集资金的平台,主张财务透明,可在其页面上看到任何人的捐赠记录。

个人觉得支持一个项目的更好方式是为其“添砖加瓦”,把你更多的灵感和代码注入到项目里。

推荐阅读

后记

【Swift Web 开发之 Vapor】第一篇就这样了,Vapor 内容很多,“入门”旨在争取看完能够搭建好环境和跑起来示例程序并对这个框架有个初步认识就可以了,后续我会继续分享 Vapor 相关的其他组件和使用经验。

用了近一个月的 Vapor,开了一个坑准备写一个博客程序 NSPress,类似 Wordpress、Typecho,后面的坑很多,比如插件、模版系统的架构,也是一次 Swift server-side 的学习与尝试,希望有兴趣的朋友可以一起学习与交流,你可以在 微博Github 关注我,或者给我发邮件 *isaced@163.com*。