快手、孩子王、华为等专家分享大模型在电商运营、母婴消费、翻译等行业场景的实际应用 了解详情
写点什么

Nuxt Apps 中的领域驱动设计实践

  • 2020-12-08
  • 本文字数:2479 字

    阅读完需:约 8 分钟

Nuxt Apps中的领域驱动设计实践

我在Vue StorefrontVue Storefront Next中实验 Vue apps 的领域驱动方法有一段时间了。使用这种方法能显著改善你的代码库的可维护性和复杂度。在这个系列,我想分享一些在 Vue Storefront 中对我们有效,且容易应用到任何 Vue 应用程序中的模式。


我将展示如何在 Nuxt 和“普通”Vue 项目中如何应用这些模式。本文中,我们将聚焦理论和 Nuxt 实现。


什么是领域驱动设计?


领域驱动设计(Domain-Driven Design,DDD)概念是,将业务概念优先于代码库的其它分类类型(例如,按文件类型分组)。这意味着,你应该基于你主要的业务领域(“问题”)及其子领域(问题的细分部分)来组织你的代码。例如,在电子商务领域,我们有产品目录、客户、订单、库存等子领域。


虽然 DDD 概念来自面向对象编程,依赖于类及其关系,但其核心理念可以很容易地应用到其它范式。


为什么领域驱动设计很棒?


领域驱动设计越来越受欢迎最简单的解释是,它是一种非常简单的模式,在大多数情况下,它都会在编程最困难和最痛苦的领域之一——代码维护性上带来显著改善。


我记得,我在思考组织代码库的最佳方式时度过的无眠之夜和漫长的淋浴。如果你曾经尝试过,你就会明白这项任务非常困难,而且结果永远不会完美,因为你必须考虑到你的项目在将来可能演变的所有可能的方式。随着时间的推移,我们对试图解决问题的理解不断增长,这会带来更有效的解决问题的方法,从而改变我们最初的方案。


我们都经历过并且知道,改变最初的架构会付出多大的成本。


这就是领域驱动设计的亮点。基于业务需求对系统进行建模要容易得多,因为这个方案不受技术限制和困难的影响。我们改变核心业务需求的频率比改变底层技术的频率要少得多。


此外,领域驱动设计推崇在编写代码时考虑实际的业务需求,这意味着我们根据业务功能(例如客户)而不是技术术语(组件、存储、服务),来组织我们的代码和文件结构。这种管理代码的方式让代码更容易维护。


下图显示了一个“标准的”Vue 文件结构 vs 基于业务领域的文件结构:




如果与某个功能相关的所有东西都放在一个地方,就会很容易理解它是如何工作的,因为不存在忽略某些部分的风险。完全删除某个功能也同样非常简单,因为这个功能相关的代码不会分布在整个代码库中。


另一个好处是,我们只需查看应用程序的文件夹结构,就能很容易地推断出其业务和功能。这也很容易找到一个开始上手的地方,因为我们的任务大部分时候是用业务语言编写的。我能够给出很多其它例子,但是我确信你已经明白为什么这个方案现在被认为是更容易维护的了。


领域驱动设计和根据功能组织代码的最大好处之一,就是限制了不同模块之间的关联数量。通常,我们在应用程序中有一组扩展点被所有模块使用。理想情况下,所有的连接都应该通过一个单独的地方进行,例如一个共享模块或事件总线。使用这种方法更容易维护这些模块,因为连接不同功能的部分通常是导致应用程序复杂性增加最多的地方。如果我们设法避免不必要的复杂性并简化连接,那么让你的代码库保持简单也就非常容易了。


弄清楚如何使你的模块独立并封装,是另外一篇文章(或者是一系列文章)的主题,因此现在如果你想要深入了解这一点,我建议你阅读hexagonal architecture,并应用这种方法中的大部分有用的理念。


那么,我们该如何在 Vue 中应用领域驱动设计理念呢?


Nuxt 中的领域驱动设计


我们从 Nuxt 开始介绍,它有了一个很好的内置机制,使得应用这个理念非常容易——模块。


Nuxt 模块通常用于在你的应用程序中包含第三方功能,例如授权或 i18n。虽然编写第三方代码是最常用的利用它们的方法,但是 Nuxt 模块也可以很好地在我们的内部架构中发挥作用。


因为 Nuxt 模块可以挂接到应用程序的不同部分,例如路由或 Vuex store,所以我们能很容易地使它成为一个特定子领域与我们的应用程序连接的唯一地方!


看看这个简单的 Nuxt 模块:

// index.jsmodule.exports = function ProductCatalogModule (moduleOptions) {  this.extendRoutes((routes) => {    routes.unshift({      name: 'product',      path: '/p/:slug/',      component: path.resolve(themeDir, 'pages/Product.vue')    });  );  // we can't register stores through Nuxt modules so we have to make a plugin  this.addPlugin(path.resolve(__dirname, 'plugins/add-stores.js'))}
复制代码


// plugins/add-stores.jsimport CategoryStore from '../stores/category.js'import ProductStore from '../stores/product.js'
export default async ({ store }) => { store.registerModule(CategoryStore) store.registerModule(ProductStore)};
复制代码


…有如下文件:


