前端顶层设计V2.0

前端顶层设计v1.0:https://www.yuque.com/docs/share/ba2b8dc3-1e11-42bf-b725-7b8b16fd6e72?#

github地址:https://github.com/dyk98/std-react-typescripts

与v1.0前端设计区别:

1.根据现实情况使用反馈,将文件目录结构更加合理化

2.使用IOC框架inversify.js,定义新的编写规范,通过DI将状态注入页面实现解耦合

3.状态与函数使用明确的访问修饰符

0.前言

本次设计的目标是以设计来实现对最佳目标值的预控👍,能通过规范设计编写出高维护性,高可读性,易拓展的前端代码。

本次设计使用DDD的思想进行代码的分层处理,使用IOC的思想进行各层级间代码的编写、调用和组合。

以下将从,“已有问题阐述”“顶层设计的意义””代码分层介绍““设计核心点””前端目录架构““开发注意事项”“特殊问题处理”几个标题出发阐述本次的顶层设计。

1.已有问题阐述

(1) 不同的人有着不同的写法,不同的命名习惯,不同的文件结构,常常导致协同开发难度加大。

(2) 当项目需要旁人接手✋的时候,新开发需要花费大量时间去理解原项目的目录结构,文件结构,以及出现很多不明所以的函数名和变量名。

(3) 样式层冗杂大量逻辑代码,导致各个项目组件无法复用(复用需要删除大量耦合逻辑使组件恢复原始的样子)

(4) 文件引用混乱,引用部分代码混乱难看,要移动一个文件或者删除一个文件难以进行

(5) 状态没有数据结构,无法使用ts的类型结构检查,使用相同数据结构的多个状态每个都需要单独定义结构编写重复代码。

(6) 状态与样式之间耦合严重,复用性与可维护性极差

2.顶层设计的意义

顶层设计是运用系统论的方法,从全局的角度,对某项任务或者某个项目的各方面、各层次、各要素统筹规划,以集中有效资源,高效快捷地实现目标。

所有事情都需要进行顶层设计,只是顶层设计的或多或少。举个🌰子,当你去旅游的时候很难想象你不做旅行计划,☝️一个毫无计划的旅行必然是杂乱无章的,而旅行计划也是顶层设计,例如有些人很穷所以他们选择穷游,那旅游过程中的节俭就是这个顶层设计的核心点之一。有些人时间很少却想逛很多的景点,那高效就是这个顶层设计的核心点之一,之后依照这些核心点来制定相应的旅游计划。

在编写的过程中以一个或多个编写的核心点为主导,以编写的架构为基础来制定相应的编写计划,进行高维护性,高可读性,易拓展的前端代码编写。

3.代码分层介绍

使用IoC的思想从大体上将代码分为三大层:数据逻辑层,组件样式层,组合容器层,其中组合容器层即为IoC容器,将数据逻辑与组件样式进行控制反转以达到解耦。通常当组件需要数据时,需要从数据层取出数据,导致组件与数据高度耦合。通过DI的方式将数据和数据逻辑注入进IoC容器进行并传递给组件样式,使组件样式的主动取数据逻辑变成被动拿,数据和逻辑与样式之间完全解耦。📎前端顶层设计.sketch

数据逻辑层:该层的主要功能是涵盖整个系统中数据状态从存放以及管理相关数据逻辑的编写(例如:调取接口获取数据,调取接口传递数据,定义数据结构,传递数据至其他层以供使用等)。

组件样式层:该层的主要功能是编写整个系统中的样式组件,并包含一些组件的私有数据及私有数据的逻辑。通过props接受数据并进行相应的展示,也通过props接受一些函数,在用户触发某些组件内的事件时调用(例如点击登录按钮调用props传递过来的登录相关逻辑函数)。

组合容器层:该层的主要功能是作为数据逻辑层与组件样式层的中间层进行调度管理,以合理的形式放置组件样式,并合理的将组件样式层所需的数据及相关逻辑操作从数据逻辑层取出进行传递。

细致分层结构:📎目录架构.sketch

pages(页面层)属于组合容器层

项目页面文件,引入component组成页面,引用store.config用DI的方式将store中的数据和方法注入,通过props传递给component。

components(私有页面组件层)属于组件样式层

非常用页面组件,仅需要被使用于某个页面,不需要与其他页面共享,内部存在仅需要自己维护和使用的状态使用state。

commonComponents(公共页面组件层)属于组件样式层

常用页面组件,被需要用于多个页面,内部存在仅需要自己维护和使用的状态使用state。

abstract class(页面数据接口层)属于数据逻辑层

定义页面数据的虚拟类,定义数据及数据逻辑操作的interface,并定义页面数据结构,仅需要被使用于某个页面,不需要与其他页面共享。

stores(页面数据层)属于数据逻辑层

继承页面数据的虚拟类,并进行实现。存放页面所需要的数据并维护,及与数据相关的操作函数(例如:直接修改数据,调用api接口修改数据),通过引入并调用api与服务端进行数据交换。

store.config(页面数据层)属于数据逻辑层

