Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
サーバーサイドKotlin/JSのフレームワークを作った話
Yuta Tomiyama
October 31, 2020
Programming
0
97
サーバーサイドKotlin/JSのフレームワークを作った話
CISTLT-Zli 合同LT会2020 with Halloween にて発表
https://github.com/yt8492/indikate
Yuta Tomiyama
October 31, 2020
Tweet
Share
More Decks by Yuta Tomiyama
See All by Yuta Tomiyama
サーバーフレームワークの仕組みが気になったので車輪の再発明をしてみた
yt8492
0
37
Compose for Webを始めよう
yt8492
0
120
Compose Multiplatform 1.0.0
yt8492
0
49
Kotlin/NativeからCの標準ライブラリを呼び出そう
yt8492
0
51
2021年のKotlin入門
yt8492
0
130
Jetpack Compose + Decomposeで始めるクロスプラットフォーム開発
yt8492
1
160
Kotlin/MPPでブログを作った話
yt8492
0
450
サキドリJetpack Compose for Web
yt8492
0
75
Kotlin/JSでもSSGしたい!
yt8492
1
77
Other Decks in Programming
See All in Programming
Named Document って何?
harunakano
0
300
ゴーファーくんと学ぶGo言語の世界/golang-world-with-gopher
iwasiman
1
150
Securing Kafka Connect Pipelines with Client-Side Field Level Cryptography @ Kafka Summit London 2022
hpgrahsl
0
300
TechFeed Conference 2022 - Kotlin Experimental
jmatsu
0
600
Go API クライアントの実装 〜Go Conference に載せれなかったTIPS〜
yyoshiki41
0
190
WindowsコンテナDojo:第2回 Windowsコンテナアプリのビルド、公開、デプロイ
oniak3ibm
PRO
0
140
ebpfとWASMに思いを馳せる2022 / techfeed-conference-2022-ebpf-wasm-amsy810
masayaaoyama
0
510
既存のプロジェクトにKMMを導入するための対応策
martysuzuki
2
290
Is Rust a great language for building Kubernetes ecosystem
deepu105
0
140
あなたの会社の古いシステム、なんとかしませんか?~システム刷新から考えるDX化への道筋とバリエーション~/webinar20220420-systems
grapecity_dev
0
120
コードの解析と言語習得の心得
jinjin33333
0
130
Let's make a contract: the art of designing a Java API
mariofusco
0
160
Featured
See All Featured
Building Adaptive Systems
keathley
25
1.1k
Automating Front-end Workflow
addyosmani
1351
200k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
7
1k
YesSQL, Process and Tooling at Scale
rocio
157
12k
BBQ
matthewcrist
74
7.9k
Rails Girls Zürich Keynote
gr2m
86
12k
The Brand Is Dead. Long Live the Brand.
mthomps
45
2.7k
Writing Fast Ruby
sferik
612
57k
What’s in a name? Adding method to the madness
productmarketing
11
1.5k
Reflections from 52 weeks, 52 projects
jeffersonlam
337
17k
10 Git Anti Patterns You Should be Aware of
lemiorhan
638
52k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
350
21k
Transcript
サーバーサイドKotlin/JSの フレームワークを作った話 CISTLT-Zli 合同LT会2020 with Halloween
自己紹介 HN: マヤミト 会津大学26期 (学部3年) Zli 現代表 GitHub: https://github.com/yt8492 好きな言語:
Kotlin, Java, Scala 趣味: Kotlin, 同人音声, VTuber Twitter: yt8492
前回のあらすじ
Kotlin/JS - KotlinをJSにトランスパイルする技術 - JSのライブラリも利用可能 - Kotlinで型定義を書けばJSのコードに型を付けられる - Webフロントエンドの開発もNode.jsでサーバーサイドの開発もできる トランスパイル
kotlinx-nodejs Kotlin公式が提供しているKotlin向けNode.jsラッパーライブラリ https://github.com/Kotlin/kotlinx-nodejs NodeのAPIのKotlinの型定義を提供している(が、まだexperimentalなため不完全な模 様) TypeScriptの型定義をKotlinの型定義に変換するDukatというツールで生成されている
簡単なサーバーを書いてみた
問題点 - http.createServerの引数のラムダ式の中に全てを書く必要がある(多分) - Nodeのhttpパッケージだけで本格的にサーバーサイド開発するのはキツい - get("/hoge") { ... }
みたいに書けたほうがよさそう(expressみたいに)
じゃあ自分でフレームワーク作るか!w
要件 - フルスタックというよりはシンプルで軽量なフレームワーク - イメージ的にはexpressやKtor - ルーティング、リクエスト、レスポンスなどが簡単に扱える - JSONのシリアライズとかまではやらない -
kotlinx.serializationとかでユーザーにやってもらう
ルーティングの実装 - pathとmethodを簡単に指定できて、ラムダ式でhandlerを書きたい - expressの app.get("/hoge", (req, res) => {})
みたいに - path, method, handlerを持つ構造体(data class)のリストを内部で保持するように して、get("/hoge") {} などのメソッドを呼び出すとその内部のリストに構造体がadd されるようにする - http.createServerのラムダ式の引数のrequestからpathとmethodを取得し、 一致するhandlerがあればそれに処理をさせる
ルーティングの実装
リクエストを扱いやすくする - http.createServerのラムダ式の引数のrequestには各種パラメータなどが扱いや すい状態で入っていない - pathやquery parameterはurlからパースして取得する必要がある - bodyはrequest.on("data")のコールバックからとる必要がある -
headerは扱えるがKotlinのIterableではないのでforEachなどの便利メソッドが使えない - 自作のRequest構造体(data class)を作成し、各種パラメータなどを扱いやすくフ レームワーク側で加工する
リクエストを扱いやすくする
レスポンスを扱いやすくする - status codeやmessageを構造体の変数にして、簡単に設定できるようにする - http.createServerの実装では同じ名前のヘッダを複数回setすると最後にsetした 値しか反映されないので、フレームワーク側で複数回setしても全て反映されるよう に吸収する - response.end()を必ず呼び出す必要があるが、それもフレームワーク側で
やりたい
レスポンスを扱いやすくする
今後の課題 - Path Parameterが扱えない - get("/hoge/:id") みたいに扱えるようにしたいが、ルーティング周りの実装を大きく書き換えないとい けない - CORS対応くらいは簡単にできるようにしてもいいかもしれない
- DBを扱うKotlin/JSのライブラリがない
リンク集 前回のLT サーバーサイドKotlin/JS https://speakerdeck.com/yt8492/js 開発中のフレームワーク indikate https://github.com/yt8492/indikate