inSmartBank

B/43を運営する株式会社スマートバンクのメンバーによるブログです

ミニマムな React Web アプリケーションの技術スタックを大公開!

はじめに

こんにちは。サーバーサイドエンジニアの mokuo です。

最近、ミニマムな React アプリを実装する機会がありました。

社内のメンバーにアドバイスをもらいながら、今(2024年前半) React アプリをミニマムに作るならこんな感じかな、という構成になった気がするので、ご紹介したいと思います。

実例の1つとして参考にしていただけますと、幸いです。

本文

📝 機能要件

社内の限られた CS メンバーのみが利用する、管理画面を開発しました。

バックエンドは Golang で実装される API サーバーで、認証機能以外だと、2つの機能のみで構成されるシンプルな Web アプリケーションになっています。 インフラやバックエンドについての詳細は、以下の記事を御覧ください。

blog.smartbank.co.jp

blog.smartbank.co.jp

blog.smartbank.co.jp

blog.smartbank.co.jp

⚒️ 採用したツール (npm モジュール)

パッケージ名 カテゴリ 選定理由
npm パッケージ管理 スマートバンクとしては、管理画面は yarn だがプロダクトサイトは npm なので、どちらも利用している。lock ファイルや速度など、npm と yarn の機能差が少なくなり、npm が選択されるケースが増えてきている印象。
Vite ビルドツール create-react-app と vite を比較して、Vite を採用しました。
Vitest テスト Jest と互換性があって書き方も変わらなそう
@testing-library/react テスト 評判が良く、最近採用されるケースが多そう
nock テスト http リクエストをモックするライブラリ
Biome Linter, フォーマッター ESLint + Prettier の代替として注目されている Linter とフォーマッタの機能を含んだツール。複数の依存ライブラリを入れる必要がなく、設定もシンプル。
wouter ルーター Next.js, wouter, React Router, TanStack Router あたりが候補に上がった。今回は2ページしかないアプリケーションなので、最も軽量な wouter を選択。
Amplify, Amplify UI 認証 用意された React コンポーネントを利用することで、楽に認証画面を実装することができる。実際、工数をかけずに組み込むことができました。
Material UI UI 既存の管理画面で使用されている React-Admin が内部で利用しているので、使い勝手を統一できる。個人的にも、使い慣れているライブラリである。

以下、Vite の選定理由について補足します。

また、既存の管理画面でも Vite を利用しています。詳しくは以下の記事をご覧ください。

blog.smartbank.co.jp

📁 ディレクトリ構成

.
├── node_modules
├── public
└── src
    ├── clients
    ├── components
    └── pages

以下、☆ が付いているのが、独自に作成する(予定の)ディレクトリで、それ以外は npm create vite@latest コマンドが自動生成したディレクトリになっています。

  • node_modules
  • public
    • 静的なファイル
  • src
    • clients
      • 外部への通信を行う API クライアントクラス
      • infrastructures, repositories なども検討したが、他のディレクトリ名と同様に直感的な名前にした
    • components
      • 共通コンポーネント
    • pages
      • ページごとのコンポーネント

基本的には pages の下に、ページ毎にディレクトリを切っています。そのページで使うコンポーネントはすべて同じディレクトリに含めるようにしていて、シンプルな構成になっています。

👨‍💻 プロトタイピングの実施

社内の既存の管理画面は React-Admin というフレームワークを使って実装されています。

今回も同じ管理画面ということで、React-Admin が候補に上がりましたが、以下の懸念点がありました。

  • React-Admin 特有の知識が必要になる
  • 今回の要件だと、React-Admin の機能をほとんど使わない
  • 依存パッケージが大量に存在するので、バージョンアップ作業が大変になる

そこで、フレームワーク無しの React と、React-Admin の2パターンでプロトタイピングを実施して、比較をすることになりました。

結果として、以下の理由から、フレームワーク無しの React で実装することに決定しました。

  • React-Admin は コンポーネントを軸に CRUD の機能に特化している
  • 今回の要件に CRUD はなく、React の機能を使って自前で実装するしかなく、恩恵を受けられない

また、Next.js, Remix 等のフルスタックフレームワークについても検討しましたが、今回は要件も少なく小さなアプリケーションであり、SSR も不要であり、too much であると判断しました。

🍩 おまけ

コンポーネント設計について

一時期は Atomic Design が流行っていたが、知り合いの Web フロントエンドエンジニアによると、今は教養として知っておくと良いくらいの立ち位置になっているようです。 現在は Atomic Design を参考にしつつ、各社・各チームが独自に工夫をしていて、デファクトスタンダードが存在していないイメージがあります。

手前味噌で恐縮ですが、Atomic Design については、私の前職のブログを載せておきます。

buildersbox.corp-sansan.com

フロントエンドに DDD のエッセンスを取り入れてみたい

今回の要件には当てはまらないですが、ある程度複雑な SPA を開発するなら、DDD の概念を取り入れてみたいと思っています。

DDD 界隈では、推奨されるアーキテクチャがいくつか存在している認識です。 個人的には、レイヤードアーキテクチャやオニオンアーキテクチャくらいがちょうど良いと考えていて、フロントエンドにも以下のような構成で取り入れられないか、などと妄想しています。

おわりに

いかがでしたか。

規模の小さい React アプリケーションを実装する際など、技術選定の参考にしていただけますと、嬉しいです。

スマートバンクでは、エンジニアを募集しています。ご興味あれば、ぜひ以下のサイトもご覧ください!

smartbank.co.jp

We create the new normal of easy budgeting, easy banking, and easy living.
In this blog, engineers, product managers, designers, business development, legal, CS, and other members will share their insights.