功能切片设计:最佳前端架构

简介

前端开发人员经常面临与应用程序架构相关的问题。它需要使用一种能够轻松扩展并在应用程序模块之间提供松耦合和高内聚性的架构。

本文讨论功能切片设计架构,在我看来,它是可用选项中最好的。它还探讨了 FSD 的思想以及该架构方法解决的问题。我们将 FSD 与经典和模块化架构进行比较,并检查它们的优缺点。

首先,让我们区分三个概念:层、切片和段。

层、切片、段

层数

层是顶级目录和应用程序分解的第一层。它们的数量有限 - 最多 7 层,并且是标准化的,尽管其中一些是可选的。目前,分为以下几层:

层数
每层都有自己的职责范围,并且以业务为导向。
让我们分别考虑每一层。

  • app:这是应用程序逻辑初始化的地方。提供者、路由器、全局样式、全局类型声明等都在这里定义。它充当应用程序的入口点。

  • 进程:该层处理跨多个页面的进程,例如多步骤注册。该层已被视为已弃用,但仍然偶尔会遇到。它是一个可选层。

  • 页面:该层包括应用程序的页面。

  • 小部件:这些是页面上使用的独立 UI 组件。

  • 特点:这一层处理用户场景和承载业务价值的功能。比如点赞、写评论、给产品评分等。它是一个可选层。

  • 实体:该层代表业务实体。这些实体可以包括用户、评论、评论等。它是一个可选层。

  • 共享:该层包含不依赖于特定业务逻辑的可重用组件和实用程序。它包括UI套件、axios配置、应用程序配置以及不与业务逻辑绑定的helpers等。

这些层有助于组织代码库并促进模块化、可维护和可扩展的架构。

Github 层

特征切片设计的关键特征之一是其层次结构。在此结构中,实体无法使用特征中的功能,因为特征在层次结构中处于较高位置。同样,功能不能使用小部件或进程中的组件,因为上面的层只能使用下面的层。这样做是为了维持仅沿一个方向引导的线性流动。 层在层次结构中的位置越低,对其进行更改的风险就越大,因为它可能会在代码中的更多位置使用。例如,共享层中的 UI-kit 用于功能层、小部件甚至页面层。
层结构

切片

在每一层中,都有子目录 - 切片,应用程序分解的第二层。在切片中,连接的不是抽象的事物,而是具体的业务实体。切片的主要目标是按代码的值对代码进行分组。

切片名称并不标准化,因为它们直接由项目的业务领域决定。例如,在照片库中,可能有照片、相册、图库等部分。社交网络需要像帖子、用户、新闻源这样的切片。

密切相关的片段可以在结构上分组在一个目录中,但它们必须遵守与其他片段相同的隔离规则 - 不应对该目录中的代码进行共享访问。

切片

每个切片由段组成。段有助于根据用途划分切片内的代码。根据团队的协议,段的组成和命名可能会发生变化。以下几段比较常用:

  • api - 必要的服务器请求

  • UI - 切片的 UI 组件

  • 模型 - 业务逻辑,即与状态的交互。例如,操作和选择器

  • lib - 切片内使用的辅助功能

  • config - 切片的必要配置,但config段很少遇到

  • consts - 必要的常量

公共API

每个切片和段都有一个公共 API。公共API由index.js或index.ts文件表示,它允许仅从切片或段中提取必要的功能到外部,并隔离不必要的功能。索引文件充当入口点。

公共 API 规则:

  • 应用程序切片和段仅使用公共 API 索引文件中定义的切片的功能和组件。

  • 公共 API 中未定义的切片或段的内部部分被认为是隔离的,并且仅在切片或段本身内开放供访问。

公共 API 简化了导入和导出的工作,因此在更改应用程序时,无需更改代码中各处的导入。

公共API

更深入地了解如何构建

抽象和业务逻辑

层越高,与特定业务节点的联系越多,包含的业务逻辑也越多。层越低,层中的抽象性、可重用性和缺乏自治性就越多。

层的抽象

FSD如何解决这个问题?

特征切片设计的任务之一是实现松耦合和高内聚。了解 FSD 如何实现这一结果非常重要。

在OOP中,这些问题早已通过多态、封装、继承、抽象等概念来解决。这些概念确保了代码的隔离性、可重用性和多功能性,其中根据组件或功能的使用方式获得不同的结果。

功能切片设计有助于在前端应用这些原则。

抽象和多态性是通过层来实现的。由于较低层是抽象的,因此它们可以在较高层中重用,并且根据条件,组件或功能可以根据指定的参数或属性以不同的方式工作。

封装是通过Public API实现的,将不需要的东西以切片和段的方式与外部隔离。对切片内部段的访问受到限制,并且公共 API 是从切片或段访问功能和组件的唯一方法。

继承也是通过层实现的,因为较高层可以重用较低层。

与经典架构的比较

