Slide 1

Slide 1 text

Reitit使ってみた エル [valerauko]

Slide 2

Slide 2 text

Reititはルーティング用のライブラリ ● フィンランド語で「ルート」 ● ringのmiddlewareやpedestalのinterceptorも使える ● Compojureとかをすごく意識してる ● ルートはデータ ● API用の便利機能が豊富 ● かなり速い

Slide 3

Slide 3 text

ルートがデータ? ["/.well-known" {:summary "WebFinger endpoints" :swagger {:tags ["WebFinger"]}} ["/host-meta" {:get {:summary "Host metadata" :swagger {:produces #{"application/xrd+xml" "application/xml"}} :responses {200 {:body any?}} :handler host-meta}}] ["/webfinger" {:get {:summary "WebFinger endpoint for users" :swagger {:produces #{"application/xrd+xml" "application/jrd+json"}} :parameters {:query {:resource ::spec/resource}} :responses {200 {:body any?}} :handler resource}}]]

Slide 4

Slide 4 text

なんで速いのか ● ルートがただのデータでコンパイル時に完結する ○ なおルートのバッティングを許さない前提 ● フラットなデータ構造体になるので「検索」が速い ● OKのレスポンス(ルートがある)に最適化されてる ○ /hello -> /hello/みたいなリダイレクトとか ○ 存在しないルートとかは別に扱われる

Slide 5

Slide 5 text

引っかかりそうなところ ● ルートのコンパイル時、ミドルウェアがルートにいちいちコピーされる ○ PRO 探さなくて済むから速いのは速い ○ CON 何かの共通の状態(ステート)があるとバグる ● 考えずにringのdefault-middleware付けてもセッションが動かない ○ 関数だけルートにコピーされて、それぞれ共有されない session-store作ってしまう ○ 開発者いわく「interceptorなら動くはず」とのこと ● middlewareの関数はモックできない ○ with-redefsしても、すでにルートにコピーされてるから置き換えられない

Slide 6

Slide 6 text

便利機能 ● ルートに任意のデータも紐付けられる ○ {:role #{:roles/admin}}みたいにエンドポイントに必要な権限 ○ ミドルウェアやハンドラで確認に使える ● swagger対応 ○ API開発ならものすごく便利 ○ UIまであるので手でcurl打たなくて済む ● coercion (形式強制) ○ リクエストもレスポンスも形式が定義できる ○ clojure.spec, schema, metosin製のdata-spec ○ middleware入れると形に合ってないの弾く

Slide 7

Slide 7 text

参考文献 ● https://github.com/metosin/reitit ● Clojurians #reitit ● https://github.com/valerauko