Skip to content

フォルダ構成

Node.js Webアプリケーションのフォルダ構成

Section titled “Node.js Webアプリケーションのフォルダ構成”

Node.jsのプロジェクトには公式な標準構成はありませんが、アプリケーションの規模に応じて、複数のベストプラクティスが存在します。これらは、コードの可読性、メンテナンス性、およびチーム開発の効率性を高めることを目的としています。

1. 小〜中規模向けの基本構成 (MVCベース)

Section titled “1. 小〜中規模向けの基本構成 (MVCベース)”

この構成は、小規模から中規模のWebアプリケーションで最も広く採用されています。MVC (Model-View-Controller) の原則に基づいて、役割ごとにコードを分割します。

my-app/
├── node_modules/ # npmパッケージ
├── public/ # 公開する静的ファイル(CSS, JS, 画像など)
├── src/ # アプリケーションのソースコード
│ ├── controllers/ # リクエストの制御とロジック
│ ├── models/ # データベース操作とデータ定義
│ ├── routes/ # ルーティング設定
│ └── views/ # テンプレートファイル(HTMLなど)
├── .env # 環境変数
├── .gitignore # Gitの管理から除外するファイル
├── package.json # プロジェクトの設定
└── server.js # アプリケーションの起動ファイル

src/ ディレクトリ内に、controllers、models、routes、views といったMVCの各レイヤーを配置することで、各ファイルの役割が明確になります。

.envpackage.json は、プロジェクト全体の設定を管理する上で不可欠なファイルです。

アプリケーションの規模が大きくなると、ビジネスロジックや共通の処理をより詳細に分離する必要があります。以下のディレクトリを追加することで、コードの再利用性と管理のしやすさが向上します。

  • src/services/: 複雑なビジネスロジックをコントローラーから分離します。ユーザー登録やメール送信など、複数のコントローラーで共通して使われる処理をここにまとめ、コードの再利用性とテスト性を高めます。
  • src/middlewares/: リクエストの共通処理を管理します。認証、ログ記録、CORS(オリジン間リソース共有)設定など、リクエストがコントローラーに到達する前に実行される処理をここに配置し、コードの重複を防ぎます。
  • src/utils/ or src/helpers/: 汎用的なヘルパー関数をまとめます。日付のフォーマット、データのバリデーション、共通の定数など、特定のレイヤーに属さないユーティリティ関数を格納します。
  • src/config/: 詳細な環境設定を管理します。データベース接続情報やAPIキーなどを、環境(開発、テスト、本番)ごとに分けて管理します。

3. より高度な構成:機能(Feature)ベースの構造

Section titled “3. より高度な構成:機能(Feature)ベースの構造”

アプリケーションが非常に大規模で、多くの独立した機能を持つ場合、MVCのレイヤー別分割よりも、機能(Feature)ごとにコードをまとめる構成が有効です。これにより、特定の機能の追加や削除が容易になり、チーム開発の際のコンフリクトを減らせます。

my-app/
├── src/
│ ├── modules/
│ │ ├── users/ # ユーザー管理機能
│ │ │ ├── user.controller.js
│ │ │ ├── user.model.js
│ │ │ └── user.routes.js
│ │ └── products/ # 商品管理機能
│ │ ├── product.controller.js
│ │ ├── product.model.js
│ │ └── product.routes.js
│ └── shared/ # 共有モジュール
│ ├── utils.js
│ └── auth.middleware.js
│ ...

この構造では、usersやproductsといった各機能のディレクトリ内に、その機能に関連するすべてのファイル(コントローラー、モデル、ルートなど)を配置します。

どの構成を選ぶかは、プロジェクトの規模とチームのニーズによって異なります。プロジェクトの初期段階ではシンプルなMVC構成から始め、必要に応じて徐々に高度な構成に移行していくのが良いでしょう。