LEFログ:学習記録ノート

leflog: 学習の記録をどんどんアップしていきます

【TurboDrive】Rails 7 でReactとHotwire(Turbo & Stimulus)を同時に使いたいときには、Turbo Driveを無効化しよう!(Turbolinks, React, esbuild, jsbundling-rails)

ReactとHotwireは両方同時に使える!

結論

つまり、JavaScriptのエンドポイントであるapplication.jsに、

import { Turbo } from "@hotwired/turbo-rails"
Turbo.session.drive = false

を書き込んであげればOK!!

Turboを使ってあげたい箇所ではdata: { turbo: true }を書き込んであげましょう。

Turbo Driveを無効化することで、kaminarilink_toなどの画面遷移後も、きちんとReactが表示されるようになります。

経緯

Turboを完全に無効化してしまうと、確認ダイアログなどの機能をReactやVueや素のJavaScriptで実装する必要があり大変です。

しかし、Turboを有効にすると、Turbo Drive(Rails 6時代はTurbolinksと呼ばれていました)が有効になってしまい、画面遷移後にReactが表示されなくなってしまい、困っていました。

Turbo(Hotwire)の良いところも、Reactの良いところも、両方使いたい! どちらかを選択してどちらかを諦めるのは嫌だ!

そう思って調べたところ、上記の記事を見つけることができ、無事に両方とも使えるようになりました! ありがとうございます🙏

具体例

具体的なコード例については、こちらのPull Requestに上げております! ぜひ参考にしてみてください✨

Turbo Drive(Turbolinks)を無効にして、Turbo(Hotwire)とReactを同時に使えるようにした by lef237 · Pull Request #77 · lef237/quotelist

謝辞

質問・雑談タイムでアドバイスをくださった komagata さんに、この場で改めてお礼申し上げたいと思います。ありがとうございました!😊

重要な追記(2023-04-07)

ブラウザバックやブラウザフォワード(ブラウザ操作における戻るボタンと進むボタンを押す)時に、Reactがうまく読み込めないことがありました(キャッシュが残り最新の状態になっていない)。

この問題を解決する方法は色々ありますが、上記のようにReactとHotwireを共存させている場合、Stimulusを使ってコードを書いてあげるのが便利です。

こちらのリンク先の2つのコードを書いてあげると、Reactが最新の状態に読み込まれるようになるので、とても良い感じになります。

ぜひ参考にしてみてください✨