数栈技术分享:利用 Atomic 构建 React 项目工作流,so easy!
数栈是云原生—站式数据中台PaaS,我们在github和gitee上有一个有趣的开源项目:FlinkX,FlinkX是一个基于Flink的批流统一的数据同步工具,既可以采集静态的数据,也可以采集实时变化的数据,是全域、异构、批流一体的数据同步引擎。大家喜欢的话请给我们点个star!star!star!
github开源项目:https://github.com/DTStack/flinkx
gitee开源项目:https://gitee.com/dtstack_dev_0/flinkx
用过 React 的朋友都知道,React 项目文件夹的划分是有很多种的,在 React 官方关于文件结构这个部分给出了一些社区比较常见的构建方式的示例。例如有通过features或者routes进行分组的,也有通过模块类型(type) 划分的。在文档提到了一种针对components 进行细化组织的方法 —— Atomic Design。如果还没了解过这个设计方法的朋友,不妨来看一看。
一、什么是Atomic
Atomic 是一套指导设计前端组件(Components)架构的方法。在我们的日常工作中,如何更好的划分和管理前端组件常常会是我们碰到的问题。Atomic 通过一系列设计思想和原则,可以很好指导我们的项目架构。用 Atomic 作者自己的话说,这套设计方法的灵感是来自于自己曾经学习过的化学课,以及对自然知识本身的思考。作者通过原子(Atoms)、分子(Molecules)、 有机体(Organisms)、模板(Templates), 页面(Pages) 这5种基本类型组件,通过灵活的组合,从而来满足我们日常的页面开发需求。

1、原子(Atoms)
正如化学知识中所表述的,原子(Atoms)是元素能保持其化学性质的最小单位,所以正好利用原子的概念,可以用来组件系统中的最小单位的组件,或者说抽象到最小粒度的组件,即我们在 HTML 中常见的一些基本元素,例如:按钮(buttons),表单标签(labels),输入控件(input)等等。既然是最小单位,Atom 类型的组件显然是无法再进行任何拆分了,如果能继续拆分,那么该组件应该被划分为分子组件(Molecules)。
2、分子(Molecules)
我们都知道,在化学概念中,分子是有若干原子组成。通过组合各种原子组件,我们可以轻易的可以组合出某种功能的分子组件。例如通过组合 input 控件和 button 组件,我们可以得到一个搜索(Search)分子组件,通过组合 button 和 a 标签,可以可以组合分页(Pagination)组件。
3、有机体(Organisms)
仅靠分子组件和分子组件的抽象,仍然是不能满足我们实际工作中对组件复用的需求,例如我们我们大部分项目中都有导航栏(Navigation Bar)、页头(Header)、页脚(Footer)、边栏(Sidebar)、列表(List) 等等组件,显然可以根据需要可以抽象成独立组件,以便后来的项目可以直接使用。可以看到的是,在有原子和分子组件的情况下,我们通过灵活组合这些原子、分子组件的方式,便可轻易达到我们的需求。而通过这类方式组合的组件类型我们便称之为有机体组件(Organisms)。

