使用react router v4进行代码拆分

时间:2017-07-01 22:38:05

标签: webpack-2 react-router-v4 react-router-dom

在反应路由器v3中,我使用System.import实现了代码拆分,现在我想将我的应用程序升级到react-router-v4,但问题是我无法拆分我的代码。

  

我的routes.js文件

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
);

3 个答案:

答案 0 :(得分:2)

结帐react-async-component。它在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}
/>

答案 1 :(得分:0)

如果你可以使用ES6动态导入,你可以选择react-loadable并以这种方式实现代码分割:

export const AsyncComponent = Loadable({
  loader: () => import(/* webpackChunkName: "name" */ 'path/to/Component'),
  loading: () => null
})

// ...
<Route path='some/path' component={AsyncComponent} />

答案 2 :(得分:0)

只需添加

等路线即可
<Route
  name="landing"
  path="/"
  getComponent={
    (_, cb) => import('./pages/LandingPage/LandingPage' /* webpackChunkName: 'landing' */)
      .then((module) => cb(null, module.default))
      .catch((error) => cb(error, null))
  }
</Route>

永远不要忘记使用CommonsChunkPlugin

中的webpack.js