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
型安全RESTで爆速プロトタイピング – Hono RPC実践
Search
tacke
May 27, 2025
Programming
650
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
型安全RESTで爆速プロトタイピング – Hono RPC実践
https://layerx.connpass.com/event/355401/
でのLTスライド
tacke
May 27, 2025
More Decks by tacke
See All by tacke
スモールチームがAmazon Cognitoでコスパよく作るサービス間連携認証
tacke_jp
4
5.7k
Androidエンジニアが抑えておくべきUnicode Emojiの知識 (DroidKaigi 2019) / Unicode Emoji for Android Engineer DroidKaigi09
tacke_jp
12
4.9k
Parse.comからGCPへ移行した話 ~1年間にわたる脱出プロジェクト~
tacke_jp
2
2.2k
Other Decks in Programming
See All in Programming
Dockerfile CMD for Node.js
grazie1999
0
110
関東Kaggler会_NVIDIA_Nemotron_コンペ_振り返り
rick_ds
0
670
ソフトウェアエンジニアにとっての生成AI - 特性を知って使い倒す / generative ai for software enginner
kishida
7
2k
jsmini JavaScript Engine を作ってみた話
yosuke_furukawa
PRO
0
340
仕様駆動開発へのトライを機に チームに適合する手法を模索し続けている話
freee
PRO
0
580
FastAPI の並行処理モデルを完全に理解する
hoto17296
1
340
複数の Claude Code が"放置"されてしまう問題をCLI ダッシュボードを自作して解決した話
sumihiro3
1
710
Android CLI
fornewid
0
230
人間の目はかわらない、だからJPEGは30年もつ
yuzneri
12
19k
PHP Application における Kubernetes 内 gRPC 通信
ganchiku
0
610
Built Our Own Background Agent at LayerX
layerx
PRO
10
5.8k
生成AI導入の「期待外れ」を乗り越える ー 開発フロー改革が目指す、真の組織変革
starfish719
0
4.9k
Featured
See All Featured
Bash Introduction
62gerente
615
220k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
210
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.8k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
480
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.4k
Mobile First: as difficult as doing things right
swwweet
225
10k
Code Review Best Practice
trishagee
74
20k
Believing is Seeing
oripsolob
1
190
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.9k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.8k
Transcript
商号等 三井物産デジタル‧アセットマネジメント株式会社 ⾦融商品取引業者 関東財務局⻑(⾦商)第3277号 加⼊協会 ⽇本証券業協会、⼀般社団法⼈ ⽇本投資顧問業協会、⼀般社団法⼈ 第⼆種⾦融商品取引業協会 ©Mitsui & Co.
Digital Asset Management, Ltd. 型安全RESTで爆速プロトタイピング ‒ Hono RPC実践 TS Kaigi 2025 After Night LT 2025.5.27
Who am I? • AI Product Team Manager in MDM
(LayerXから出向) • 社内向け内製 LLM Webアプリ を full TypeScript で開発 • モットー: “Build → Ship → Feedback” を最速ループ • 今⽇のテーマ: そのループを⽀える Hono RPC 2 武市 融紀 (X: @tacke_jp)
The “API-Typing” Problem • フロント ↔ サーバー間は ただの JSON •
🛑 型がない → 仕様 drift / runtime error • 既存解 ◦ gRPC ▶ readable じゃない ◦ tRPC ▶ JSON が独特 ◦ GraphQL / JSON-RPC ▶ 汎⽤だけど over-spec • 欲しいのは: ⼈間が読める REST + TypeScript 型安全 3
Landscape Quick Scan 4 ⽅式 プロトコル∕ペイロード 読みやすさ コード⽣成 gRPC HTTP/2,
ProtoBuf 😵 必要 GraphQL POST 1本 😐 (スキーマ必要) tRPC JSON-RPC 😐 不要 Hono RPC 純REST 😀 不要
Enter Hono RPC • Hono: 超軽量Webアプリケーションフレームワーク (24k stars) • RPC
機能 ◦ export type AppType = typeof app → hc<AppType>() だけ ◦ コード⽣成ゼロで型を共有 5 RESTful JSON に 型 をのせる コード⽣成 0, Hot-reload 100%を実現
How it Works // server.ts const route = app .post(
'/posts', zValidator('json', z.object({ title: z.string(), body: z.string(), })), (c) => c.json({ ok: true, message: 'Created!', }, 201) ) export type AppType = typeof route 6 // client.ts import { hc } from 'hono/client' import type { AppType } from '../server' const client = hc< AppType>('/api') const res = await client.posts.$post({ json: { title: 'Hello', body: 'Hono RPC is cool', }, }) // data: { ok: boolean; message: string } const data = await res.json()
✨ What I Like • 普通の REST + 強い型 =
学習コストほぼゼロ • 変更 → 即 red-squiggle (tRPC 同等体験) • ルート毎に HTTP ステータス × 型 を区別可 • 型安全だから UI <-> API 断絶を防⽌ 7
⚠ Caveats / Gotchas in Practice • full-TS プロジェクト限定 •
ミドルウェア経由の Response型は 現状推論されない • 複雑な型は IDE 上で … 折り畳まれる ◦ Tips: 末端 hover ∕ c.json<Foo>() のように明⽰型を付ける • ルータは method chain で書かないと推論が途切れる ◦ 公式ドキュメントでも⾮RPC部分の例はchainしていないので Coding Agentが引っ張られがち 8
⚠ Caveats / Gotchas in Practice (2) // ❌ NG:
各ハンドラを後から繋げる const app = new Hono() app.get('/hello', (c) => c.json({ msg: 'hi' })) app.post('/hello', (c) => c.json({ ok: true })) export type AppType = typeof app // ←推論されない! 9 // ✅ OK: chain してから変数に束ねる const route = new Hono() .get('/hello', (c) => c.json({ msg: 'hi' })) .post('/hello', (c) => c.json({ ok: true })) export type AppType = typeof route // works
Case Study: “Copilot” for ファンド契約書 • pnpm workspaceで web (Next.js)
と backend (Hono API server) を分離 ◦ api で export type AppType → web で hc<AppType>() • SWR + Hono Client = 型安全 Data Fetching • API で { success: true | false } union を返す ◦ UI 側で toast 必須チェック を静的解析 • cookieAuth middleware は new Hono<{ Variables: AuthUser }>() で推 論注⼊ 10
まとめ • REST 可読性 × 型安全 × 開発速度 = Hono
RPC • プロトタイピング勢‧Edge Deploy 勢に特におすすめ • 試したくなったら 👉 pnpm add hono @hono/zod-validator 11
コーポレートサイト https://corp.mitsui-x.com/ サービスサイト(ALTERNA) https://alterna-z.com/