react 理想架构整合笔记

284 阅读2分钟

易于开发

  • 开发工具是否完善
  • 生态圈是否繁荣
  • 社区是否活跃

易于扩展

  • 增加新功能是否容易
  • 新功能是否会显著增加系统复杂度

易于维护

  • 代码是否容易理解 ESLint
  • 文档是否健全 注释、架构图、文档

易于测试

  • 功能的分层是否清晰
  • 副作用少
  • 尽量使用纯函数

易于构建

  • 使用通用技术和架构
  • 构建工具的选择

一 拆分复杂度

按领域模型(feature)组织代码,降低耦合度

项目初期:规模小,模块关系清晰

项目逐渐复杂,添加了更多组件和其他元素

项目收尾:文件结构,模块依赖错综复杂

将业务逻辑拆分成高内聚松耦合的模块

通过React技术栈实现

02 文件夹结构

  • 按feature 组织源文件
  • 组件和样式文件同一级
  • Redux单独文件夹
  • 单元测试保持同样目录结构放在tests文件夹

拆分后组织组件和样式

features/examples/index.js

export {default as SidePanel} from './SidePanel';
export {default as WelcomePage} from './WelcomePage';
export {defalut as CounterPage} from './CounterPage';
export {defaut as Layout} from './Layout';
// ...

features/examples/style.less

@import '../../styles/misins';
@import './SidePanel';
@import './WelcomePage';
@import './Layout';

拆分后组织Action 和 Reducer

CounterPlusOne.js

features/examples/redux/actions.js

export {counterPlusOne} from './counterPlusOne';
export {counterMiunsOne} from './counterMiunsOne';
//...

features/examples/redux/reducer.js

import initialState from './initialState';
import {reducer as counterPlusOneReducer} from './counterPlusOne';
import {reducer as counterMiunsOneReducer} from './counterMiunsOne';

const reducers = [
    counterPlusOneReducer,
    counterMiunsOneReducer
]

export default function reducer(state = initialState, action){
    let newState;
    switch(action.type){
        // Handle cross-topic actions here
        default:
            newState = state;
            break;
    }
    return reducers.reduce((s, r)=> r(s, action), newState)
}

constants.js

common/rootReducer.js

import {combineReducers} from 'redux';
import {routerReducer} from 'react-router-redux';
import homeReducer from '../features/home/redux/reducer';
import examplesReducer from '../reatures/examples/redux/reducer';

const reducerMap = {
    router: routerReducer,
    home: homeReducer,
    examples: examplesReducer
}

export default combineReducers(reducerMap);

使用时

function mapStateToProps(state){
    return {
      examples: state.examples   
    }
}
export dufault connect(mapStateToProps, null)(nowComponent)

在每个feature中单独定义自己的路由

使用JSON定义顶层路由

解析JSON路由到React Router语法