此存储库是如何在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.json eslint-plugin-boundariesvitest.config.ts注意@别名的定义方式! User模型,它定义了一个用户名字段,该字段必须至少为6个字符,而不包括特殊字符。catch来自其他库(例如毛毛雨)的错误,并将这些错误转换为我们自己的错误。getTodo , createTodo或updateTodo 。这意味着我们仅在这些类中使用数据库库 /驱动程序。他们没有执行任何数据验证,只需对数据库执行查询和突变,然后投掷我们的自定义定义错误或返回结果。di目录中创建抽象。我们将存储库,服务,控制器和用例“绑定”到符号,然后在需要实际实施时使用这些符号“解决”它们。这就是我们可以使用实现的方式,而无需明确依赖它(导入)。 提示
如果您有一个常见问题解答未介绍的问题,请随时在此存储库中打开问题,或者加入我的Discord Server并在那里开始对话。
是的!您可以将其与页面路由器,应用程序路由器,中间件,API处理程序,服务器操作等一起使用!通常,使用iNversify.js库在JavaScript项目中实现依赖项注入,这与节点除外的其他运行时间不兼容。该项目实现了IOCTOPUS,这是一个简单的IOC容器,不依赖reflect-metadata并在所有运行时起作用。
我说不。如果您正在启动一个全新的项目,我建议您专注于尽可能快地实现MVP状态(因此您可以验证您的想法 /查看项目是否有未来)。当事情开始变得严重时(更多功能开始实施,您的用户群会体验到显着的增长,或者您正在登上项目中的其他开发人员),这就是您想花一些时间来调整此体系结构(或任何此事的任何体系结构)。
如果您已经在项目中的杂草深处,那么您(和您的团队)可以从下一个冲刺开始逐步进行重构。在这种情况下,您已经编写了代码,您只需要对其进行重新组织,然后可以部分地进行该代码,以路由处理程序进行路由处理程序,通过服务器操作,服务器操作。顺便说一句,我说“您只需要重新组织一点” ,但它远非如此简单。当您计划重构时,请务必考虑“出错”。并花一些时间进行编写测试!
如果您不花超过3分钟的时间考虑一下,那么是的,它看起来确实是过度工程的。但是,如果这样做,您将意识到架构=学科。该体系结构是开发人员之间的合同,可以定义去哪里。它实际上简化了功能开发,因为它使代码库可预测,并且为您做出这些决定。
如果每个从事它的开发人员都会在最方便的地方写代码,那么您将无法可持续发展一个项目。代码库将变成与之合作的噩梦,这就是您会感到真正复杂的功能开发过程的时候。为了与之抗争,最终您将放下一些规则。这些规则将随着您的团队面对并解决新问题而增长。将所有这些规则放在文档中,并且有您自己的架构定义。您仍然实现某种建筑,您刚刚非常缓慢而痛苦地达到了这一点。
干净的体系结构为您提供了经过测试的快捷方式和预定义的体系结构。是的,可以肯定的是,您确实需要学习所有这些,但是您一生都需要一次,然后将以后使用的任何语言或框架应用原则。
不。如果您不希望该项目在功能数量,用户数量或从事该项目的开发人员数量上都增长。
正如我在Readme顶部提到的原始博客文章中提到的那样,您得到了: