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

サーバーサイドKotlin/JSのフレームワークを作った話

 サーバーサイドKotlin/JSのフレームワークを作った話

CISTLT-Zli 合同LT会2020 with Halloween にて発表
https://github.com/yt8492/indikate

Yuta Tomiyama

October 31, 2020
Tweet

More Decks by Yuta Tomiyama

Other Decks in Programming

Transcript

  1. サーバーサイドKotlin/JSの
    フレームワークを作った話
    CISTLT-Zli 合同LT会2020 with Halloween

    View Slide

  2. 自己紹介
    HN: マヤミト
    会津大学26期 (学部3年)
    Zli 現代表
    GitHub: https://github.com/yt8492
    好きな言語: Kotlin, Java, Scala
    趣味: Kotlin, 同人音声, VTuber
    Twitter: yt8492

    View Slide

  3. 前回のあらすじ

    View Slide

  4. Kotlin/JS
    - KotlinをJSにトランスパイルする技術
    - JSのライブラリも利用可能
    - Kotlinで型定義を書けばJSのコードに型を付けられる
    - Webフロントエンドの開発もNode.jsでサーバーサイドの開発もできる
    トランスパイル

    View Slide

  5. kotlinx-nodejs
    Kotlin公式が提供しているKotlin向けNode.jsラッパーライブラリ
    https://github.com/Kotlin/kotlinx-nodejs
    NodeのAPIのKotlinの型定義を提供している(が、まだexperimentalなため不完全な模
    様)
    TypeScriptの型定義をKotlinの型定義に変換するDukatというツールで生成されている

    View Slide

  6. 簡単なサーバーを書いてみた

    View Slide

  7. 問題点
    - http.createServerの引数のラムダ式の中に全てを書く必要がある(多分)
    - Nodeのhttpパッケージだけで本格的にサーバーサイド開発するのはキツい
    - get("/hoge") { ... } みたいに書けたほうがよさそう(expressみたいに)

    View Slide

  8. じゃあ自分でフレームワーク作るか!w

    View Slide

  9. 要件
    - フルスタックというよりはシンプルで軽量なフレームワーク
    - イメージ的にはexpressやKtor
    - ルーティング、リクエスト、レスポンスなどが簡単に扱える
    - JSONのシリアライズとかまではやらない
    - kotlinx.serializationとかでユーザーにやってもらう

    View Slide

  10. ルーティングの実装
    - pathとmethodを簡単に指定できて、ラムダ式でhandlerを書きたい
    - expressの app.get("/hoge", (req, res) => {}) みたいに
    - path, method, handlerを持つ構造体(data class)のリストを内部で保持するように
    して、get("/hoge") {} などのメソッドを呼び出すとその内部のリストに構造体がadd
    されるようにする
    - http.createServerのラムダ式の引数のrequestからpathとmethodを取得し、
    一致するhandlerがあればそれに処理をさせる

    View Slide

  11. ルーティングの実装

    View Slide

  12. リクエストを扱いやすくする
    - http.createServerのラムダ式の引数のrequestには各種パラメータなどが扱いや
    すい状態で入っていない
    - pathやquery parameterはurlからパースして取得する必要がある
    - bodyはrequest.on("data")のコールバックからとる必要がある
    - headerは扱えるがKotlinのIterableではないのでforEachなどの便利メソッドが使えない
    - 自作のRequest構造体(data class)を作成し、各種パラメータなどを扱いやすくフ
    レームワーク側で加工する

    View Slide

  13. リクエストを扱いやすくする

    View Slide

  14. レスポンスを扱いやすくする
    - status codeやmessageを構造体の変数にして、簡単に設定できるようにする
    - http.createServerの実装では同じ名前のヘッダを複数回setすると最後にsetした
    値しか反映されないので、フレームワーク側で複数回setしても全て反映されるよう
    に吸収する
    - response.end()を必ず呼び出す必要があるが、それもフレームワーク側で
    やりたい

    View Slide

  15. レスポンスを扱いやすくする

    View Slide

  16. 今後の課題
    - Path Parameterが扱えない
    - get("/hoge/:id") みたいに扱えるようにしたいが、ルーティング周りの実装を大きく書き換えないとい
    けない
    - CORS対応くらいは簡単にできるようにしてもいいかもしれない
    - DBを扱うKotlin/JSのライブラリがない

    View Slide

  17. リンク集
    前回のLT
    サーバーサイドKotlin/JS
    https://speakerdeck.com/yt8492/js
    開発中のフレームワーク
    indikate
    https://github.com/yt8492/indikate

    View Slide