Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Vapor as a web framework
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
rbde0
April 24, 2017
Programming
380
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Vapor as a web framework
rbde0
April 24, 2017
More Decks by rbde0
See All by rbde0
fastlaneの実プロダクトへの導入例と所感
rbde0
1
530
Other Decks in Programming
See All in Programming
Vue Fes Japan の “作る側”に関わってみて
naokihaba
1
190
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Kaigi on Rails 2026, Tokyo, Japan
marcoroth
2
340
FactoryBotをやめればRSpecは速くなるのか?
yuta_onishi_97
0
1.1k
Long Living Tokens, Die, Die, Die! (or: The One Ring is Banned in Modern)
sylph01
0
370
個人開発者よ、Honoを使え(おじさんver)
tanahiro2010
2
280
Modernizing iOS Apps
seyfoyun
0
120
Groovy as a human and AI friendly programming language
paulk
0
110
Coding with AI: How to trust the storyteller (AWS Community Day Adria, Ljubljana 2026)
slobodan
0
120
エージェントを使い続けるためのメタワーク / Meta-work for keeping using the agent
rkaga
6
1.9k
自サークルのIdPからログアウトできるようになるまで
taiseiue
1
150
複雑なUIコンポーネントとの ⻑い付き合い⽅:波及するバグからテスト戦略を経て、安全な再設計へ
mixplace
0
460
ActionController meets Protocol Buffers
sorah
1
700
Featured
See All Featured
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
68
59k
My Coaching Mixtape
mlcsv
0
360
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.9k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.7k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
760
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.7k
The SEO Collaboration Effect
kristinabergwall1
1
600
Reflections from 52 weeks, 52 projects
jeffersonlam
356
22k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
740
Code Reviewing Like a Champion
maltzj
529
40k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
530
Transcript
Vapor as a web framework (2.0 beta) Player! Meetup with
IBM(H.27.04.24) @rb_de0
自己紹介 @rb_de0 github.com/rb-de0, qiita.com/rb-de0 teamLab.inc iOS エンジニア コミケでiOS/Swift の本出してます
こんな本書いてた (C90/H26/08)
こんなの作ってた rb-de0/vapor-linebot (LINE ボット, Vapor) rb-de0/tech.reb-dev.com( 簡易CMS のような何か, 直したい,Vapor) rb-de0/Github-Slack-Bot(Github
連携ボット, Kitura) rb-de0/Qiita-Slack-Bot(Qiita 連携ボット, Kitura)
話すこと Swift Web Framework 「Vapor」 とは Vapor の各機能をさらっと紹介
前提 Vapor 2.0.0-beta.18( くらい) の 話です。 API 結構変わっていて辛い... 2.0 は5
月中旬にリリー ス予定らしい ドキュメント (http://beta.docs.vapor.codes/)
Vapor https://github.com/vapor/vapor (github より) A web framework and server for
Swift that works on macOS and Ubuntu. “ “
Vapor の特徴 Swift 製フレー ムワー クの中ではスター 数が2 番目 に多い(9000 強)
フルスタック コミュニティ活発 Slack で気軽に質問できる ドキュメントが割とちゃんとしている( けど怪し いときもある...) 「vapor university」 というチュー トリアルサイト がある
導入
導入(Mac) CLI ツー ルの導入 $ brew tap vapor/homebrew-tap $ brew
update $ brew install vapor # vapor-beta アプリケー ション作成 $ vapor new AppName # --branch=beta Xcode プロジェクト作成 $ vapor xcode
ビルド(Mac) Xcode でビルド & 実行 可能 CLI ツー ルを使う場合 ビルド
$ vapor build 実行 $ vapor run serve
アプリケー ションの作成
ディレクトリ初期構成 ProjectRoot/ |- Sources/ | |- Run | |- main.swift
... エンドポイント | |- App | |- Routes.swift ... ルー ティング設定 | |- Setup.swift ... アプリケー ションの設定 | |- Models/ | |- Controllers/ | |- Config/ ... 設定ファイル |- Tests/ ... テストコー ド |- Resources/ ... View ファイル |- Public/ ... js/css 等 |- Package.swift
Droplet アプリケー ション本体 ルー ティングの登録, サー バー 起動, Middleware の登
録等を行う [Run/main.swift] let config = try Config() try config.setup() let drop = try Droplet(config) try drop.setup() try drop.run()
Setup アプリケー ションの初期化(Provider やMiddleware の追加等) を行う [App/Setup.swift] extension Droplet {
public func setup() throws { try collection(Routes()) } } extension Config { public func setup() throws { try addProvider(FluentProvider.Provider.self) preparations += [ User.self ] } }
Routing [App/Routes.swift] struct Routes: RouteCollection { func build(_ builder: RouteBuilder)
throws { builder.get("/") { _ in return "It works!" } builder.resource("/users", UserController()) } }
Leaf Vapor コミュニティが開発しているテンプレー ト LeafProvider が必要 [App/Setup.swift] public func setup()
throws { try addProvider(LeafProvider.Provider.self) // 追加 try addProvider(FluentProvider.Provider.self) preparations += [ User.self ] } drop.get("leaf") { request in return try self.view.make("index.leaf", context) }
Leaf デフォルトで使えるタグ( 一部) #(variable) #loop(contents, "content") {} #if(bool) {} #equal(lhs,
rhs) {} #extend("base") #import("content") #export("content") {} #embed("embeds/header") 独自タグも作成可能
Fluent (ORM) Vapor コミニティが開発しているORM デフォルトだとOnMemoryDB final class User: Model, Timestampable
{ let storage = Storage() let username: String let password: String init(usernamePassWord: Password) { username = usernamePassWord.username password = usernamePassWord.password } required init(row: Row) throws { username = try row.get("username") password = try row.get("password") } func makeRow() throws -> Row { var row = Row() try row.set("username", username) try row.set("password", password) return row } }
Fluent (ORM) try User.all() try User.find(10) try User(name: "name", pass:
"pass").save() try User.makeQuery().filter("age", .greaterThan, 22).all() try User.makeQuery().sort("age", .descending).all() MySQL を使いたい場合 [App/Setup.swift] try addProvider(MySQLProvider.Provider.self) [Con g/ uent.json] { "driver": "mysql" }
Session デフォルトだとOnMemorySession builder.get("/session") { request in request.session?.data["userId"] = "10" return
"Set-Cookie" }
Persist extension User: SessionPersistable {} [App/Setup.swift] addConfigurable(middleware: { _ in
PersistMiddleware(User.self) }, name: "persist-user") [Con g/droplet.json] "middleware": [ "persist-user" ]
Redis セッションストアにRedis を使いたい場合 [App/Setup.swift] let redisCache = try RedisCache(config: self)
let sessions = CacheSessions(redisCache) addConfigurable(middleware: { _ in SessionsMiddleware(sessions) }, name: "redis-sessions") [Con g/droplet.json] "middleware": [ "redis-sessions" ]
Auth 認証/ 認可周りのヘルパー PasswordAuthenticatable extension User: PasswordAuthenticatable { static var
usernameKey: String { return "username" } } ログインフロー let credential = try request.userNamePassword() let user = try User.authenticate(credential) try user.persist(for: request)
CORS cors.json に 設定を記述するだけ [Con g/cors.json] { "allowedOrigin": "http://allowedOrigin.com", "allowedMethods":
["get", "post"], "allowedHeaders": ["Content-Type"], "cacheExpiration": 600 }
Vapor 関連の面白そうなもの
Kitura-Provider サー バー 部分をKitura に置き換えるProvider https://github.com/vapor/kitura-provider beta だと動かない UIWebKit Swift
からVapor で扱えるView を生成してくれる https://github.com/calebkleveter/UIWebKit
VaporForms https://github.com/bygri/vapor-forms HTML のフォー ム周りのヘルパー SteamPress/NSPress https://github.com/brokenhandsio/SteamPress https://github.com/isaced/NSPress Vapor を使って作られたブログエンジン
Wordpress のSwift 版?
TinyFaces https://tinyfac.es/ https://github.com/maximedegreve/TinyFaces Vapor を使って作られたサー ビス 商用にも使える顔写真を提供するサー ビスらしい
vapor-apns/VaporGCM/vapor-gcm https://github.com/matthijs2704/vapor-apns https://github.com/matthijs2704/vapor-gcm https://github.com/shial4/VaporGCM APNs/GCM/FCM に対応したPush 通知基盤の実装
所感 2.0 に向けて機能が整備されてきていい感じ まだまだ実装されていない機能 & 細かいバグ があ るので貢献チャンス? 導入実績がもっと増えるといいと思う
おわり