We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
原文地址:Nealyang/PersonalBlog
无论lowcode再怎么🐂x,都避免不了对于复杂页面或者说特定页面的源码开发
lowcode
之前也有写过相关文章总计:一张页面引起的前端架构思考,但是更多的是介绍How,并没有介绍到 Way,经过了一年的使用(rax 1.x 体系也在完善),必然也会伴随着一部分的调整。此篇作为阶段性总结以及对 BeeMa 架构开发辅助插件的铺垫。
以下介绍,主要是针对使用Rax 、TypeScript 的 H5 MPA 开发总结。
H5 MPA
通常编码MPA 应用,都是在 pages 下新增相应page,然后在里面堆components。对于ajax 接口联调一般都是在 componentDidMount 或者 useEffect 中。虽说如此,但是比较宽泛。
MPA
pages
page
components
componentDidMount
useEffect
团队中大多使用 rax 编码,在日常编码工作中就是 fn(state)=>UI的过程,所以在归类下来主要工作无非:
fn(state)=>UI
index.tsx
如果没有规范的约束,那么每个人的风格都差别较大
可以看到,前端的业务编码无非就是如上三个问题,但是每个同学处理的方式都迥然不同,导致业务中每接手一个项目改动别的同学代码都需要花费一定能的时间去消化原有逻辑。
并且!如果涉及到多人合作的页面,可能还会有大量的代码冲突(页面逻辑并未高度解耦)
总结如上源码开发中团队合作遇到的问题:
codespliting
而针对如上问题,如果我们需要提供一套架构来解决这类问题,那么至少我们需要提供:
从之前做过的项目中,我们总结容器应该具备如下能力:
如上容器组件的封装,就提供了基本的容器能力。面对大部分的业务开发,基本都是能够满足需求的。
再次强调!!! 编写业务页面,其实完全可以把整体工作分为两趴: format 数据 拿数据渲染 UI
再次强调!!! 编写业务页面,其实完全可以把整体工作分为两趴:
所以文章后面介绍的就是状态管理工具选型,以及如何整理状态,最后,如何加载模块
有了基础容器提供的底层能力,再回想我们使用 react、vue 还是 rax 开发前端页面,其实都是状态驱动 UI 的过程 ,所以针对复杂业务的场景,状态管理自然必不可少。
react
vue
rax
基于现有的 hooks 技术方案,天然就存在状态管理解决方案:useRedux ,但是考虑到模块之间的高度解耦,还是非常有必要对 redux 进行改动,让其支持中间件、compose、combineReducers等特性。所以针对第一版的架构设计,自己封装了一份状态管理方案:从 redux 的范式中搬个轮子做源码项目的状态管理
hooks
useRedux
redux
compose
combineReducers
但是目前集团内,ice 提供了一套更加简易的状态管理封装,iceStore 并且 rax 也提供了支持。所以自然还是跟着集团的源码方向走,这里我们的状态管理,最终选择了使用 iceStore 的解决方案
ice
iceStore
对于状态管理,考虑到模块的高度解耦,约定每一个模块,对应着状态树的一个分支 , 简而言之,就是新增一个模块,要新增对应模块的 model
model
如上优点:
state
dispatchers
common model
讲解状态分发的前提应该先介绍下接口数据的请求配置。其实也比较简单,就是一个 mtop(ajax)请求拿到属于而已
mtop
ajax
架构中,将请求封装到 **utils** 里面,然后在自定义 **hooks :useDataInit** 中调用分发状态
**utils**
**hooks :useDataInit**
在源码架构初始化出来是一个模拟的请求,数据来自 page-name/mock/index.json
在自定义 hooks 中,拿到数据后,根据模块化字段,分发到对应的组件里面。
如上,我们已经完成了我们装备整个应用(页面)的状态的工作,下面我们的重点就是如何合理的根据状态树去加载模块
模块加载,按照之前较为“随意”的编码方式,是根据各自风格,往 index.tsx 中一股脑的堆放,加持着各种 ifElse 的判断 这样存在的弊端如下:
针对如上问题,我们希望:
code splitting
src/page-name/components/
UI
use-data-init
config.ts
pageContainer
store
pageState
common
Ts 中注释即文档。虽然模块高度解耦,但是哪怕自己再熟悉的模块,随着时间推移也有生疏的时候,所以尽可能的做到模块声明的每一个字段都加以注释
详细约束详见:拍卖源码架构在详情页上的探索
之所以不想详细介绍约束,是因为这里提供了一系列 vscode 插件,按照插件的提供的功能去开发,即可消化架构层面带来的约束
详细使用说明,下回分解~
支持 pc、无线、组件等应用脚手架 模板 EMS 配置
以 h5 源码举例
方便快捷定位核心功能开发,近乎 96%的功能可以 focus 到此大纲中完成
The text was updated successfully, but these errors were encountered:
No branches or pull requests
前言
之前也有写过相关文章总计:一张页面引起的前端架构思考,但是更多的是介绍How,并没有介绍到 Way,经过了一年的使用(rax 1.x 体系也在完善),必然也会伴随着一部分的调整。此篇作为阶段性总结以及对 BeeMa 架构开发辅助插件的铺垫。
丐版
通常编码
MPA
应用,都是在pages
下新增相应page
,然后在里面堆components
。对于ajax 接口联调一般都是在componentDidMount
或者useEffect
中。虽说如此,但是比较宽泛。团队中大多使用 rax 编码,在日常编码工作中就是
fn(state)=>UI
的过程,所以在归类下来主要工作无非:index.tsx
提供聚合现状
如果没有规范的约束,那么每个人的风格都差别较大
可以看到,前端的业务编码无非就是如上三个问题,但是每个同学处理的方式都迥然不同,导致业务中每接手一个项目改动别的同学代码都需要花费一定能的时间去消化原有逻辑。
并且!如果涉及到多人合作的页面,可能还会有大量的代码冲突(页面逻辑并未高度解耦)
问题与挑战
总结如上源码开发中团队合作遇到的问题:
codespliting
缺失而针对如上问题,如果我们需要提供一套架构来解决这类问题,那么至少我们需要提供:
Action
基础容器
从之前做过的项目中,我们总结容器应该具备如下能力:
API 说明
IScrollToTopProps
基础的广播事件
如上容器组件的封装,就提供了基本的容器能力。面对大部分的业务开发,基本都是能够满足需求的。
状态管理
有了基础容器提供的底层能力,再回想我们使用
react
、vue
还是rax
开发前端页面,其实都是状态驱动 UI 的过程 ,所以针对复杂业务的场景,状态管理自然必不可少。基于现有的
hooks
技术方案,天然就存在状态管理解决方案:useRedux
,但是考虑到模块之间的高度解耦,还是非常有必要对redux
进行改动,让其支持中间件、compose
、combineReducers
等特性。所以针对第一版的架构设计,自己封装了一份状态管理方案:从 redux 的范式中搬个轮子做源码项目的状态管理但是目前集团内,
ice
提供了一套更加简易的状态管理封装,iceStore 并且 rax 也提供了支持。所以自然还是跟着集团的源码方向走,这里我们的状态管理,最终选择了使用iceStore
的解决方案对于状态管理,考虑到模块的高度解耦,约定每一个模块,对应着状态树的一个分支 , 简而言之,就是新增一个模块,要新增对应模块的
model
如上优点:
state
和dispatchers
即可dispatchers
即可common model
,由框架层面统一分发到每一个模块中(模块加载部分介绍具体实现)状态分发
讲解状态分发的前提应该先介绍下接口数据的请求配置。其实也比较简单,就是一个
mtop
(ajax
)请求拿到属于而已架构中,将请求封装到
**utils**
里面,然后在自定义**hooks :useDataInit**
中调用分发状态请求接口数据
状态分发 use-data-init.ts
在自定义
hooks
中,拿到数据后,根据模块化字段,分发到对应的组件里面。如上,我们已经完成了我们装备整个应用(页面)的状态的工作,下面我们的重点就是如何合理的根据状态树去加载模块
模块加载
模块加载,按照之前较为“随意”的编码方式,是根据各自风格,往 index.tsx 中一股脑的堆放,加持着各种 ifElse 的判断 这样存在的弊端如下:
index.tsx
入口杂乱index.tsx
较长,逻辑复杂针对如上问题,我们希望:
index.tsx
尽可能大家都不会涉及到修改code splitting
目录
小总结
state
。 2、根据state
去渲染UI
。所谓的各种交互也只是修改对应的state
而已use-data-init
里通过调用接口拿到数据,并且分发到各个模块里面。组成我们“想要”的状态树。index.tsx
根据拿到的状态树然后基于config.ts
来决定如何加载组件pageContainer
组件支持store
,对应的model
除了pageState
和common
,其他就是每一个业务模块重点强调
注释
Ts 中注释即文档。虽然模块高度解耦,但是哪怕自己再熟悉的模块,随着时间推移也有生疏的时候,所以尽可能的做到模块声明的每一个字段都加以注释
state 分支对应的模块需要与 config.ts 中配置保持一致
之所以不想详细介绍约束,是因为这里提供了一系列 vscode 插件,按照插件的提供的功能去开发,即可消化架构层面带来的约束
解决方案
创建应用
新建页面
模块配置
BeeMa 大纲
The text was updated successfully, but these errors were encountered: