使用 React Router v4 进行代码拆分
Code Splitting by using react router v4
在 react router v3 中,我已经使用 System.import
实现了代码拆分,现在我想将我的应用程序升级到 react-router-v4,但问题是我无法拆分我的代码。
My routes.js
file
function errorLoading(error) {
throw new Error(`Dynamic page loading failed: ${error}`);
}
function loadRoute(cb) {
return module => cb(null, module.default);
}
module.exports = {
path: '/',
indexRoute: {
getComponent(location, cb) {
System.import('../pages/IndexPage')
.then(loadRoute(cb))
.catch(errorLoading);
}
},
childRoutes: [{
path: 'notifications',
indexRoute: {
getComponent(location, cb) {
System.import('../pages/NotificationPage')
.then(loadRoute(cb))
.catch(errorLoading);
}
},
}]
};
然后我将路由导入我的 index.js
文件并将它们渲染到 rootNode 就像
ReactDOM.render(
<AppContainer>
<ApolloProvider store={store} client={client}>
<Router
history={browserHistory}
routes={routes}
/>
</ApolloProvider>
</AppContainer>,
rootNode
);
如果你可以使用 ES6 动态导入,你可以选择 react-loadable 并以这种方式实现代码分割:
export const AsyncComponent = Loadable({
loader: () => import(/* webpackChunkName: "name" */ 'path/to/Component'),
loading: () => null
})
// ...
<Route path='some/path' component={AsyncComponent} />
查看 react-async-component. It has worked great for me on my hapi-react-hot-loader-example
import {asyncComponent} from 'react-async-component';
export default asyncComponent({
name: 'AboutAsync',
serverMode: 'resolve',
resolve: () => import(/* webpackChunkName: "About" */ './About'),
});
在路由器中:
<Route
path="/about"
component={AboutAsync}
/>
通过简单地添加像
这样的路由来做到这一点
<Route
name="landing"
path="/"
getComponent={
(_, cb) => import('./pages/LandingPage/LandingPage' /* webpackChunkName: 'landing' */)
.then((module) => cb(null, module.default))
.catch((error) => cb(error, null))
}
</Route>
永远不要忘记在 webpack.js
中使用 CommonsChunkPlugin
在 react router v3 中,我已经使用 System.import
实现了代码拆分,现在我想将我的应用程序升级到 react-router-v4,但问题是我无法拆分我的代码。
My
routes.js
file
function errorLoading(error) {
throw new Error(`Dynamic page loading failed: ${error}`);
}
function loadRoute(cb) {
return module => cb(null, module.default);
}
module.exports = {
path: '/',
indexRoute: {
getComponent(location, cb) {
System.import('../pages/IndexPage')
.then(loadRoute(cb))
.catch(errorLoading);
}
},
childRoutes: [{
path: 'notifications',
indexRoute: {
getComponent(location, cb) {
System.import('../pages/NotificationPage')
.then(loadRoute(cb))
.catch(errorLoading);
}
},
}]
};
然后我将路由导入我的 index.js
文件并将它们渲染到 rootNode 就像
ReactDOM.render(
<AppContainer>
<ApolloProvider store={store} client={client}>
<Router
history={browserHistory}
routes={routes}
/>
</ApolloProvider>
</AppContainer>,
rootNode
);
如果你可以使用 ES6 动态导入,你可以选择 react-loadable 并以这种方式实现代码分割:
export const AsyncComponent = Loadable({
loader: () => import(/* webpackChunkName: "name" */ 'path/to/Component'),
loading: () => null
})
// ...
<Route path='some/path' component={AsyncComponent} />
查看 react-async-component. It has worked great for me on my hapi-react-hot-loader-example
import {asyncComponent} from 'react-async-component';
export default asyncComponent({
name: 'AboutAsync',
serverMode: 'resolve',
resolve: () => import(/* webpackChunkName: "About" */ './About'),
});
在路由器中:
<Route
path="/about"
component={AboutAsync}
/>
通过简单地添加像
这样的路由来做到这一点<Route
name="landing"
path="/"
getComponent={
(_, cb) => import('./pages/LandingPage/LandingPage' /* webpackChunkName: 'landing' */)
.then((module) => cb(null, module.default))
.catch((error) => cb(error, null))
}
</Route>
永远不要忘记在 webpack.js
CommonsChunkPlugin