Upgrade to Pro — share decks privately, control downloads, hide ads and more …

React→Hotwireへ 技術スタック変更した話

Nao
January 23, 2025
3.4k

React→Hotwireへ 技術スタック変更した話

Nao

January 23, 2025
Tweet

Transcript

  1. 自己紹介 nao (Fukuoka) • エンジニア歴:2021/3/31〜 (4年目) ◦ Railsは2年ぐらい • main:株式会社ヤマデン

    ◦ 営業支援部(DXチーム)エンジニア • sub:合同会社プログラム・キッチン ◦ ソリューションエンジニア • x: (mmm_bbb72) • hobby:チャリ🚲、登山、音楽
  2. 技術スタック(移行前) • Ruby on Rails • フロントエンドをReactで描画 • サーバーとの通信はGraphQLを利用 •

    オンプレからのデータ取得&Pushは node.js ◦ odbc driver(AS400に接続) ◦ node-mysql2
  3. • Data migrationの問題 ◦ AS400→MySQLへの変換 • 基幹システムの仕様把握(開発者はもうおらず ...) ◦ システム把握量が膨大

    ◦ 物流システム、受発注システム、請求システム、etc.. • 多様な技術スタック ◦ Railsの他にReactやGraphQL等のモダン技術キャッチアップ 開発の課題
  4. Hotwireの導入調査 • FetchAPIを利用 • 非同期リクエストを飛ばし、レスポンスでHTMLを受取る • 部分的なDOM更新 ◦ HTMLの中の<body>要素の中身を置き換え ◦

    既存の<head>と置き換え、<body>をマージ ◦ <head>は既存のもの使用可能 ▪ JavaScriptやCSSはそのまま利用 ▪ JSやCSSの初期化処理がなくなりレスポンス向上
  5. Turbo Rails <html> <head> </head> <body> top_page </body> </html> Fetch

    API Turbo Rails <html> <head> </head> <body> cart_page </body> </html> <html> <head> </head> <body> cart_page </body> </html> HTML HTML <html> <head> </head> <body> cart_page </body> </html> Turbo Drive
  6. Turbo Rails View(HTML) Fetch API list turbo_frame id=’huga’ Turbo Frame

    <html> <head> </head> <body> <turbo_frame id="huga"> </turbo_frame> </body> </html> HTML
  7. Turbo Rails View(HTML) Fetch API create.turbo-stream.erb form id=”messages_455” submit Turbo

    Stream append <turbo-stream action="append" target="messages"> <template> <div id="message_456">new_message</div> </template> </turbo-stream> id=”messages_456” remove
  8. Hotwireの利点がうちの開発に適合してた • ⭐シンプルな開発体験 (開発人数少ない ) ◦ Railsとの親和性が高い ◦ JavaScriptの記述が少ない •

    高速なユーザー体験 ◦ ⭐軽量でレスポンスが速い (要件として求められている ) • 保守性の向上 ◦ フロントエンドが複雑になりにくい ◦ ⭐ロジックをサーバーに集約できる (ロジック把握の属人化防止 ) Hotwireの移行決め手
  9. sample:カートページ(数量変更) 削除 削除 削除 XXXX_10 2個 ¥200 + ー 合計

    ¥2,500 YYY_50 1個 ¥300 + ー ABC_20 5個 ¥2000 + ー http://xxxxx.com クリック 購入へ進む 戻る
  10. sample:カートページ(数量変更) 削除 削除 削除 XXXX_10 3個 ¥300 + ー 合計

    ¥2,600 YYY_50 1個 ¥300 + ー ABC_20 5個 ¥2000 + ー http://xxxxx.com Replace Update 購入へ進む 戻る Update 個数に応じ単価も変動
  11. sample:カートページ(商品削除) 削除 削除 削除 XXXX_10 2個 ¥200 + ー 合計

    ¥2,500 YYY_50 1個 ¥300 + ー ABC_20 5個 ¥2000 + ー http://xxxxx.com クリック 購入へ進む 戻る
  12. sample:カートページ(商品削除) 削除 削除 YYY_50 1個 ¥300 + ー ABC_20 5個

    ¥2000 + ー http://xxxxx.com Remove 合計 ¥2,300 Update 購入へ進む 戻る Update
  13. sample:カートページ(商品全削除) 削除 削除 削除 XXXX_10 2個 ¥200 + ー 合計

    ¥2,500 YYY_50 1個 ¥300 + ー ABC_20 5個 ¥2000 + ー http://xxxxx.com クリック 購入へ進む 戻る
  14. sample:カートページ 削除 削除 削除 XXXX_10 2個 ¥200 + ー 合計

    ¥2,500 YYY_50 1個 ¥300 + ー ABC_20 5個 ¥2000 + ー http://xxxxx.com 購入へ進む 戻る turbo_frame_tag
  15. See, your life gets more complex whenever you add partial

    updates to the mix. Now you have to care about screen regions, the elements they contain, and how interactions affect them. Good abstractions help, but you can’t shake the additional complexity off. You are just in a more complex realm. This is why we say that Turbo is progressive: go with the happy Turbo Drive path by default — and deviate from it when you need higher fidelity for specific screens or interactions. ↓ 画面の一部だけを更新する仕組み(部分更新)を取り入れると、システム全体がより複雑になります。画面の領域や、その中に 含まれる要素、さらにそれらに対するインタラクションがどのように影響を及ぼすかまで気にしなければならなくなるからです。優 れた抽象化(設計)でこれを助けることはできますが、この追加された複雑さを完全に取り除くことはできません。それは単に、よ り複雑な領域に足を踏み入れるということなのです。 だからこそ、私たちは Turboを「漸進的( progressive)」だと表現しています。基本的には、 Turbo Driveによる「ハッピーなパス (理想的なルート)」をデフォルトとして使用し、特定の画面やインタラクションにおいてより高精度な動作が必要な場合にのみ、 そのデフォルトから逸脱するべきだと考えています。 とある記事の紹介 参考:https://dev.37signals.com/a-happier-happy-path-in-turbo-with-morphing/