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
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
難しいけど、読めた。- OSSの入口に立った話。
sts11142
0
120
WebMCP Challenge に星空観察アプリで参加した話
okajun35
0
200
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
370
wkhtmltopdfの次どうするか問題2026
willnet
2
1.8k
IBM Bob Dojo #1 仕様駆動開発入門
oniak3ibm
PRO
0
270
Turning Architecture into Unit Tests in the AI Era (NSSpain XIV)
steliosf
PRO
1
100
setup-vp GitLab対応の裏側
naokihaba
0
120
AHC070解法紹介
eijirou
0
140
フロントエンドUIフレームワークのこれまでとこれから
ssssota
5
2.9k
巨大モノリシックアプリ モダン化大作戦
ktcryomm
1
1.1k
20260914 AIエージェント時代のPlatform Engineering LLM基盤とプロダクトの責務境界線
kanfab1
7
2.2k
スマート反転とウェブアクセシビリティ
camiha
0
210
Featured
See All Featured
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
830
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
2
450
Git: the NoSQL Database
bkeepers
PRO
432
67k
Building Applications with DynamoDB
mza
96
7.2k
Designing Powerful Visuals for Engaging Learning
tmiket
1
580
The SEO identity crisis: Don't let AI make you average
varn
0
560
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
250
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
2
2.2k
Unsuck your backbone
ammeep
672
58k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.2k
Docker and Python
trallard
47
4.2k
How STYLIGHT went responsive
nonsquared
100
6.3k
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 に向けて機能が整備されてきていい感じ まだまだ実装されていない機能 & 細かいバグ があ るので貢献チャンス? 導入実績がもっと増えるといいと思う
おわり