此存儲庫是如何在Next.js中實現乾淨體系結構的一個示例。有一個視頻教程貫穿該項目。單擊圖像以在YouTube上查看:
您只需運行npm install和npm run dev即可運行項目。

筆記
?我繪製了原始清潔架構圖的簡化版本。我以一種對我來說更有意義的方式簡化了它,並且更容易理解。我希望它也對您有所幫助。
我強烈建議您閱讀Bob叔叔的原始文章,如果您是您第一次聽到有關乾淨建築的消息,但我會在下面為您總結一下。
乾淨的體系結構是一組規則,可以幫助我們以更易於維護和測試的方式構建應用程序,並且它們的代碼庫是可以預測的。無論他們的技術背景和編程語言偏好如何,這就像開發人員理解的通用語言。
乾淨的體系結構和類似/衍生的體系結構都具有相同的目標 -關注點的分離。他們引入將類似代碼捆綁在一起的層。 “分層”有助於我們在代碼庫中實現重要方面:
乾淨的體系結構通過定義依賴性層次結構來實現這一目標 - 圖層僅取決於下面的層,但不取決於上面的層。
app框架和驅動程序層- 基本上所有Next.js(頁面,服務器操作,組件,樣式等)或任何“消耗”應用程序的邏輯的內容di依賴注入 - 我們設置DI容器和模塊的文件夾drizzle - 所有DB-初始化數據庫客戶端,定義模式,遷移src系統的“根”application -應用程序層- 持有用例和界面,用於存儲庫和服務entities -實體層- 保存模型和自定義錯誤infrastructure -基礎架構層- 持有存儲庫和服務的實現,並從application中提取界面interface-adapters -接口適配器層- 保存控制器,這些控制器是系統的切入點(在框架和驅動程序中用於與系統交互)tests - 單位測試現場 - unit文件夾的結構與src匹配.eslintrc.jsonvitest.config.ts注意@別名的定義方式! User模型,它定義了一個用戶名字段,該字段必須至少為6個字符,而不包括特殊字符。catch來自其他庫(例如毛毛雨)的錯誤,並將這些錯誤轉換為我們自己的錯誤。getTodo , createTodo或updateTodo 。這意味著我們僅在這些類中使用數據庫庫 /驅動程序。他們沒有執行任何數據驗證,只需對數據庫執行查詢和突變,然後投擲我們的自定義定義錯誤或返回結果。di目錄中創建抽象。我們將存儲庫,服務,控制器和用例“綁定”到符號,然後在需要實際實施時使用這些符號“解決”它們。這就是我們可以使用實現的方式,而無需明確依賴它(導入)。 提示
如果您有一個常見問題解答未介紹的問題,請隨時在此存儲庫中打開問題,或者加入我的Discord Server並在那裡開始對話。
是的!您可以將其與頁面路由器,應用程序路由器,中間件,API處理程序,服務器操作等一起使用!通常,使用iNversify.js庫在JavaScript項目中實現依賴項注入,這與節點除外的其他運行時間不兼容。該項目實現了IOCTOPUS,這是一個簡單的IOC容器,不依賴reflect-metadata並在所有運行時起作用。
我說不。如果您正在啟動一個全新的項目,我建議您專注於盡可能快地實現MVP狀態(因此您可以驗證您的想法 /查看項目是否有未來)。當事情開始變得嚴重時(更多功能開始實施,您的用戶群會體驗到顯著的增長,或者您正在登上項目中的其他開發人員),這就是您想花一些時間來調整此體系結構(或任何此事的任何體系結構)。
如果您已經在項目中的雜草深處,那麼您(和您的團隊)可以從下一個衝刺開始逐步進行重構。在這種情況下,您已經編寫了代碼,您只需要對其進行重新組織,然後可以部分地進行該代碼,以路由處理程序進行路由處理程序,通過服務器操作,服務器操作。順便說一句,我說“您只需要重新組織一點” ,但它遠非如此簡單。當您計劃重構時,請務必考慮“出錯”。並花一些時間進行編寫測試!
如果您不花超過3分鐘的時間考慮一下,那麼是的,它看起來確實是過度工程的。但是,如果這樣做,您將意識到架構=學科。該體系結構是開發人員之間的合同,可以定義去哪裡。它實際上簡化了功能開發,因為它使代碼庫可預測,並且為您做出這些決定。
如果每個從事它的開發人員都會在最方便的地方寫代碼,那麼您將無法可持續發展一個項目。代碼庫將變成與之合作的噩夢,這就是您會感到真正複雜的功能開發過程的時候。為了與之抗爭,最終您將放下一些規則。這些規則將隨著您的團隊面對並解決新問題而增長。將所有這些規則放在文檔中,並且有您自己的架構定義。您仍然實現某種建築,您剛剛非常緩慢而痛苦地達到了這一點。
乾淨的體系結構為您提供了經過測試的快捷方式和預定義的體系結構。是的,可以肯定的是,您確實需要學習所有這些,但是您一生都需要一次,然後將以後使用的任何語言或框架應用原則。
不。如果您不希望該項目在功能數量,用戶數量或從事該項目的開發人員數量上都增長。
正如我在Readme頂部提到的原始博客文章中提到的那樣,您得到了: