基于vue和react的spa进行按需加载的实现方法

2020-06-14 06:32:44易采站长站整理


//roter配置的分割代码
import Vue from 'vue'
import Router from 'vue-router'
const listnav=()=> import('@/components/listnav')
const adminav=()=> import('@/components/adminav')
Vue.use(Router)
const router = new Router({
routes:[{
path:'/listnav',
name:'listnav',
component:listnav
},
{
path:'/adminav',
name:'adminav',
component:adminav
}
]})
export default router

2.webpack输出文件配置


//webpack.base.conf.js
moudle.exports = {
entry:{
app:'./src/main.js'
},
output:{
path:"../dist",
filename:'js/[name].js',
chunkFilename:'js/[name].js'
}
}

react按需加载应用

1,模块分割

同样模块分割可采用react-router进行划分


//router配置分割代码
import React, {PureComponent, Component ,createElement} from 'react';
import {HashRouter as Router, Route,Link,withRouter} from 'react-router-dom';
import Home from "../component/home"
function getAsyncComponent(load) {
return class AsyncComponent extends PureComponent {
constructor(props) {
super(props);
}
componentDidMount() {
// 在高阶组件 DidMount 时才去执行网络加载步骤
load().then(({default: component}) => {
// 代码加载成功,获取到了代码导出的值,调用 setState 通知高阶组件重新渲染子组件
this.setState({
component,
})
});
}
render() {
const {component} = this.state || {};
// component 是 React.Component 类型,需要通过 React.createElement 生产一个组件实例
return component ? createElement(component) : null;
}
}
}
const Routes = () =>(
<HashRouter>
<Route path="/home/:test" exact component={Home}/>
<Route path='/details/:id' component={getAsyncComponent(
// 异步加载函数,异步地加载 details组件
() => import('../component/details')
)}/>
</HashRouter>
)
export default Routers;

2.webpack输出文件配置


//webpack.base.config.js
module.exports = {
entry:{
main: "../src/index.js", //入口文件
},
output:{
path:"../dist",//出口文件
filename:"js/[name].js",
chunkFilename:"js/[name].js",
publicPath: ''
}
}

3.按需加载组件中的props传递

在按需加载划分后,按需加载的组件不能接收到传递来的props,因此不能通过this.props.match.params来获取router配置时所带入的参数。

解决方法利用react-router中的withRouter