Next.jsで作るドライバー向けWebアプリ
by
chahan
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Slide 1
Slide 1 text
© 2021 Cookpad Inc. Next.jsで作るドライバー向けWebアプリ 2022-06-30 Tech Kitchen #27 Takuya Nakamura
Slide 2
Slide 2 text
自己紹介 ● 中村 拓哉 / chahan / cha-san ● 2021/02 入社 ● サーバーサイドエンジニア ● クックパッドマート ○ 流通 ■ ドライバー向けWebアプリ ■ 配送拠点 ■ 他、流通に関わること諸々 ● @peto_tn ● サンブレイク発売日ですね
Slide 3
Slide 3 text
● ドライバー向けWebアプリとは ● 使用技術 ○ GraphQL ○ 認証 / 認可 ● リポジトリ管理 ○ モノレポ ○ ディレクトリ構成 ● 物理世界との連携 話すこと
Slide 4
Slide 4 text
ドライバー向けWebアプリとは
Slide 5
Slide 5 text
● 生鮮食品ECサービス ● 流通は自分達で作っている ● 実際にものを届けるのはドライバー クックパッドマート
Slide 6
Slide 6 text
● ドライバーに向けて何をいつどこからどこに 届けるか指示する ● 特性 ○ SEOは不要 ○ 実用性重視 ○ 使用可能なユーザーを管理 ○ スマホ向け ドライバー向けWebアプリ
Slide 7
Slide 7 text
ドライバー向けWebアプリ
Slide 8
Slide 8 text
ドライバー向けWebアプリ
Slide 9
Slide 9 text
● 元々ネイティブアプリで提供している時代もあった ○ チームにモバイルエンジニアがいない ○ 開発が必要になるとチーム外のモバイルエンジニアに都度依頼 ○ 流通の構造を変えたいということは度々あり、速度が出ないことが課題に ○ 常駐させておくほど常にタスクはない ○ Webに移行してチーム内で開発できるよう振り切った ○ ※チームの都合であってどちらが優れているということではない Native VS Web
Slide 10
Slide 10 text
● 変化の早い流通に即応しやすい ○ 大きな変更から小さな改善まで入れやすい ■ 改善の頻度が上がった ● 管理ツールとしても活用 ○ 社内や運送会社のマネージャーの管理画面としても活用 Web移行の副次的効果
Slide 11
Slide 11 text
使用技術
Slide 12
Slide 12 text
● Language / Framework ○ Next.js ○ TypeScript ● API ○ GraphQL ○ Apollo Client ● UI ○ MUI 技術構成 ● Lint / Formatter ○ eslint ○ prettier ● Test ○ jest ○ react-testing-library ○ fishery
Slide 13
Slide 13 text
● スキーマからコード生成できて便利 ● シンプルにページ毎に必要な情報をガッと取得している ● クライアントから直接呼んでいる GraphQL
Slide 14
Slide 14 text
● IDaaS: Azure AD ○ 社内標準。社内の人間はすでにアカウントがある ○ 各種ドライバーWebアプリの権限を一括管理 ■ 複数のWebアプリがあるため、ドライバーに対して権限を一括で管理できるようにして いる ● Slack連携して、SlackIDに紐づいてない人は弾いたりしている ○ ドライバーにSlack通知をするため 認証
Slide 15
Slide 15 text
● contextに現在のユーザー情報を詰める ○ アプリケーション ○ 所属 ○ 権限 ● Query単位で認可している ○ Field単位だとパフォーマンスが非現実的 認可
Slide 16
Slide 16 text
リポジトリ管理
Slide 17
Slide 17 text
● 各種Webアプリはモノレポ構成 ○ 見通しがいい ■ 流通チームとしてこのリポジトリを見てればOK ■ チームが別れるプロジェクトは素直にリポジトリを分けた方が無難 ○ 共通化 ■ 依存関係の共通化 ■ モジュールの共通化 ■ Issueの共通化 ○ CIなど既存の仕組みに載せやすい モノレポ
Slide 18
Slide 18 text
● src/ ○ components/ ■ _shared/ ■ 各ページ/ ○ hooks/ ■ カスタムフックスを配置 ○ lib/ ■ viewを伴わない純粋なロジックを配置 ○ graphql/ ■ GraphQLのクエリ定義を配置 ○ gen/ ■ GraphQLやprotocol buffersからの自動生成されたコードを配置 ● tests/ ディレクトリ構成
Slide 19
Slide 19 text
● Atomic Design やってみた ○ プロジェクトにあってなかったのでやめた ■ MUIを使い倒してるとatomが生まれない ■ デザインシステムを作りたいわけではない ● リッチなデザインよりも実用性重視 ■ 新規メンバーの学習コストが高い ディレクトリ構成
Slide 20
Slide 20 text
物理世界との連携
Slide 21
Slide 21 text
● 配送拠点でドライバーが印刷する ● 印刷ジョブをキューイングして処理する ○ 一定のタイムラインで運行しているため同じタイミングで印刷されやすい ラベル印刷
Slide 22
Slide 22 text
● 納品時に冷蔵庫を開ける必要がある ● 解錠用のQRコードを発行して表示する ○ ドライバーが冷蔵庫にかざして解錠 ○ ユーザーが商品を受け取る際と同じ原理 QRコード解錠
Slide 23
Slide 23 text
● 用途 ○ 納品時のコンテナと商品の検品 ○ 出荷時のコンテナチェック ○ 温度計の紐付け ● ドライバーがカメラの権限を承認 ○ カメラが起動しない ■ ほぼ権限問題 ○ 動作確認ページを用意 QRコードリーダー
Slide 24
Slide 24 text
No content