将页面的数据文件(实现类)和接口对应起来,并将数据及数据对应的逻辑操作注入到inversify生成的IoC容器中

services(页面数据交流层)属于数据逻辑层

store将自己的数据或调用自己的某数据操作函数黑盒暴露于service中,供其他store调用或者获取。用来做store间的数据交流。

commonTypes(公共页面数据结构定义层)属于数据逻辑层

常用页面数据结构,被需要用于多个页面。

utils(常用工具层)属于数据逻辑层

常用工具函数,例如请求函数,获取页面高度等工具性函数

apis(页面接口层)属于数据逻辑层

与服务端进行交互的接口存放的地方,被store调用

4.设计核心点

(1) 不同职责的代码进行分层,各司其职

各层级间代码相互独立,由容器进行各层级的组合,🚫禁止各层级间混乱的互相引用或通信导致代码难以维护

(2)视图层尽可能薄

获得的数据能够直接使用到视图层中,禁止在视图层中对数据进行转换、筛选、计算等逻辑操作。

(3) 不写重复逻辑

遇到相同的逻辑尽可能复用而不是重写,逻辑函数尽可能写成可拓展可维护,暴露给团队其他成员。

(4) 组件样式层高复用性,数据逻辑层高维护性,组合容器层高易读性

编写代码时以该项为原则进行编写,尽量不写三低代码

(5) 组件中尽量保证组件文件的纯净,尽量避免引入其他文件

编写代码时为保证组件的高复用性和可读性,尽量避免引入其他文件和npm包,例如:有需要维护的数据状态,巧用state不引入mobx进行状态管理

(6) 所有的状态(数据)和函数操作必须严格使用访问修饰符

private:修饰的属性或方法是私有的,不能在声明它的类的外部访问。

protected:修饰的属性或方法是受保护的,它和 private 类似,区别是它在子类中也是允许被访问的。

public:修饰的属性或方法是公有的,可以在任何地方被访问到,默认所有的属性和方法都是 public 的。

5.前端目录架构

Taro的目录结构示例

Taro的目录结构示例

react-typescript的目录结构示例

react-typescript的目录结构示例

6.开发注意事项

(1) 同层级之间不进行直接的数据信息交换,避免逻辑代码冗杂难以维护。

(2) 所有当前层的逻辑性操作只在当前层中完成,下层不需要帮上层进行逻辑性代码处理,上层对下层永远是黑盒

例如:component只知道点击某东西及调用page通过props传入进来的函数然后page调用store中的函数。component并不知道函数在page中的操作,page也不知道函数在store中的操作。store调用service也是一样。

(3) 命名规则

组件名:大驼峰

除组件外的文件及文件夹:小驼峰

style_class:xxx_xxx下划线连接

函数名:小驼峰

变量名:小驼峰

interface: 以大写i开头例如:IMyProps

props传递函数:以on为开头例如:onHandleClick

传递布尔值:以is开头例如:isLogin

(4) 每个page都有自己私有的store api assets,每个store都有一个向外暴露的service,通过名字进行统一

index页面具有的即为indexStore indexInversify indexType.d, index页面对应的数据IoC容器名即为IIndexType api和静态文件存在的文件夹叫index,indexStore的service即为indexService。

(5) store中所有调用api接口必须使用try catch进行包裹

(6) 在编写组件的时候需要给定props默认值(写在class内)用来提高编译速度

publicstaticdefaultProps={hhh:123,user:'user'  }

(7) 所有store使用在config配置中通过设置inversify的IoC容器使用单例模式

(8) 所有常量及函数都需要写注释到别人看一眼就知道含义和怎么调用的程度。函数需要声明入参及出参类型。

test: (a:string)=>string=(a='1')=>{returna  }

(9) 尽量不要使用any作为类型检查

7.特殊问题处理

(1)问:假如需求来的非常紧急需要快速改完,严格按这个流程写会很花费时间,怎么办?

答:先以最快的速度完成需求,在完成交付之后再重写架构这部分需求。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容

  • 作为一个合格的开发者,不要只满足于编写了可以运行的代码。而要了解代码背后的工作原理;不要只满足于自己的程序...
    六个周阅读 8,439评论 1 33
  • 一 : 脚手架 react官方提供的脚手架工具:Create-react-app 优点: 官方提供,比较健壮; 使...
    阿鲁提尔阅读 1,698评论 0 4
  • 昨天晚上睡眠特别差,处于半睡半醒的状态今天上午整个人就是迷迷糊糊的,动不动就冒虚汗,有点虚脱的感觉。 为迎接义务教...
    心有灵犀J阅读 1,251评论 13 33
  • 一提到泰国,很多人想到的是男扮女装,搔首弄姿的人妖吧。 但是从我到泰国之后,我发现人妖其实也可以很可爱。 苏友朋就...
    宋卡阅读 540评论 1 0
  • 一个10岁的女孩,该有怎样的生活? 是依偎在父母怀里撒娇,抑或和小伙伴打闹? 是做众人的小公主,还是当大家的掌上明...
    宋小夏阅读 463评论 2 2