技術選定

概要

下記サイトの1章を参考に、本アプリケーションの設計を検討した。

React Application Architecture for Production〜これ一冊で全てが網羅〜

アプリケーション設計

Project の構造

monorepoで各プロジェクトは管理する。 bun workspace

下記を参考に検討している。 フロントエンドはFSD を採用。

手法特徴
Feature Sliced Designフロントエンド向けの階層構造
Bulletproof-react「特化」と「汎化」を意識した直観的な構造
domain-driven design複雑な業務要件に立ち向かう構造

State の管理

要件選択肢採用
State が頻繁に更新されるatom-based (ex. Recoil, Jotai)
異なる多くの State を Component 間で共有redux(ex. redux-toolkit)
特別な要件がないZustand,React Context

今回のアプリケーションではStateが頻繁に更新などの要件がない。

状態説明管理
プレイヤー入力フォームメッセージを投稿するフォームuseState
シナリオ作成フォームシナリオ情報を投稿するフォームuseState

Styling はどのように行う?

build 時の CSS 解決が必要かどうかについて下記の観点で検討する。

  • 頻繁な再レンダリング
  • パフォーマンスの重要性

build 時の CSS 解決が必要な場合は Tailwind や vanilla css が選択肢となる。
メディアクエリを簡単に使いたいため、Tailwindを採用した。

レンダリング戦略

高いパフォーマンスと SEO が必要な場合はServer-side rendering(SSR)が求められる。

今回は一般公開用ではなく、SEO を気にする必要もないためClient-side rendering(CSR)を採用する。

Routing

react-router-domを採用。*

Reactの最新機能を利用する要件がまだ存在しないため。

ページごとに最適化したレンダリング戦略

参考先では下記のように分けている。

  • 誰もが閲覧可能なページ … SEOを意識
    • Server-side rendering(SSR)
  • 管理者用のページ … サーバ側の負荷軽減
    • Client-side rendering(CSR)

本アプリケーションではSEOを意識しないため、全ページ CSR を採用した。

テスト設計

テスト戦略

package戦略
coreドメインロジックをBDDでテスト(ロジック中心の振る舞いを検証)。
frontendE2EテストでBDDを実施(ユーザー視点でのフローを確認)。
  • 重複を回避
    • coreのBDDテストでドメインロジックの振る舞いを担保。
    • frontendでは、coreの動作を信頼し、主要なE2Eシナリオのみに集中。

MVPフェーズでは、BDDテストをcoreに集中させ、frontendは簡易なE2Eテストに留める。 スケール時には、E2Eテストを拡張し、BDDを両方で部分的に実施することを検討。

ライブラリ選定

テストに利用するライブラリは利用者の多さから下記とした。

テスト種別スコープライブラリ
モジュール単体テスト他のモジュールに依存しないテストVitest
コンポーネント結合テスト複数モジュールを組み合わせて実装されたコンポーネントを対象とするテストVitest,React Testing Library
BDDふるまい駆動テストCucumber, Vitest
E2E テストアプリケーション全体のテスト。正常系のケースをバックエンドとの通信を含めてテストするPlaywright