本文来自 Vue School,这是你学习 vue 很好的站点。原文地址,作者 Daniel Kelly 是 Vue School 的首席讲师,喜欢帮助其他开发人员充分发挥潜力。他拥有 10 多年使用 Vue.js、Nuxt.js 和 Laravel 等技术的开发经验。
如果您感觉翻译侵犯了您的著作权,可以联系我,我会在收到反馈后删除此文。
有一部分链接是原文指向的链接,国内可能无法打开。这个还得您自己想办法喽🧐
领域驱动设计简介 Intro to Domain Driven Design
领域驱动设计是一种基于业务关注点而非代码类型来组织代码库的方法。例如,如果我正在构建一个博客应用程序,我可能会将与用户相关的所有内容归入一个文件夹,与帖子相关的所有内容归入另一个文件夹,与评论相关的所有内容归入另一个文件夹。
相比之下,我把用户组件、帖子组件和评论组件都放在同一个 components
目录中。商店、页面、可组合组件、辅助函数等等也同样如此。
Filip Rakowski 于 2020 年在 Vue School 博客上撰写了一篇关于此主题的精彩文章。然而,当时 Nuxt 3 Layers(以及 Nuxt 3 本身)还不存在。所以,让我们看看使用 Nuxt Layers 进行领域驱动设计是多么简单。
(请注意,在这种情况下,“域名(Domain)”一词与您在域名注册商处注册的 TLD( 如 godaddy.com ) 无关。而是指“逻辑关注点”或业务对象,如帖子、用户、评论等)。
Nuxt Layers
首先,什么是 Nuxt Layers?根据 Nuxt 官网的介绍, Nuxt Layers是“一个强大的系统,允许你扩展默认文件、配置等等”。 本质上,我们可以创建一些“迷你 Nuxt 项目”(Layers),其文件结构类似于 Nuxt 项目的根目录,然后将每个“迷你 Nuxt 项目”与我们的主项目合并。
例如,我可以在我的 Nuxt 项目中创建一个目录 /domains/users
,并将所有与应用程序用户相关的代码存储在那里。在这个目录中,我可以使用我熟悉的目录结构,例如 components
、 composables
、 pages
等。
您还应该在层中提供一个 nuxt.config.ts
文件。如果您只想让 Nuxt 使用其基于文件的魔法来自动加载您的组件等,它可以是一个空的配置。
export default defineNuxtConfig({});
或者,你甚至可以提供通常直接在根 nuxt.config.ts
中设置的设置,它们将被合并到根配置中。如果你需要设置一些特定于当前层域(例如 users
)的 nuxt config 配置,那么这种方法非常有用。例如:
export default defineNuxtConfig({
routeRules: {
// 某些规则仅适用于用户页面
// 或许是 /profiles 重定向到 /users
"/profiles": { redirect: "/users" }
}
});
/domains/users/
的目录结构最终看起来像这样。
/my-nuxt-project
/nuxt.config.ts
/pages
... all the other root nuxt directories 其他所有的 nuxt 文件及文件夹
/domains/users 👈 the juicy stuff!
/components
/composables
/utils
/server
/pages
nuxt.config.ts
最后,为了让我的真实项目知道应该将我的用户层合并到主应用程序代码中,我需要在我的根 nuxt.config.ts
文件中注册该 Layer。
// /nuxt.config.ts
export default defineNuxtConfig({
devtools: { enabled: true },
extends: ["./domains/users"],
});
就这样!现在我所有的用户组件都自动导入了,等等。最重要的是,所有与我的应用程序 users
相关的内容都被组织到了一个地方。
如果您想看一个可能的示例,请查看 StackBlitz 上的这个示例项目。
Nuxt 模块
Nuxt 层功能强大,但与自定义模块结合,可以最大限度地发挥领域驱动设计的优势。例如, 在示例 stackblitz 项目中 ,为了确保路由正确,我们仍然需要在每层的 pages
目录中嵌套 users
和 posts
目录。像这样就有点冗余了:
/domain/users/pages/users
/domain/users/pages/posts
我们不会在这篇短文中尝试编写代码,但这绝对是可行的!如果您希望我们进一步研究,请在 Twitter 上告诉我们,我们会尝试一下 🙂。或者,如果您自己想出了解决方案,我们也很乐意看到!
此外,如果您想了解自定义 Nuxt 模块的所有功能、它们如何促进领域驱动设计以及如何创建自己的自定义模块,请查看我们的课程:Nuxt 模块终极指南。
Domain Driven Design 领域驱动设计
总而言之,领域驱动设计 (DDD) 是组织 Nuxt 代码库的绝佳工具。结合 Nuxt 层和 Nuxt 模块的强大功能,您可以为您的应用构建一个强大且直观的 DDD 系统。
译者结语
你可以在 Vue School 中观看这个课程,前面的 15 节都是免费播出的。
补充的视频可以观看:(YouTube)
文档部分可以去 Nuxt Layers 查看。
评论区
评论加载中...