相信您已经多次接触过经典构建。由于其简单性,大多数作者在教育文章和 YouTube 视频中使用它。古典结构没有具体的标准。但是,经常可以看到以下格式:

经典构建
经典架构有明显的缺点。最大的一个问题是,由于组件之间的隐式连接和模块混乱,项目变得难以维护。随着时间的推移,经典架构的缺点变得更加明显。项目发展的时间越长,应用程序架构就越变得难以理清。

经典架构适用于无需持续维护的小型项目或宠物项目。

功能切片设计凭借其概念和标准,可以防止经典架构的问题。然而,使用 FSD 的开发人员的理解和技能水平应该比使用经典架构时更高。通常,经验不足 2 年的开发人员没有听说过 FSD。
然而,在使用功能切片设计时,需要“现在”而不是“以后”解决问题。代码中的问题和与概念的偏差立即变得显而易见

与简单模块化架构的比较

简单的模块化架构有几个缺点:

  • 有时不清楚将功能放入模块或组件的何处。

  • 在另一个模块中使用模块时遇到困难。

  • 存储业务实体的问题。

  • 全局函数中的隐式依赖关系,导致结构错综复杂。

似乎在任何复杂或中等复杂的项目中,功能切片设计应该优先于简单的模块化架构。FSD 解决了许多基本的架构问题,并且几乎没有缺点。

在简单性和开发速度方面,简单的模块化架构可能比 FSD 有优势。如果需要 MVP 或正在开发一个短期项目,简单的模块化架构可能比 FSD 更合适。但在任何其他情况下,功能切片设计看起来更可取。

Next.js 和 FSD 之间的冲突

最近,将 Next.js 与功能切片设计结合使用的趋势越来越明显。Next.js 与 FSD 配合良好,但在两个方面存在冲突:页面中的文件路由和缺少应用程序。

页数

对于 Next.js 来说,pages 是一个带有文件路由的目录,其中每个组件代表一个路由。对于 FSD,页面是具有平面页面列表的层。这就产生了一个冲突:如何将 Next.js 页面与 FSD 页面结合起来。

当 Next.js 和 FSD 一起使用时,您可以将 Next.js 页面存储在应用程序的根目录中:[root]/pages/,并将 FSD 页面存储在 src 文件夹中:[root]/src/pages/。

解决冲突的另一个解决方案是维护两个目录:来自 FSD 的重命名的平面页面列表(例如 Pages-Flat)和 Next.js 中的嵌套路由 - Pages。页面代码存储在pages-flat中并导出到pages。

您可以使用任何一种方法,但我更喜欢第一种。

应用程序

Next.js 处理应用层的所有基本功能。但是,如果您仍然需要独立于页面为整个应用程序运行某些内容,则可以使用布局模式为整个应用程序创建布局。

