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
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
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
npm との違いを手がかりにGo の依存管理を理解したい
optim
0
300
AI時代のコードレビューは人に向けるな、仕組みに向けろ
texmeijin
5
3.7k
Unity6 URPによる海底をテーマにしたVJシステムの解説 | Unity Shader 完全に理解した 勉強会
gam0022
0
370
Agents on Rails - Rails at Scale 2026
irinanazarova
0
560
phperだってパンチカードでコーディングしたい
o0h
PRO
0
330
S3 TablesのIcebergデータに、AIエージェントからアクセスしてみた / 20261016developersio2026joetsu-accessing-iceberg-in-s3tables-via-agent
kasacchiful
PRO
0
150
Everything will be SERVERLESS — 信じて運用した10年の経験値 / Everything Will be Serverless — Lessons Learned from 10 Years of Operational Experience
seike460
PRO
1
1.1k
GemmaをJevのように使ってみる / Use Gemma like Jev
kishida
5
790
Workers Cache を知る
syumai
0
360
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Kaigi on Rails 2026, Tokyo, Japan
marcoroth
2
220
When benchmarks go bad - what I learned from measuring performance wrong
hollycummins
0
220
AmebaブログはKMPから卒業します
kmars0605
0
190
Featured
See All Featured
Git: the NoSQL Database
bkeepers
PRO
433
67k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
440
Code Review Best Practice
trishagee
74
20k
Testing 201, or: Great Expectations
jmmastey
46
8.3k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
730
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.4k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.9k
The Cult of Friendly URLs
andyhume
79
7k
Marketing to machines
jonoalderson
1
5.9k
Scaling GitHub
holman
464
140k
Rails Girls Zürich Keynote
gr2m
96
14k
Fashionably flexible responsive web design (full day workshop)
malarkey
409
67k
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 に向けて機能が整備されてきていい感じ まだまだ実装されていない機能 & 細かいバグ があ るので貢献チャンス? 導入実績がもっと増えるといいと思う
おわり