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
ReactNative アプリ同士の通信のために型情報をサクッと共有した話 #TSKaigi...
Search
whatasoda
August 06, 2024
Technology
1
640
ReactNative アプリ同士の通信のために型情報をサクッと共有した話 #TSKaigi サブイベント
https://typescript-jpc.connpass.com/event/325001/
whatasoda
August 06, 2024
Tweet
Share
More Decks by whatasoda
See All by whatasoda
急速に利用拡大を続ける飲食店向けサービスで 店内端末同士のローカル通信を追加設定なしで実現した話
whatasoda
0
120
GraphQL でネストしたクエリを書いたら Apollo Client が無限に計算し続けるようになった話
whatasoda
0
370
Other Decks in Technology
See All in Technology
RDS for Db2 データ移行編 - Part2:S3経由のバックアップ・リストアでデータ移行 /20241011-RDSforDb2-dojo
mayumihirano
0
110
普通の Web エンジニアのための様相論理入門 #yapcjapan / YAPC Hakodate 2024
ytaka23
7
1.7k
シェルとPerlの使い分け、 そういった思考の道具は、どこから来て、どこへゆくのか?v1.1.0
fmlorg
0
670
Qdrant を用いた検索改善施策の紹介 / Search Engineering Tech Talk 2024 Summer
visional_engineering_and_design
2
260
スタサプ ForSCHOOLアプリのシンプルな設計
recruitengineers
PRO
3
770
20241015 Toranomon Tech Hub#1 Service Catalog使ってみた
hiashisan
0
150
GPSデバイスを使った簡易位置案内システムの構築をしてみた話。/jawsfesta2024
kwada
0
150
AWS Lambdaで実現するスケーラブルで低コストなWebサービス構築/YAPC::Hakodate2024
fujiwara3
7
3.8k
入社半年(合計1年)でGoogle Cloud 認定を全冠した秘訣🤫
risatube
1
260
AWS Lambda と Amazon SQS で「わかった気になれる」FreeRTOS 入門
soracom
PRO
2
110
The People First Approach to Engineering Success - DevNot 2024
zikriyeurkmez
0
200
クレジットカードを製造する技術
yutadayo
83
50k
Featured
See All Featured
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
27
1.9k
A better future with KSS
kneath
237
17k
Practical Orchestrator
shlominoach
186
10k
Designing Experiences People Love
moore
138
23k
Why You Should Never Use an ORM
jnunemaker
PRO
53
9k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
26
1.4k
Learning to Love Humans: Emotional Interface Design
aarron
272
40k
Fireside Chat
paigeccino
32
3k
Code Reviewing Like a Champion
maltzj
519
39k
Art, The Web, and Tiny UX
lynnandtonic
296
20k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
41
9.2k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
246
1.3M
Transcript
ReactNative アプリ同士の通信のために 型情報をサクッと共有した話 1 Shota Hatada / whatasoda 1
株式会社dinii Platform Team / Software Engineer ex. mercari / Frontend
Engineer • Google Cloud でのインフラの整備・メンテ • Backend(NestJS)や Client (React, React Native)の基盤実装 好きなこと・もの • TypeScript • スパラクーア(サウナ・岩盤浴) • アニメ Shota Hatada / whatasoda
アプリ同士で通信する理由 3 3
ダイニーが目指す世界 4 “飲⾷”をもっと 楽しくおもしろく Mission すべての⼈の “飲⾷”インフラになる Vision 全ての中心に ID-POS
がある
障害が起きても動いている必要がある 5
6 普段はインターネット経由で注文をサーバーに送信 (モバイルオーダー・ハンディ・レジ) インターネット経由でキッチンに注文を伝達
普段はインターネット経由で注文をサーバーに送信 (モバイルオーダー・ハンディ・レジ) インターネット経由でキッチンに注文を伝達 7 障害発生時には… 店舗内ネットワークだけでどうにかする必要がある • キッチンプリンター → SDK
で通信できる • ハンディ → 独自で通信方法が必要
HTTP vs TCP 8 8
HTTP vs TCP HTTP ☺ 慣れ親しんだ HTTP くん。雑に JSON を送って
JSON を受け取れる 😭 実用に足るライブラリがなかったので内製が必要 ☺ API の型情報を共有する方法は多い(OpenAPI, GraphQL, etc.) TCP 😭 データのチャンクをどのようにパースするかは自力での実装が必要 ☺ ライブラリがあったのでそのまま使える (Rapsssito/react-native-tcp-socket) 😭 API の型情報の共有も自力でどうにかする必要がある 9
同じ型、違う実装 10 10
無理やり同じインターフェイスにしてしまう 11 • ハンディがレジ内部の関数をそのまま呼び出すような体験にしたい(間の TCP 通信を感じさせない) • レジの実装のインターフェイスをハンディの実装に上から被せてしまう(Type Cast) •
Swatinem/rollup-plugin-dts でバンドルされた型ファイルを生成する
12
13 • 1つの関数として定義をまとめることで、 追加のアクションが実装されても基盤部分への変更が不要になる • DispatcherType を抽出してハンディ側に共有 • ハンディでも TCP
通信を利用してリクエストを送る実装を 似た形で記述して上から型を被せてしまう
14
rollup-plugin-dts vs dts-bundle-generator 15 他の類似ツールはこちらでも紹介されています https://github.com/Swatinem/rollup-plugin-dts#alternatives timocov/dts-bundle-generator • 完全に単体で動作するため簡単にセットアップできてスッキリ •
rollup-plugin-dts とほぼ同じことができるが、他のツールとの組み合わせはコマンドの組み合わせになる • ダイニーでは hono client にサーバー側の型情報を伝えるとき、クライアント側で余計な依存をインストール しないで済むように型だけ抽出していた(PoC 的な開発で使っていました) Swatinem/rollup-plugin-dts • 複数ファイルに定義されたものを1つの .d.ts ファイルに • rollup のインストールや config ファイルの作成が必要 • prettier などの他のプラグインと組み合わせることができ る
https://dinii.connpass.com/event/325689/
https://zenn.dev/dinii/articles/82681cabc82809