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
    • Auth
    • Sessions
    • Cookies
    • Routing
  • Vapor Toolbox
  • Fluent
  • Engine
    • HTTP
    • URI
    • WebSockets
    • SMTP
  • Leaf
  • JSON
  • Console
  • TLS
  • Crypto
  • Node
  • Socks

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>
  • new - 新建项目
  • build - 编译(内部会执行 swift build
  • run - 运行项目
  • fetch - 拉取定义在 Package.swift 中的依赖
  • clean - 清除缓存
  • test - 执行测试
  • xcode - 生成 .xcodeproj 用于使用 xcode 进行开发
  • version - 查看 vapor toolbox 版本号
  • self - vapor self <install|update> 用来自更新
  • heroku - 部署到 heroku
  • docker - 部署到 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 相关的其他组件和使用经验。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容