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
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
220
WebAssembly in Android Apps 〜 WASMはJNIの夢を見るか
keiji
1
110
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
200
『寄り添うラジオ』をAIで作る 体験価値から逆算した、会話しないUXと品質設計
theoriatec2024
3
180
C#の現在地 進化の歴史と、AI時代の.NET Everywhere
neuecc
4
2.8k
選挙速報を多くのユーザーへ 届ける Live Activities 設計
hamayokokuririn
0
150
LL言語やWebフレームワークのPostgreSQL対応 〜DBの機能がユーザーに届くまで〜
kentaroutakeda
1
150
技術的負債を組織課題として解く-増えすぎたマイクロサービスとの戦い-
reimaru
1
2k
AGENTS.md Is Not Enough:Build Skills, Don't Download Them
lx_t
0
120
AIは賢い。でも実行環境は? CLIおじさんがAI時代に伝えたいこと ~ CLIおじさんがAI時代に伝えたいこと ~
curekoshimizu
1
250
XP祭りでしか伝わらないフリップネタ #xpjug
murabayashi
0
150
UPDATE をやめる — EF Core でマスタをバージョン管理する
panda728
PRO
0
240
Featured
See All Featured
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
330
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
440
Between Models and Reality
mayunak
4
460
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
480
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
120
120k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.2k
How to train your dragon (web standard)
notwaldorf
97
6.8k
Designing Powerful Visuals for Engaging Learning
tmiket
1
570
The Spectacular Lies of Maps
axbom
PRO
1
1k
Making the Leap to Tech Lead
cromwellryan
135
10k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
35
2.8k
The browser strikes back
jonoalderson
0
1.7k
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 に向けて機能が整備されてきていい感じ まだまだ実装されていない機能 & 細かいバグ があ るので貢献チャンス? 導入実績がもっと増えるといいと思う
おわり