4、模板(Templates)
到这里,模板层就很好理解了。很显然,模板层是原子、分子、有机组件的结合体。例如包含头部(Header、Content、Footer)常见部分的首页模板、又或者各种左右上下布局模板组件等等。
5、页面(Pages)
页面这一层可能是复用率最低的一层了,因为业务需求大部分时候各不相同的,当然也不排除有复用页面的情况。页面组件自然就是个包含了其他四种组件类型的综合体了。有了前几层组件的抽象,可以轻松的应对各种业务页面,并且不断地可以丰富新组件到各类型自己中去,以便后面的项目中持续使用。
综合看下来,通过这5种组件的划分,就可以很好的满足我们实际项目中对页面组件进行划分和管理了。
二、Atomic实践
根据 Atomic 的思路, 以 src 目录为基础,在 React 项目中,我可以得到了类似如下的开发目录:
当然,像我通常喜欢把 pages 的层级提高,也就是把他与 components 同层,也就是:
这里有个仓库 Demo 可以参考:
https://github.com/wewoor/atomic-example
三、总结
在实际工作中,往往我们会引用第三方的组件库,所以很多粒度组件都不需要我们编写,或者说需要我们独立编写的只有很少一部分,那么可以根据自己的实际状况来适当的缩减目录结构,包括目录名称,在跟项目成员沟通达成一致的情况下,也可以用其他的命名规则。如果你正在设计一个完整的 UI 组件系统的话,或者你在开发一个大型的Web系统,那么更详细的划分规则可能会更有利于后期的维护和开发了。
Atomic 始终是一套设计思想,在实践中我们可以更灵活的根据自己业务,团队的情况进行合适的调整,从而更好的满足我们的开发需求。
更详细内请看Atomic Design:
http://atomicdesign.bradfrost.com/table-of-contents
数栈技术分享:利用 Atomic 构建 React 项目工作流,so easy!的更多相关文章
- 技本功丨利用 Atomic 构建 React 项目工作流,so easy!
近日刷微博,#2018年结婚率创新低#荣登热门话题NO.1,沪浙最不积极. 生活压力越大,缺爱的人也越来越多...据本萌的不完全观察,程序猿虽然是压力加成的职业,在袋鼠云还是有不少早早脱了单.至于,脱 ...
- 简述--构建React项目的几种方式
前言: 构建React项目的几种方式: 构建:create-react-app 快速脚手架 构建:generator-react-webpack 构建:webpack一步一步构建 1)构建:creat ...
- webpack构建react项目(一)
前言 下面是我们使用到技术栈: webpack + react + redux + react-router + react-thunk + ES6 + .... 注意事项: 建议使用npm5.X 或 ...
- 使用 Dawn 构建 React 项目
开发一个 React 项目,通常避免不了要去配置 Webpack 和 babel 之类,以支持 commonjs 或 es 模块及各种 es 新语法,及及进行 jsx 语法的转义.当然也可以用 cre ...
- [react001] 使用webpack自动构建react 项目
1.react 简介 React 是一个Facebook出品的前端UI开发框架.react官方的tutorials 为了让人容易上手,并没有给在平常工作使用react的详细配置,随意学习的深入,你为了 ...
- 使用create-react-app+react-router-dom+axios+antd+react-redux构建react项目
1.安装.构建 # 全局安装 npm install -g create-react-app # 构建一个my-app的项目 npx create-react-app my-app cd my-app ...
- [技术分享]利用MSBuild制作msf免杀的后门
文章github上有公开现成的shellcode,这就是shellcode 我这次选择了32位的那个版本来进行演示 需要改写的是shellcode那部分: 选择CobaltStrike:payload ...
- react-create-app 构建react项目的流程以及需要注意的地方
Hello 小伙伴们,如果觉得本文还不错,记得给个 star , 小伙伴们的 star 是我持续更新的动力!GitHub 地址 React 系列文章代码地址 一 目录 不折腾的前端,和咸鱼有什么区别 ...
- 利用webpack构建vue项目
快速搭建vue项目 一,确认自己有无搭建好node以及npm环境,这些是前提,具体安装方法可参考https://nodejs.org/en/. 二,开始构建项目. 第1步:新建一个文件夹,随意命名. ...
- 利用Eclipse构建SpringMVC项目
简述 SpringBoot对Spring的的使用做了全面的封装,使用SpringBoot大大加快了开发进程,但是如果不了解Spring的特性,使用SpringBoot时会有不少问题 目前网上流传使用I ...
随机推荐
- 关于IPMP
国际项目经理资质认证(International Project Manager Professional,简称IPMP)是国际项目管理协会(International Project Managem ...
- BUUCTF---异性相吸(欠编码)
1.题目 ܟࠄቕ̐员䭜塊噓䑒̈́ɘ䘆呇Ֆ䝗䐒嵊ᐛ asadsasdasdasdasdasdasdasdasdasdqwesqf 2.知识 3.解题 很奇怪,不知道什么加密,借鉴网上参考,得知需将其转化为 ...
- 【Git】在 Idea 中使用 Git
在 Idea 中使用 Git 1 安装 Git 核心程序 根据自己的电脑操作系统从 Git 官网 https://git-scm.com/ 下载对应的 Git 核心程序. 以 git-2.21.0 为 ...
- Go 中 JSON 的序列化和反序列化
golang中对json的序列化/反序列化操作还是比较容易的, 序列化操作主要是通过encoding/json包的Marshal()方法来实现, 反序列化操作主要是通过encoding/json包的U ...
- 🎀杜伽Durgod K610W蓝牙连接问题解决
简介 杜伽Durgod K610W键盘支持三模连接,在配对成功蓝牙后切换连接通道后,再次连接蓝牙通道时无法正常自动连接已配对的蓝牙,需取消配对再重新配对后才能正常连接.这种问题可以通过升级键盘固件解决 ...
- 题解:UVA12517 Digit Sum
数位 dp 模板题-- 题目大意 给你两个数 l,rl,rl,r,求出 l,rl,rl,r 之间所有数的数位和. 什么是数位和? 举个栗子,有一个数 123123123,那么他的数位和,即各个数位的和 ...
- 基于Blazor实现的运输信息管理系统
运输信息管理系统(TIMS)是一个集手机端和PC端协同工作的小型运输服务公司的信息化系统,采用Blazor框架的Auto模式进行开发. 1. 项目背景 目前司机运输任务完成后,在微信工作群中上报运输任 ...
- [VulnHub]DC-1靶场全过程
DC-1 借鉴我们OnePanda-Sec团队的文章 https://mp.weixin.qq.com/s/BbPkmDiZ-cRleiCqmj114w 靶场搭建 先导入DC-1靶场,并将连接改为NA ...
- .NET 原生驾驭 AI 新基建实战系列(五):Milvus ── 大规模 AI 应用的向量数据库首选
1. 引言 Milvus 是一个强大的工具,帮助开发者处理大规模向量数据,尤其是在人工智能和机器学习领域.它可以高效地存储和检索高维向量数据,适合需要快速相似性搜索的场景.在 .NET 环境中,开发者 ...
- Java Collection集合的基本操作
目录 Collection接口常用方法 存放String类型 存放自建对象 Collection和Collections的区别 Collection接口常用方法 int size();//集合大小 b ...