Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
サーバーサイドKotlin/JSのフレームワークを作った話
Search
Yuta Tomiyama
October 31, 2020
Programming
0
130
サーバーサイド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
40
Android Autoが思ったよりしんどい話
yt8492
0
150
apollo-kotlinにcontributeした話
yt8492
0
74
DMM TVのSDカードダウンロード機能を実装した話
yt8492
1
710
今だからこそ知りたいKotlin Multiplatform
yt8492
0
240
State management and API calls in Jetpack Compose: Learning Apollo + Jetpack Compose through React Hooks
yt8492
0
1.1k
サーバーフレームワークの仕組みが気になったので車輪の再発明をしてみた
yt8492
0
170
Compose for Webを始めよう
yt8492
0
360
Compose Multiplatform 1.0.0
yt8492
0
140
Other Decks in Programming
See All in Programming
聞き手から登壇者へ: RubyKaigi2024 LTでの初挑戦が 教えてくれた、可能性の星
mikik0
1
130
광고 소재 심사 과정에 AI를 도입하여 광고 서비스 생산성 향상시키기
kakao
PRO
0
170
AWS Lambdaから始まった Serverlessの「熱」とキャリアパス / It started with AWS Lambda Serverless “fever” and career path
seike460
PRO
1
250
アジャイルを支えるテストアーキテクチャ設計/Test Architecting for Agile
goyoki
9
3.3k
『ドメイン駆動設計をはじめよう』のモデリングアプローチ
masuda220
PRO
8
530
What’s New in Compose Multiplatform - A Live Tour (droidcon London 2024)
zsmb
1
470
RubyLSPのマルチバイト文字対応
notfounds
0
120
レガシーシステムにどう立ち向かうか 複雑さと理想と現実/vs-legacy
suzukihoge
14
2.2k
ふかぼれ!CSSセレクターモジュール / Fukabore! CSS Selectors Module
petamoriken
0
150
AWS IaCの注目アップデート 2024年10月版
konokenj
3
3.3k
見せてあげますよ、「本物のLaravel批判」ってやつを。
77web
7
7.7k
Outline View in SwiftUI
1024jp
1
320
Featured
See All Featured
A Tale of Four Properties
chriscoyier
156
23k
Java REST API Framework Comparison - PWX 2021
mraible
PRO
28
8.2k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
229
52k
Designing on Purpose - Digital PM Summit 2013
jponch
115
7k
GraphQLとの向き合い方2022年版
quramy
43
13k
Speed Design
sergeychernyshev
24
610
Practical Orchestrator
shlominoach
186
10k
Building Better People: How to give real-time feedback that sticks.
wjessup
364
19k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
16
2.1k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
Building Applications with DynamoDB
mza
90
6.1k
Reflections from 52 weeks, 52 projects
jeffersonlam
346
20k
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