Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Vapor as a web framework

rbde0
April 24, 2017

Vapor as a web framework

rbde0

April 24, 2017
Tweet

More Decks by rbde0

Other Decks in Programming

Transcript

  1. Vapor as a web framework
    (2.0 beta)
    Player! Meetup with IBM(H.27.04.24)
    @rb_de0

    View Slide

  2. 自己紹介
    @rb_de0
    github.com/rb-de0, qiita.com/rb-de0
    teamLab.inc
    iOS
    エンジニア
    コミケでiOS/Swift
    の本出してます

    View Slide

  3. こんな本書いてた (C90/H26/08)

    View Slide

  4. こんなの作ってた
    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)

    View Slide

  5. 話すこと
    Swift Web Framework 「Vapor」
    とは
    Vapor
    の各機能をさらっと紹介

    View Slide

  6. 前提
    Vapor 2.0.0-beta.18(
    くらい)

    話です。
    API
    結構変わっていて辛い...
    2.0
    は5
    月中旬にリリー
    ス予定らしい
    ドキュメント (http://beta.docs.vapor.codes/)

    View Slide

  7. Vapor
    https://github.com/vapor/vapor
    (github
    より)
    A web framework and server for Swift that works
    on macOS and Ubuntu.


    View Slide

  8. Vapor
    の特徴
    Swift
    製フレー
    ムワー
    クの中ではスター
    数が2
    番目
    に多い(9000
    強)
    フルスタック
    コミュニティ活発
    Slack
    で気軽に質問できる
    ドキュメントが割とちゃんとしている(
    けど怪し
    いときもある...)
    「vapor university」
    というチュー
    トリアルサイト
    がある

    View Slide

  9. 導入

    View Slide

  10. 導入(Mac)
    CLI
    ツー
    ルの導入
    $ brew tap vapor/homebrew-tap
    $ brew update
    $ brew install vapor # vapor-beta
    アプリケー
    ション作成
    $ vapor new AppName # --branch=beta
    Xcode
    プロジェクト作成
    $ vapor xcode

    View Slide

  11. ビルド(Mac)
    Xcode
    でビルド &
    実行 可能
    CLI
    ツー
    ルを使う場合
    ビルド
    $ vapor build
    実行
    $ vapor run serve

    View Slide

  12. アプリケー
    ションの作成

    View Slide

  13. ディレクトリ初期構成
    ProjectRoot/
    |- Sources/
    | |- Run
    | |- main.swift ...
    エンドポイント
    | |- App
    | |- Routes.swift ...
    ルー
    ティング設定
    | |- Setup.swift ...
    アプリケー
    ションの設定
    | |- Models/
    | |- Controllers/
    |
    |- Config/ ...
    設定ファイル
    |- Tests/ ...
    テストコー

    |- Resources/ ... View
    ファイル
    |- Public/ ... js/css

    |- Package.swift

    View Slide

  14. Droplet
    アプリケー
    ション本体
    ルー
    ティングの登録,
    サー
    バー
    起動, Middleware
    の登
    録等を行う
    [Run/main.swift]
    let config = try Config()
    try config.setup()
    let drop = try Droplet(config)
    try drop.setup()
    try drop.run()

    View Slide

  15. 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 ]
    }
    }

    View Slide

  16. Routing
    [App/Routes.swift]
    struct Routes: RouteCollection {
    func build(_ builder: RouteBuilder) throws {
    builder.get("/") { _ in
    return "It works!"
    }
    builder.resource("/users", UserController())
    }
    }

    View Slide

  17. 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)
    }

    View Slide

  18. Leaf
    デフォルトで使えるタグ(
    一部)
    #(variable)
    #loop(contents, "content") {}
    #if(bool) {}
    #equal(lhs, rhs) {}
    #extend("base")
    #import("content")
    #export("content") {}
    #embed("embeds/header")
    独自タグも作成可能

    View Slide

  19. 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
    }
    }

    View Slide

  20. 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"
    }

    View Slide

  21. Session
    デフォルトだとOnMemorySession
    builder.get("/session") { request in
    request.session?.data["userId"] = "10"
    return "Set-Cookie"
    }

    View Slide

  22. Persist
    extension User: SessionPersistable {}
    [App/Setup.swift]
    addConfigurable(middleware: { _ in
    PersistMiddleware(User.self) }, name: "persist-user")
    [Con g/droplet.json]
    "middleware": [
    "persist-user"
    ]

    View Slide

  23. 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"
    ]

    View Slide

  24. 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)

    View Slide

  25. CORS
    cors.json
    に 設定を記述するだけ
    [Con g/cors.json]
    {
    "allowedOrigin": "http://allowedOrigin.com",
    "allowedMethods": ["get", "post"],
    "allowedHeaders": ["Content-Type"],
    "cacheExpiration": 600
    }

    View Slide

  26. Vapor
    関連の面白そうなもの

    View Slide

  27. Kitura-Provider
    サー
    バー
    部分をKitura
    に置き換えるProvider
    https://github.com/vapor/kitura-provider
    beta
    だと動かない
    UIWebKit
    Swift
    からVapor
    で扱えるView
    を生成してくれる
    https://github.com/calebkleveter/UIWebKit

    View Slide

  28. VaporForms
    https://github.com/bygri/vapor-forms
    HTML
    のフォー
    ム周りのヘルパー
    SteamPress/NSPress
    https://github.com/brokenhandsio/SteamPress
    https://github.com/isaced/NSPress
    Vapor
    を使って作られたブログエンジン
    Wordpress
    のSwift
    版?

    View Slide

  29. TinyFaces
    https://tinyfac.es/
    https://github.com/maximedegreve/TinyFaces
    Vapor
    を使って作られたサー
    ビス
    商用にも使える顔写真を提供するサー
    ビスらしい

    View Slide

  30. 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
    通知基盤の実装

    View Slide

  31. 所感
    2.0
    に向けて機能が整備されてきていい感じ
    まだまだ実装されていない機能 &
    細かいバグ があ
    るので貢献チャンス?
    導入実績がもっと増えるといいと思う

    View Slide

  32. おわり

    View Slide