介绍
当我开始作为软件开发人员的旅程时,我深入研究了软件架构。诸如“Clean Architecture”和“Domain-Driven Design (DDD)”等著名书籍提供了对项目边界和软件层(垂直和水平)等概念的宝贵见解。然而,最缺少的是一种快速有效的工具来执行这些原则。
然后,我发现了 Nx,特别是它的@nx/enforce-module-boundaries
ESLint 插件,它彻底改变了我执行这些边界的方式。
冰山的隐藏面
有趣的是,虽然@nx/enforce-module-boundaries
ELLint 插件嵌入在每个集成的 Nx-Monorepo 的生成代码中,但当谈话转向 Nx 的优点时,它似乎在雷达之下飞行,这些优点确实很多。甚至 Nx 的视频“The Nx Iceberg”也没有提及它,尽管它着重介绍了该工具鲜为人知的功能。
包括 Manfred Steyer、Lars Gyrup Brink Nielsen和我在内的几位作者都深入研究了这个主题。尽管如此,许多使用 Nx 的开发人员并没有尽可能多地利用此功能。这激发了我写这篇文章来强调 Nx 在执行项目边界方面的力量。
什么是项目边界和层?
在我们深入研究强制执行项目边界之前,了解它们是什么至关重要。这些规则或原则决定了我们软件的不同部分如何交互。
例如,软件架构师经常使用洋葱架构和干净架构等哲学来定义水平层。然后使用领域驱动设计中的战略设计等原则将这些层分组为垂直切片或边界。
但是,如果没有自动化工具,维护这些边界就会变得很棘手。开发人员可能会无意中跨越这些边界,从而导致可维护性和可扩展性问题。
使用 Nx 创建项目和边界
首先,在我们开始执行边界限制之前,我们必须有项目和边界。Nx 通过其可快速创建应用程序和库的生成器简化了此过程。这是生成库的简单命令:
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>nx generate @nrwl/js:library feature-booking
</code></span></span>
但是缺少主要成分;Nx 项目标签在这里至关重要。它们充当我们边界的书面定义。例如:
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>// project.json
<span style="color:var(--syntax-text-color)">{</span>
...
<span style="color:var