このレポは、next.jsでクリーンなアーキテクチャを実現する方法の例です。このプロジェクトを通過するビデオチュートリアルがあります。画像をクリックしてYouTubeでチェックアウトします。
npm installとnpm run dev実行するだけで、プロジェクトを実行できます。

注記
?私は、オリジナルのクリーンアーキテクチャ図のこの単純化されたバージョンを描きました。私にとってより理にかなっている方法でそれを簡素化し、理解しやすいです。それがあなたにも役立つことを願っています。
クリーンアーキテクチャについて初めて聞いたことがある場合は、ボブおじさんによるオリジナルの記事を読むことを強くお勧めしますが、以下でそれを要約しようとします。
Clean Architectureは、維持とテストが容易であり、コードベースが予測可能であるようにアプリケーションを構築するのに役立つ一連のルールです。これは、開発者が技術的な背景やプログラミング言語の好みに関係なく、一般的な言語のようなものです。
クリーンアーキテクチャ、および同様の/派生アーキテクチャには、すべて同じ目標があります -懸念の分離。同様のコードを一緒にバンドルするレイヤーを導入します。 「レイヤー化」は、コードベースで重要な側面を達成するのに役立ちます。
クリーンアーキテクチャは、依存関係の階層を定義することでこれを達成します - レイヤーはその下のレイヤーのみに依存しますが、上ではありません。
app -フレームワークとドライバーレイヤー- 基本的にすべてのnext.js(ページ、サーバーアクション、コンポーネント、スタイルなど...)またはアプリのロジックを「消費」するものdi依存関係インジェクション - DIコンテナとモジュールをセットアップするフォルダーdrizzle -EverythingDB- DBクライアントの初期化、スキーマ、移行の定義srcシステムの「ルート」application -アプリケーションレイヤー- リポジトリとサービスのためのユースケースとインターフェイスを保持しますentities -エンティティレイヤー- モデルとカスタムエラーを保持しますinfrastructure -インフラストラクチャレイヤー- リポジトリとサービスの実装を保持し、 applicationからインターフェイスを引き込みますinterface-adapters -インターフェイスアダプターレイヤー- システムへのエントリポイントとして機能するコントローラーを保持します(システムと対話するためにフレームワークとドライバーレイヤーで使用)tests - ユニットテストはここに住んでいます - unitサブフォルダーの構造はsrcと一致します.eslintrc.json eslint-plugin-boundariesプラグインが定義されている場所 -これにより、依存関係ルールが壊れるのが妨げられますvitest.config.ts @エイリアスの定義方法に注意してください! Userモデルです。catch 、それらのエラーを自分のエラーに変換します。getTodo 、 createTodo 、 updateTodoなどの単一のデータベース操作を実行するメソッドを公開するクラスです。これは、これらのクラスでのみデータベースライブラリ /ドライバーを使用することを意味します。データの検証を実行せず、データベースに対してクエリと突然変異を実行するだけで、カスタム定義されたエラーをスローするか、結果を返します。diディレクトリに抽象化を作成します。リポジトリ、サービス、コントローラー、およびユースケースをシンボルに「バインド」し、実際の実装が必要なときにそれらのシンボルを使用して「解決」します。これが、明示的に依存する必要なく、実装を使用する方法です(インポート)。 ヒント
FAQでカバーされていない質問がある場合は、このリポジトリで問題を開くか、Discordサーバーに参加して会話を始めてください。
はい!ページルーター、アプリルーター、ミドルウェア、APIハンドラー、サーバーアクション、本当に何でも使用できます!通常、JavaScriptプロジェクトで依存関係注入を達成することは、inversify.jsライブラリで行われています。これは、ノード以外の他のランタイムと互換性がありません。このプロジェクトは、IoCtopusを実装します。IoCtopusは、 reflect-metadataに依存せず、すべてのrantymentで動作する単純なIOCコンテナです。
私はノーと言います。新しいプロジェクトを開始している場合は、MVPステータスをできるだけ早く達成することに集中することをお勧めします(そのため、あなたのアイデアを検証する /プロジェクトに未来があるかどうかを確認できます)。物事が深刻になり始めたとき(より多くの機能が実装され始めたとき、ユーザーベースが大幅に成長するか、プロジェクトの他の開発者を搭載している場合)、それはこのアーキテクチャ(または任意のアーキテクチャ)の適応に時間を費やしたいときです。
すでにプロジェクトの雑草に深く深い場合は、次のスプリントから徐々にリファクタリングすることを計画できます。この場合、コードは既に書かれているので、それを少し再編成する必要があります。また、ルートハンドラーごとにルートハンドラー、サーバーアクションによるサーバーアクションによってその部分を実行できます。ちなみに、私はそれを軽く「あなたはそれを少し再編成する必要がある」と言っていますが、それはそれと同じくらい単純であることからはほど遠いことがあります。リファクタリングを計画するときは、常に「間違っている」ことを考慮に入れてください。そして、テストを書くのに時間を費やしてください!
これについて考える3分以上を費やさないと、はい、それはエンジニアリングのように見えます。しかし、もしそうなら、あなたはそのアーキテクチャ=規律に気付くでしょう。アーキテクチャは、どこに行くかを定義する開発者間の契約です。コードベースを予測可能にし、それらの決定をあなたのために行うため、機能開発を実際に簡素化します。
それに取り組んでいるすべての開発者が、それが最も便利なコードを書いている場合、プロジェクトを持続可能に成長させることはできません。コードベースは、一緒に働くための悪夢に変わり、それがあなたが本当に複雑な機能開発プロセスを感じるときです。これと戦うために、最終的にはいくつかのルールを置きます。これらのルールは、チームが直面し、新しい問題を解決するにつれて成長します。これらすべてのルールをドキュメントに入れてください。そうすれば、独自のアーキテクチャ定義があります。あなたはまだある種のアーキテクチャを実装していますが、その点に非常にゆっくりと痛みを伴って到達しました。
クリーンアーキテクチャは、テストされたショートカットと事前定義されたアーキテクチャを提供します。そして、はい、確かに、あなたはこれらすべてを学ぶ必要がありますが、あなたはあなたの生涯に一度それをし、そしてあなたが将来使用するあらゆる言語またはフレームワークで原則を適用するだけです。
いいえ。プロジェクトが成長すると予想していない場合、機能の数、ユーザー数、またはそれに取り組んでいる開発者の数の両方ではそうではありません。
私がReadmeの一番上で述べた元のブログ投稿で述べたように、あなたは次のようにしました: