$30 off During Our Annual Pro Sale. View Details »
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
サーバーサイドKotlin/JSのフレームワークを作った話
Search
Yuta Tomiyama
October 31, 2020
Programming
0
140
サーバーサイド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
1
370
モバイルアプリ開発を始めよう!
yt8492
0
81
Git勉強会
yt8492
0
170
なんでもやってみる勇気
yt8492
0
110
Android Autoが思ったよりしんどい話
yt8492
0
220
apollo-kotlinにcontributeした話
yt8492
0
160
DMM TVのSDカードダウンロード機能を実装した話
yt8492
1
900
今だからこそ知りたいKotlin Multiplatform
yt8492
0
310
State management and API calls in Jetpack Compose: Learning Apollo + Jetpack Compose through React Hooks
yt8492
0
1.3k
Other Decks in Programming
See All in Programming
Context is King? 〜Verifiability時代とコンテキスト設計 / Beyond "Context is King"
rkaga
10
1.4k
Vibe codingでおすすめの言語と開発手法
uyuki234
0
110
Pythonではじめるオープンデータ分析〜書籍の紹介と書籍で紹介しきれなかった事例の紹介〜
welliving
2
580
AI Agent Dojo #4: watsonx Orchestrate ADK体験
oniak3ibm
PRO
0
110
LLM Çağında Backend Olmak: 10 Milyon Prompt'u Milisaniyede Sorgulamak
selcukusta
0
130
Grafana:建立系統全知視角的捷徑
blueswen
0
200
AIエンジニアリングのご紹介 / Introduction to AI Engineering
rkaga
8
3.3k
AIエージェントの設計で注意するべきポイント6選
har1101
5
2.3k
Claude Codeの「Compacting Conversation」を体感50%減! CLAUDE.md + 8 Skills で挑むコンテキスト管理術
kmurahama
1
630
クラウドに依存しないS3を使った開発術
simesaba80
0
160
まだ間に合う!Claude Code元年をふりかえる
nogu66
5
890
大規模Cloud Native環境におけるFalcoの運用
owlinux1000
0
190
Featured
See All Featured
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
51
43k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
29
ラッコキーワード サービス紹介資料
rakko
0
1.8M
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
680
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
0
22
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
0
210
The #1 spot is gone: here's how to win anyway
tamaranovitovic
1
860
Balancing Empowerment & Direction
lara
5
820
The Curious Case for Waylosing
cassininazir
0
190
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
The Invisible Side of Design
smashingmag
302
51k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.3k
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