.├── pages|   |── Category.vue │   └── Product.vue├── components|   |── ProductTile.vue│   └── ProductGallery.vue├── plugins│   └── add-stores.js├── store|   |── category.js│   └── product.js└── index.js
复制代码

我们这里就是一个小的 Nuxt.js 应用程序,专注于我们的应用程序的某一个子领域。现在,当我们想要在应用程序中包含所有目录相关的功能时,我们只需要一行代码就可以做到这一点!


// nuxt.config.jsexport default {  modules: [    '~/modules/product-catalog/index.js',  ]}
复制代码


现在,每当我们在 Jira 中看到产品目录相关的问题时,我们就会立即知道从哪里开始改。而且,使用这种模块化方案,新来的人也能很快知道我们应用程序中有什么功能,因此可以更快地理解业务和技术背景!


.├── pages│   └── index.vue├── modules|   |── product-catalog|   |── orders|   |── payment|   |── shipping|   |── inventory│   └── customers└── index.js
复制代码


总结与展望


基于业务领域及其子领域来组织代码,是使应用程序更易于维护的最简单有效的方法之一。尽管还有一些已知的挑战,例如不同模块之间的通信,了解基础知识就足以为代码库带来巨大的好处。应用本文中的模式不需要高级编程技巧,这让所有层次的开发人员都可以使用它。


原文链接:


https://vueschool.io/articles/vuejs-tutorials/domain-driven-design-in-nuxt-apps/

2020-12-08 14:511596
用户头像

发布了 165 篇内容, 共 75.2 次阅读, 收获喜欢 343 次。

关注

评论

发布
暂无评论
发现更多内容

逻辑漏洞挖掘之XSS漏洞原理分析及实战演练 | 京东物流技术团队

京东科技开发者

信息安全 漏洞分析 xss攻击 逻辑漏洞 企业号9月PK榜

创新传媒行业的未来发展

百度开发者中心

#人工智能 生成式AI 千帆大模型平台

VUE模块化开发是如何实现的?

FN0

Vue

赋能企业:释放加密货币代币开发的潜力

区块链软件开发推广运营

数字藏品开发 dapp开发 区块链开发 链游开发 NFT开发

什么是IoT数字孪生?

3D建模设计

IoT 数字孪生

探析ElasticSearch Kibana在测试工作中的实践应用 | 京东物流技术团队

京东科技开发者

测试 Kibana ES 企业号9月PK榜

覆盖8大领域,云投集团财务数智化管理平台全面上线!

用友BIP

财务数智化

HTTP代理IP在什么情况下会请求超时?

巨量HTTP

代理IP http代理

直击火山引擎V-Tech峰会!仅需简单登录,即可极速体验数据引擎ByteHouse

字节跳动数据平台

数据库 大数据 云原生 数仓 企业号9月PK榜

Appilot发布:打造面向DevOps场景的开源AI助手

SEAL安全

AI DevOps 企业号9月PK榜 Appilot

PopClip for Mac(剪切板复制粘贴工具) v2023.9中文激活版

mac

苹果mac Windows软件 PopClip 文本操作工具

专家观点∣基于数据驱动的设备预测性维护

用友BIP

数据驱动 设备维护

GLTF编辑器如何快速重置模型原点

3D建模设计

编辑器 GLTF 模型原点

鞍钢集团∣共和国钢铁工业长子的财务转型之路

用友BIP

财务数智化

功能强大的 PostgreSQL 没有 MySQL 流行的 10 个原因

NineData

MySQL postgresql 架构 品牌

权威认证!用友再获全球企业级应用软件市场10强

用友BIP

企业级应用软件

平台运营,让数智底座更安全更稳定更高效

用友BIP

数智底座 2023全球商业创新大会

后端开发需要安装哪些软件/插件?

小齐写代码

当敏捷开发遇上固定交付……

敏捷开发

项目管理 敏捷开发 Scrum Master 固定交付

GLTF编辑器如何合并相同材质的Mesh

3D建模设计

编辑器 GLTF 模型材质合批

苹果电脑效率提升:Alfred 5 for Mac直装版 附Alfred5汉化包 支持M1

南屿

Alfred 5 Mac Alfred 5破解版 Mac效率办公软件

Affinity Photo 2 for Mac(专业修图软件) 2.2.0永久激活版

mac

修图软件 苹果mac Windows软件 Affinity Photo

Studio One 6 Pro永久许可证 附Studio One for Mac安装教程

南屿

Studio One 许可证 音乐制作软件 Studio One 6下载 Studio One 6破解

末流院校24届秋招逆袭之路!

王磊

Java java面试

别再纠结线程池池大小、线程数量了,哪有什么固定公式 | 京东云技术团队

京东科技开发者

cpu 线程池 企业号9月PK榜

M3E/OpenAi+vearch内容查重实践 | 京东云技术团队

京东科技开发者

数据库 openai 企业号9月PK榜 内容查重 vearch

2023-09-20:用go语言,保证一定是n*n的正方形,实现从里到外转圈打印的功能 如果n是奇数,中心点唯一,比如 a b c d e f g h i e是中心点,依次打印 : e f i h g

福大大架构师每日一题

福大大架构师每日一题

Nuxt Apps中的领域驱动设计实践_文化 & 方法_Filip Rakowski_InfoQ精选文章