Skip to content
20 changes: 18 additions & 2 deletions packages/plugin-dva/src/dva.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,24 @@ import dva from 'dva';
// @ts-ignore
import createLoading from '{{{ dvaLoadingPkgPath }}}';
import { plugin, history } from '../core/umiExports';
{{ ^LazyLoad }}
{{{ RegisterModelImports }}}
{{ /LazyLoad }}
{{ #dvaImmer }}
import dvaImmer, { enableES5 } from '{{{ dvaImmerPath }}}';
{{ /dvaImmer }}

let app:any = null;

export function _onCreate(options = {}) {
export {{ #LazyLoad }}async {{ /LazyLoad }}function _onCreate(options = {}) {
const runtimeDva = plugin.applyPlugins({
key: 'dva',
type: ApplyPluginsType.modify,
initialValue: {},
});
{{ #LazyLoad }}
{{{ RegisterModelImports }}}
{{ /LazyLoad }}
app = dva({
history,
{{{ ExtendDvaConfig }}}
Expand Down Expand Up @@ -49,7 +54,13 @@ export class _DvaContainer extends Component {
super(props);
// run only in client, avoid override server _onCreate()
if (typeof window !== 'undefined') {
_onCreate();
_onCreate()
{{ #LazyLoad }}
.then(() => {
// force update
this.forceUpdate();
});
{{ /LazyLoad }}
}
}

Expand All @@ -70,6 +81,11 @@ export class _DvaContainer extends Component {

render() {
const app = getApp();
{{ #LazyLoad }}
if (!app) {
return null;
}
{{ /LazyLoad }}
app.router(() => this.props.children);
return app.start()();
}
Expand Down
12 changes: 12 additions & 0 deletions packages/plugin-dva/src/fixtures/lazyLoad/.umirc.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@

export default {
routes: [
{ path: '/', component: 'index' },
],
dva: {
lazyLoad: true,
},
plugins: [
require.resolve('../../'),
],
}
9 changes: 9 additions & 0 deletions packages/plugin-dva/src/fixtures/lazyLoad/models/foo.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { data } from '../utils'

export default {
state: {
desc: 'foo',
count: 0,
data,
},
}
7 changes: 7 additions & 0 deletions packages/plugin-dva/src/fixtures/lazyLoad/pages/index.less
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@

.normal {
}

.title {
background: rgb(196, 242, 121);
}
15 changes: 15 additions & 0 deletions packages/plugin-dva/src/fixtures/lazyLoad/pages/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import React from 'react';
import styles from './index.less';
import { connect } from 'dva';

export const data = {};

export default connect(state => ({
foo: state.foo,
}))((props) => {
return (
<div>
<h1 className={styles.title}>Page index { props.foo.desc } { props.foo.count }</h1>
</div>
);
})
1 change: 1 addition & 0 deletions packages/plugin-dva/src/fixtures/lazyLoad/utils.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { data } from './pages/index';
10 changes: 10 additions & 0 deletions packages/plugin-dva/src/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,13 @@ test('with-immer', async () => {
'<div><h1 class="title">Page index foo 1</h1><button>add</button></div>',
);
});

test('lazyLoad', async () => {
const cwd = join(fixtures, 'lazyLoad');
await generateTmp({ cwd });
const { container } = render({ cwd });
await utils.delay(100);
expect(container.innerHTML).toEqual(
'<div><h1 class="title">Page index foo 0</h1></div>',
);
});
13 changes: 11 additions & 2 deletions packages/plugin-dva/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,11 @@ export default (api: IApi) => {
schema(joi) {
return joi.object({
disableModelsReExport: joi.boolean(),
lazyLoad: joi
.boolean()
.description(
'lazy load dva model avoiding the import modules from umi undefined',
),
extraModels: joi.array().items(joi.string()),
hmr: joi.boolean(),
immer: joi.alternatives(joi.boolean(), joi.object()),
Expand Down Expand Up @@ -104,11 +109,15 @@ export default (api: IApi) => {
dvaImmerES5:
lodash.isPlainObject(api.config.dva?.immer) &&
api.config.dva?.immer.enableES5,
LazyLoad: api.config.dva?.lazyLoad,
RegisterModelImports: models
.map((path, index) => {
return `import Model${lodash.upperFirst(
const modelName = `Model${lodash.upperFirst(
lodash.camelCase(basename(path, extname(path))),
)}${index} from '${path}';`;
)}${index}`;
return api.config.dva?.lazyLoad
? `const ${modelName} = (await import('${path}')).default;`
: `import ${modelName} from '${path}';`;
})
.join('\r\n'),
RegisterModels: models
Expand Down