1. import React from 'react'
    2. import ReactDOM from 'react-dom'
    3. import { createHashHistory } from 'history'
    4. import { createStore, combineReducers, applyMiddleware } from 'redux'
    5. import { Provider, connect } from 'react-redux'
    6. import createSagaMiddleware from 'redux-saga'
    7. import * as sagaEffects from 'redux-saga/effects'
    8. export default function (opts = {}) {
    9. let history = opts.history || createHashHistory()
    10. let app = {
    11. _models: [],
    12. model,
    13. router,
    14. _router: null,
    15. start
    16. }
    17. function model(m) {
    18. let prefixmodel = prefixResolve(m)
    19. app._models.push(prefixmodel)
    20. }
    21. function router(router) {
    22. app._router = router
    23. }
    24. function start(container) {
    25. let reducer = getReducer(app)
    26. let sagas = getSagas(app)
    27. //let store = createStore(reducer)
    28. let sagaMiddleware = createSagaMiddleware()
    29. app._store = applyMiddleware(sagaMiddleware)(createStore)(reducer)
    30. sagas.forEach(sagaMiddleware.run)
    31. ReactDOM.render(
    32. <Provider store={app._store}>
    33. {app._router('history')}
    34. </Provider>
    35. , document.querySelector(container))
    36. }
    37. return app
    38. }
    39. function getReducer(app) {
    40. let reducers = {}
    41. for (let m of app._models) {//m是每个model的配置
    42. reducers[m.namespace] = function (state = m.state, action) {//组织每个模块的reducer
    43. let everyreducers = m.reducers//reducers的配置对象,里面是函数
    44. let reducer = everyreducers[action.type]//相当于以前写的switch
    45. if (reducer) {
    46. return reducer(state, action)
    47. }
    48. return state
    49. }
    50. }
    51. return combineReducers(reducers)//reducer结构{reducer1:fn,reducer2:fn}
    52. }
    53. function prefix(obj, namespace) {
    54. return Object.keys(obj).reduce((prev, next) => {//prev收集,next是每个函数名
    55. let newkey = namespace + '/' + next
    56. prev[newkey] = obj[next]
    57. return prev
    58. }, {})
    59. }
    60. function prefixResolve(model) {
    61. if (model.reducers) {
    62. model.reducers = prefix(model.reducers, model.namespace)
    63. }
    64. if (model.effects) {
    65. model.effects = prefix(model.effects, model.namespace)
    66. }
    67. return model
    68. }
    69. function getSagas(app) {
    70. let sagas = []
    71. for (let m of app._models) {
    72. sagas.push(function* () {
    73. for (const key in m.effects) {//key就是每个函数名
    74. const watcher = getWatcher(key, m.effects[key])
    75. yield sagaEffects.fork(watcher) //用fork不会阻塞
    76. }
    77. })
    78. }
    79. return sagas
    80. }
    81. function getWatcher(key, effect) {
    82. return function* () {
    83. yield sagaEffects.takeEvery(key, function* (action) {//对action进行监控,调用下面这个saga
    84. yield effect(action, sagaEffects)
    85. })
    86. }
    87. }

    // router.js

    1. import * as routerRedux from 'react-router-redux';
    2. export * from 'react-router-dom';
    3. export { routerRedux }