按需加載模塊的目的是實現(xiàn)代碼分隔,用戶打開首頁時不用下載全部的代碼床蜘,打開特定的頁面加載特定的代碼晰洒。提高用戶體驗。
如果使用的是react-router糊闽,官網(wǎng)文檔給出的 方案 是用webpack的bundle-loader
你可能也見過require.ensure梳玫。這是webpack的舊式寫法雀哨,現(xiàn)在已不推薦候生。
我傾向于使用import(),這也是webpack推薦的侮邀。因為更符合規(guī)范念链。 這篇 我有專門的介紹盼忌,社區(qū)中也有專門的 方案。
我也用到項目中掂墓,代碼如下
其中City和Login頁面是按需加載中的谦纱,你可以在network中看到進入這倆頁面瀏覽器會先加載類似 1.chunk.js文件。
import React from 'react'
import { BrowserRouter as Router, Route, Link, Switch } from 'react-router-dom'
import Home from '$pages/Home/'
import List from '$pages/List/'
// import City from '$pages/City/'
// import Login from '$pages/Login/'
import Detail from '$pages/Detail/'
import Search from '$pages/Search/'
import UserCenter from '$pages/UserCenter/'
import Demo from '$pages/Demo/'
import NoMatch from './404'
// 異步按需加載component
function asyncComponent(getComponent) {
return class AsyncComponent extends React.Component {
static Component = null;
state = { Component: AsyncComponent.Component };
componentWillMount() {
if (!this.state.Component) {
getComponent().then(({default: Component}) => {
AsyncComponent.Component = Component
this.setState({ Component })
})
}
}
render() {
const { Component } = this.state
if (Component) {
return <Component {...this.props} />
}
return null
}
}
}
function load(component) {
return import(`$pages/${component}/`)
}
const Login = asyncComponent(() => load('Login'));
const City = asyncComponent(() => load('City'));
export class RouterMap extends React.Component {
render() {
return (
<Router>
<div>
{ /*
<ul>
<li><Link to="/">Home</Link></li>
<li><Link to="/list">List</Link></li>
</ul>
<hr/>
*/ }
<Switch>
<Route exact path="/" component={Home} />
<Route path="/login/:refer?" component={Login} />
<Route path="/city" component={City} />
<Route path="/user" component={UserCenter} />
<Route path="/list" component={List} />
<Route exact path="/demo" component={Demo} />
<Route path="/search/:category/:keyword?" component={Search} />
<Route path="/detail/:id" component={Detail} />
<Route component={NoMatch}/>
</Switch>
</div>
</Router>
);
}
}
如果感覺這篇對你有用的朋友給我的 項目 點個star