关于布局模式的 Next.js 文档:路由:页面和布局 | Next.js(https://nextjs.org/docs/pages/building-your-application/routing/pages-and-layouts#layout-pattern)

特征切片设计的潜力

FSD 是一种年轻的建筑方法论。然而,它已经被许多银行、金融科技、B2B、电子商务公司等所使用。以下是包含公司列表的 Github 问题的链接:Github Issue(https://github.com/feature-sliced/documentation/issues/131)。

截至本文发布时,包含 FSD 官方文档的 Github 存储库已获得 858 颗星。该文档正在积极扩展,FSD 开发团队以及 Telegram 和 Discord 社区可以 24/7 全天候帮助人们解决与架构相关的问题。

这种架构的潜力受到高度重视,并且在全球大公司中广泛使用。如果采用得当,FSD 有潜力成为前端开发领域的主导架构解决方案。

架构的优点和缺点

优点

  • 架构组件可以轻松替换、添加或删除

  • 架构标准化

  • 可扩展性

  • 方法论独立于开发堆栈

  • 模块之间受控且显式的连接,不会产生意外的副作用

  • 面向业务的架构方法论

缺点

  • 与许多其他建筑解决方案相比,进入门槛更高

  • 需要意识、团队文化和对理念的坚持

  • 挑战和问题需要立即解决,而不是稍后解决。代码问题和概念偏差立即可见。不过,这也可以看作是一个优点

总结

功能切片设计是前端开发人员应该了解并能够使用的一个有趣且有价值的发现。FSD 可以为团队提供灵活、标准化、可扩展的架构和开发文化。然而,利用该方法的积极方面需要团队内的知识、意识和纪律。

FSD 因其清晰的业务导向、实体定义、应用程序的功能和组件组成而在其他架构中脱颖而出。

您还可以独立探索项目中 FSD 使用示例和官方功能切片设计文档:

  • 文档(https://feature-sliced.design/)

  • 示例。Github 客户端(https://github.com/ani-team/github-client)

  • 示例。耐克运动鞋和鞋类商店(https://github.com/noveogroup-amorgunov/nukeapp)

  • 示例。数独(https://github.com/Shiyan7/sudoku-effector)

这篇文章可能会很长,但我希望你学到了一些新东西。感谢您阅读完这篇文章。❤️


文章来源地址https://www.toymoban.com/diary/web/398.html

到此这篇关于功能切片设计:最佳前端架构的文章就介绍到这了,更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

原文地址:https://www.toymoban.com/diary/web/398.html

如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用
44个常见的React前端面试问题
上一篇 2023年10月15日 13:02
如何使用纯 HTML、CSS 和 JavaScript 实现分页
下一篇 2023年10月15日 14:11

相关文章

  • 【前端工程化面试题】使用 webpack 来优化前端性能/ webpack的功能

    这个题目实际上就是来回答 webpack 是干啥的,你对webpack的理解,都是一个问题。 (1)对 webpack 的理解 webpack 为啥提出 + webpack 是啥 + webpack 的主要功能 前端开发通常是基于模块化的,为了提高开发效率,webpack 是一个基于模块的构建工具,是一个用于 js 应用程序的静态模块

    2024年02月20日
    浏览(57)
  • Vue应用多语言支持工程化最佳实践

    VoerkaI18n是一款非常优秀的 全新的开源国际化多语言解决方案 ,主要特性包括: 全面工程化解决方案,提供初始化、提取文本、自动翻译、编译等工具链支持。 符合直觉,不需要手动定义文本Key映射。 强大的插值变量格式化器机制,可以扩展出强大的多语言特性。 支持 b

    2024年02月03日
    浏览(47)
  • 技术应用:Docker安全性的最佳实验|聊聊工程化Docker

    🔥 技术相关:《技术应用》 ⛺️ I Love you, like a fire! 不可否认,能生存在互联网上的软件都是相互关联的,当我们开发一款应用程序时,它必须与其他的服务进行通信,无论是在你的基础设施,还是云服务,亦或是第三方应用程序上。当然,你不希望你不认识的人伪装成你

    2024年02月13日
    浏览(36)
  • 前端工程化详解——理解与实践前端工程化

    前言: 前端工程化一直是一个老生常谈的问题,不管是面试还是我们在公司做基建都会经常提到前端工程化,那么为什么经常会说到前端工程化,并没有听过后端工程化、Java工程化或者Python工程化呢?我们理解的前端工程化是不是一直都是Webpack的性能调优,或者是一个cli工

    2024年02月02日
    浏览(81)
  • 前端工程化相关

    知道软件包名,拿到源码或者路径的方法 在浏览器输入以下内容,就可以找到你想要的。。。 unpkg.com/输入包名 ESM特性清单: 自动采取严格模式,忽略“use strict” 每个ESM模块都是单独的私有作用域; ESM是通过CORS去请求外部JS模块的 ESM的script标签会延迟执行脚本,就要有

    2024年01月17日
    浏览(108)
  • 什么是前端工程化?

    前端工程化是一种思想,而不是某种技术。主要目的是为了提高效率和降低成本,也就是说在开发的过程中可以提高开发效率,减少不必要的重复性工作等。 tip 现实生活举例 建房子谁不会呢?请几个工人一上来就开始弄,在建筑的过程中缺了材料就叫个工人去买,发现工期

    2024年02月15日
    浏览(84)
  • 前端工程化

    手把手带你走进Babel的编译世界 - 掘金 (juejin.cn) 我们所写的代码转换为机器能识别的一种 树形结构, 本身是由一堆节点(Node)组成,每个节点都表示源代码中的一种结构。 不同结构用类型(Type)来区分,常见的节点类型有Identifier(标识符),Expression(表达式),VariableDeclarat

    2023年04月11日
    浏览(100)
  • 前端工程化-NPM

    NPM代表npmjs.org这个网站,这个站点存储了很多Node.js的第三方功能包。 NPM的全称是Node Package Manager,它是一个Node.js包管理和分发工具,已经成为非官方的发布Node模块(包)的标准。它可以让JavaScript开发者能够更加轻松地共享代码和共用代码片段,并且通过NPM管理需要分享的代

    2024年02月09日
    浏览(101)
  • 前端工程化-VUE

    高效的开发离不开基础工程的搭建。本章主要介绍如何使用Vue进行实际SPA项目的开发,这里使用的是目前热门的JavaScript应用程序模块打包工具Webpack,进行模块化开发、代码编译和打包。 Vue脚手架指的是Vue-cli,它是一个专门为单页面应用快速搭建繁杂程序的脚手架,它可以轻

    2024年02月08日
    浏览(78)
  • 前端工程化与webpack

    能够说出什么是前端工程化 能够说出webpack的作用 能够掌握webpack的基本使用 了解常用plugin的基本使用 了解常用loader的基本使用 能够说出Source Map的作用 前端工程化 webpack的基本使用 webpack中的插件 webpack中的loader 打包发布 Source Map 1.1小白眼中的前端开发vs实际的前端开发 实际

    2024年02月13日
    浏览(79)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包