dva 结合webpack4 改写动态加载

dva如今是构建在umi基础上,因为项目的缘由,我并无采用umi架构,而是本身使用webpack4来进行打包,只用dva负责数据流的处理,dva原来的dynamic在webpack4上编译会有一堆错误。具体就不贴上来了,这里主要是利用webpack4采用import的动态加载原理进行改造。react

首先,dva依赖与react-router,因此最初的想法是采用react-router结合webpack4的方式进行改写。这里我用到一个库,就是@loadable/component,这个在react-router的动态加载案例里也有采纳,可是你们都知道,dva原来的dynamic.js在动态加载react-router的component时还要使用registerModel来进行model注册。这个过程实际是是redux的动态加载。在这里我参考了webpack4的动态加载案例,使用import().then(module)的方式来进行动态加载。说了这么多,把代码放上来:webpack

import loadable from '@loadable/component'

/*dva官方代码*/
const cached = {}
function registerModel(app, model) {
  model = model.default || model
  if( !cached[model.namespace] ) {
    app.model(model)
    cached[model.namespace] = 1
  }
}

/*动态加载封装*/
const AsyncPage = loadable(props => {
  import(`your/path/${props.component}/model`).then((module) => {
    registerModel(props.app, module.default)
  })
  return import(`your/path/${props.component}`)
})

使用起来就是像dva原来的dynamic上同样,创建一个routes对象数组web

[{
  path:'your/path',
  key:'yourkey',
  component: props => {
    return <AsyncPage component="your/path/component" app={app} {..props} />
  }
}]

而后map一下就OK了。redux

相关文章
相关标签/搜索