Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Hotwire を 本番環境で使ってみた感想
Search
zaru
April 07, 2022
Programming
6.8k
7
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Hotwire を 本番環境で使ってみた感想
2022年のRailsの開発現場事情について語ろう! Qiita Night
https://increments.connpass.com/event/241385/
zaru
April 07, 2022
More Decks by zaru
See All by zaru
Next.js App Router セキュリティ
zaru_sakuraba
22
8.8k
失敗から学ぶ個人開発
zaru_sakuraba
18
5.6k
伝わらない Issue の書き方
zaru_sakuraba
1
1.3k
とあるプロジェクトでコードを書き始めた僕がつまづいた石たち
zaru_sakuraba
0
220
Ruby との対話 : pry を使い pry をデバッグし pry のバグを直す話
zaru_sakuraba
4
640
もう「クレデンシャルください」なんて言わせない
zaru_sakuraba
5
1.7k
個人プロジェクト現状報告会
zaru_sakuraba
0
160
僕と契約して、メソッドになってよ!
zaru_sakuraba
0
220
Other Decks in Programming
See All in Programming
AWS DevOps Agentで インシデント対応をAIに任せたい
honmarkhunt
7
2.7k
RSSとCodexを使ってX投稿自動化してみた
ochtum
0
110
Gmail/Google DriveをトリガーにAIエージェントを動かそう! / Run AI agents with Gmail/Google Drive as triggers!
har1101
3
490
型解析で実現する Go の言語内 DSL / Conference に Go! タイムテーブルの歩き方 for Gophers
mazrean
0
140
ハーネス設計入門 〜プロンプト、コンテキストの次〜
kinopeee
55
37k
フロントエンドUIフレームワークのこれまでとこれから
ssssota
5
2.1k
AIの中の人になってみる
htkym
0
170
AIは賢い。でも実行環境は? CLIおじさんがAI時代に伝えたいこと ~ CLIおじさんがAI時代に伝えたいこと ~
curekoshimizu
1
220
初心者DevRelとして参加者だった私が、DevRel Talks!#2に登壇するまでにしてきたこと
sokohirai
0
360
「AI時代、配布するPythonコードをどう守るか: 難読化の実験と判断軸」 #PyconJP2026
pkshadeck
PRO
2
190
Snowflakeで業務アプリを作ろう。 Snowflakeのアプリ機能解説&実践ガイド
ayumu_yamaguchi
1
210
Foundry Localでエージェント開発
seosoft
0
160
Featured
See All Featured
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.6k
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
4
620
What does AI have to do with Human Rights?
axbom
PRO
1
2.4k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
520
Building Adaptive Systems
keathley
44
3.2k
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
820
Fireside Chat
paigeccino
43
4k
Building Flexible Design Systems
yeseniaperezcruz
330
41k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.3k
Darren the Foodie - Storyboard
khoart
PRO
3
3.9k
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
Music & Morning Musume
bryan
47
7.4k
Transcript
Hotwire を 本番環境で使ってみた感想 2022.04.07 Qiita Night @zaru
zaru
@zaru 株式会社ベーシック CTO 💓 Ruby, JavaScript WebComponents ISUCON 楽しみ
Hotwire 使っているよという人✋
はい、誰もいませんね Hotwire の宣伝に来ました
素朴な Web アプリケーションを 作っている皆さん… not ガチ GUI、not リッチ CMS
こんな気持ちになりませんか?
こんな気持ちになりませんか? SPA 風味な体験や UI を楽に実装したい React か Vue か Svelte
か Angular か永遠に技 術選定している Rails と React で ステートの 多重管理めんどう… ERB と JSX 混じっててカオス
そこで Hotwire ですよ
Hotwire とは JavaScript を極力書かずにモダンな Web アプ リケーションを作れるよ。SPA 風味な実装が サクッとできるよ。しかも JSON
ではなく HTML をサーバとやり取りするよ。View 生成 をサーバに全部任せるよ。クライアントは何 もしなくて良いんだよ。最高なんだよ。知ら んけど。それが Hotwire だよ。という感じ。
Hotwire とは JavaScript を極力書かずにモダンな Web アプ リケーションを作れるよ。SPA 風味な実装が サクッとできるよ。しかも JSON
ではなく HTML をサーバとやり取りするよ。View 生成 をサーバに全部任せるよ。クライアントは何 もしなくて良いんだよ。最高なんだよ。知ら んけど。それが Hotwire だよ。という感じ。 暗黙的で、魔術的で、裏で何 やっているか把握しにくくて、 嫌なにおいがするぞ
Hotwire とは JavaScript を極力書かずにモダンな Web アプ リケーションを作れるよ。SPA 風味な実装が サクッとできるよ。しかも JSON
ではなく HTML をサーバとやり取りするよ。View 生成 をサーバに全部任せるよ。クライアントは何 もしなくて良いんだよ。最高なんだよ。知ら んけど。それが Hotwire だよ。という感じ。 SPA って構築コスト高いでしょ …しかも中途半端なものしかで きなそう
Hotwire とは JavaScript を極力書かずにモダンな Web アプ リケーションを作れるよ。SPA 風味な実装が サクッとできるよ。しかも JSON
ではなく HTML をサーバとやり取りするよ。View 生成 をサーバに全部任せるよ。クライアントは何 もしなくて良いんだよ。最高なんだよ。知ら んけど。それが Hotwire だよ。という感じ。 知らんけど、 パフォーマンス悪そう〜 時代逆行してる感
Hotwire の 登場人物は3人 + 1
TurboDrive TurboFrame TurboSream Stimulus
TurboDrive TurboFrame TurboSream Stimulus 昔の Turbolinks <body> GET /articles/1 <body>
GET /articles/2 特に何もせずとも大雑把な意味で SPA っぽい挙動になる 体感速度は分かる程度には向上する Turbolinks 時代には、嫌われていた印象… 画面遷移時に <body> を fetch してきて入れ替える jQuery 時代は pjax とか呼ばれていたやつ
TurboDrive TurboFrame TurboSream Stimulus iframe のように使える iframe じゃないやつ GET /articles/1
サーバの各種リソースを コンポーネントのように 単一のページに結合して扱える GET /articles GET /ranking 前へ 1 2 .. 5 次へ GET /lazyload リンクのスコープが閉じているので frame 内部で遷移が可能 遅延表示も可能
TurboDrive TurboFrame TurboSream Stimulus 非同期アクションを WebSocket でやる GET /mailbox ・・・
新着メールタイトル 📩 モデルを subscribe して更新内容を受け取る View の partial HTML を WebSocket で送ったりする 💻 💼 🏻 ♂ モデル PubSub のように 複数人に同一の更新内容を 送ることもできる * WebSocket じゃなくてもできる
TurboDrive TurboFrame TurboSream Stimulus データバインディング中心の控えめな JS ライブラリ 描画とか、そういうのは一切やらない
None
Hotwire 使ったところ
一覧の検索と詳細表示
編集のライブプレビュー
None
Hotwire 感 想
良いところ
数行足すだけで本当に SPA 風味な体験を作れる
GET /articles/2 GET /articles ID: 1 show ID: 2 show
ID: 3 show ID: 4 show GET /articles/1 ID: 1 show ID: 2 show ID: 3 show ID: 4 show ID: 1 の詳細 fetch HTML 一覧から、画面遷移せずに 詳細情報を表示するタイプのやつ 例えば、これを作るとする
<ul> <li><%= link_to 'Article 1', article_path(1), data: { turbo_frame: 'article'
} %></li> <li><%= link_to 'Article 2', article_path(2), data: { turbo_frame: 'article' } %></li> </ul> <%= turbo_frame_tag 'article' %> <p>TurboFrame 対象外</p> <%= turbo_frame_tag 'article' do %> <h1><%= @article.title %></h1> <p><%= @article.content %></p> <% end %> show.html.erb index.html.erb TurboFrame で読み込んだ ものを表示する場所を定義 TurboFrame で読み込んだ ものを表示する場所を定義 反映先の Frame を指定 これだけで、できる
turbo_frame_tag で囲むだけで 素朴な Web アプリケーションが SPA 風味に変身…!! すごいぞ?!
状態管理がサーバのみになる
ID: 1 タイトル1 show ID: 2 タイトル2 show ID: 3
タイトル3 show ID: 4 タイトル4 show 更新内容を画面全体の要素 に反映させたい タイトル1更新 update Title ID: 1 の編集 ID: 1 タイトル1更新 show ID: 2 タイトル2 show ID: 3 タイトル3 show ID: 4 タイトル4 show 更新完了しました ID: 1 の編集 これをクライアント側でや ろうとすると、クライアン トも状態を持ち、サーバも 状態を管理することになる * 実装方法にも依存するので一概には言えないけど
ID: 1 タイトル1 show ID: 2 タイトル2 show ID: 3
タイトル3 show ID: 4 タイトル4 show タイトル1更新 update Title ID: 1 の編集 ID: 1 タイトル1更新 show ID: 2 タイトル2 show ID: 3 タイトル3 show ID: 4 タイトル4 show 更新完了しました ID: 1 の編集 状態も描画もサーバに任せ て、クライアントは渡され たものを描画するだけ Article モデルが変更を検知して、変 更箇所を WebSocket 使って View を publish する HTML PUT
SPA で課題になりがちな 状態管理をサーバで素朴にできるよ すごいぞ?!
微妙なところ
ERB と React なら 書き味はReact が圧倒的に良い * React の部分はお好きな JS
ライブラリにしてください Hotwire というよりも Rails/Ruby の話
描画パフォーマンスは Better 止まり、最速ではない 必ずサーバのレスポンスを待つ特性 Optimistic Updates(楽観的更新) できない ページ編集など変更要素が多いエディタの ライブプレビューにはあまり向いてない…
Turbo は良いけど Stimulus がつらい Turbo を使うのに Stimulus は必須ではない けれど、軽量なデータバインディングとして 採用したい…だけど…
普通の HTML の data 属性に書くの で、エディタで補完がされないし、 テストもしにくい DOM 依存している割に DOM
構造を知らな い。振る舞いのみに分離して分かりにくい TypeScript で declare すればコード上では確定できるけども
ぶっちゃけ今後も使いますか? 想定質問
使うぞ!!
- Web アプリケーションの要件に依存すると思う - またはチームのスキル特性と規模 - スモールチームで素朴な Web アプリケーションならマッチする -
物足りなくなったら気軽に捨てられる Rails 使っていて、素朴な Web アプリケーションなら 普通に採用して良いと思う
Hotwire よりも React の方が 良いんじゃないですか? * React の部分はお好きな JS ライブラリにしてください
想定質問
- ただ React 使うなら Next とか Apollo, Nest, Firebase などでサーバも
JS にしたい気持ち - Rails with React みたいなハイブリッド構成は個人的には重い * React の部分はお好きな JS ライブラリにしてください はい、React とても良いです!
Enjoy Hotwire ! 聞いてくれて、ありがとう :)