「とりあえずReact」から離れてみた話
少し前まで、フロントエンドの仕事が来ると「とりあえず React」だった。
React を選ぶことに疑問を持ったことがなかった。エコシステムが豊富、採用も多い、コミュニティが大きい。選ぶ理由はいくらでもある。むしろ React 以外を選ぶ理由を探す方が難しかった。
でも去年、個人開発のプロジェクトで意図的に「React を使わない」という縛りを設けてみた。それが思いのほか、多くのことを教えてくれた。
Vanilla JS でやってみた
まず試したのは、素の JavaScript だ。
個人開発のダッシュボードツールを、React なしで作ってみた。DOM 操作を手書きし、イベントリスナーを自分で管理し、状態の更新ロジックを自前で書く。
最初は「こんなの面倒くさい」と感じた。React なら useState 一発で済むところを、何行もかけてやっている。
でも、しばらくしてあることに気づいた。「自分が React に何を任せていたか」がはっきりわかるのだ。
仮想 DOM の差分更新、イベントのデリゲーション、コンポーネントのライフサイクル管理。React はこれらを抽象化して隠してくれていた。それが便利である反面、「なぜうまく動いているのか」を理解しないまま使っていたということでもある。
React の「魔法」に頼りすぎていた
React を使っていると、useEffect の依存配列が原因のバグにハマることがある。useMemo を入れるとなぜか遅くなる現象が起きる。コンポーネントが意図せず再レンダリングされる。
これらを「React の問題」として処理していたが、Vanilla JS で基礎を掘り返してみて気づいた。「自分が JavaScript そのものをちゃんと理解していなかった」という点も大きかった。
クロージャ、プロトタイプチェーン、イベントループ。React の抽象の下にあるこれらを、ちゃんとわかっていなかった。
軽量なライブラリの面白さ
Vanilla JS の後、いくつかの軽量ライブラリも試してみた。
Alpine.js はその一つで、HTML に属性を追加するだけで双方向バインディングが動く。React ほどの複雑さはないが、小さなインタラクションには十分すぎるほどだ。このブログに使っているテーマにもインタラクションを足したとき、React を入れるより Alpine.js の方が明らかに適していた。
htmx も面白かった。HTML の属性だけでサーバーとの非同期通信が書ける。SPA をごりごり作る場合には向かないが、既存のサーバーサイドアプリにちょっとしたインタラクションを足す用途なら、JavaScript をほとんど書かずに済む。
React が優れているのは確か
誤解のないように言っておくと、React が優れているのは疑いない。
大規模な SPA、複雑な状態管理、チーム開発での標準化。これらが求められる場面では React の選択は理にかなっている。エコシステムの充実度も、他に比べて圧倒的だ。
私の本業でも React を使っているし、これからも使い続けるだろう。
「問いを立てる」習慣
この実験から得た一番の収穫は、技術を「当たり前」として使わなくなったことだ。
「この案件に React は本当に必要か?」「静的なサイトに SPA の複雑さは適切か?」「ビルドツールのオーバーヘッドを払う価値があるか?」
こういった問いを立てるようになった。答えが「やっぱり React が最適」になることも多いが、問いを立てるプロセス自体が技術選定の精度を上げてくれる。
講師として生徒に教えるとき、「なぜ React を使うのか」を説明できる生徒は少ない。「周りが使っているから」「求人に多いから」という理由は正直なものだが、それだけでは React の設計思想を活かした使い方にはつながらない。
道具は、なぜそれが存在するかを知っていると、はじめて使いこなせる。
「とりあえず React」をやめてみた実験は、私にそのことを改めて教えてくれた。