在react-router中进行代码拆分

随着react项目的迭代开发,会发现build 下静态文件包的体积会愈来愈臃肿,首次浏览网页,白屏或loading时间愈来愈长,因此代码拆分很是必要:css

1、 react-loadable 组件拆分:

安装:
npm install react-loadable -S;

使用方法: App组件中导入 react-loadable组件,app.js 中引入一下代码

react


import Loadable from 'react-loadable';
import Loading from './my-loading-component';

const LoadableComponent = Loadable({
  loader: () => import('./my-component'),
  loading: Loading,
});

export default class App extends React.Component {
  render() {
    return <LoadableComponent/>;
  }
}

Loading 组件内容:

import React from "react"

    export default () => {
        return <div style={{ position: "fixed", left: "50%", top: "50%"}}>Loading......</div>
    }

2、异步函数拆分

建立异步组件:
在src目录下建立异步组件 AsyncComponentwebpack

import React, { Component } from 'react';
export default function asyncComponent(importComponent) {web

class AsyncComponent extends Component {
    constructor(props) {
        super(props);

        this.state = {
            component: null
        };
    }
    async componentDidMount() {
        const { default: component } = await importComponent();

        this.setState({
            component: component
        });
    }

    render() {
        const Com = this.state.component;

        return (Com ? <Com {...this.props} /> : null)
    }
}

return AsyncComponent;

}npm

使用异步组件

咱们将使用它asyncComponent来动态导入咱们想要的组件。redux

const Home = asyncComponent(() => import("./components/Home"));
而不是静态导入咱们的组件。数组

import Home from "./components/Home";

实例:react-router

import React, { Component } from 'react';
import './App.css';
import { Provider } from 'react-redux'
import store from "./store"
import { HashRouter as Router, Switch, Route } from "react-router-dom"
import Home from "./Home"
import { AppContainer } from 'react-hot-loader';app

import asyncComponent from "./AsyncComponent"
const Abc= asyncComponent(() => import("./Abc"));
const Bac = asyncComponent(() => import("./Bac"));

class App extends Component {
static state = {dom

}
static submint = () => {

}

render() {

return (
  <AppContainer>
    <Provider store={store}>
      <Router>
        <Switch>
          <Route exact path="/" component={Home} />
          <Route exact path="/home/aa" component={Abc} />
          <Route exact path="/home/bb" component={Bac} />
        </Switch>
      </Router>
    </Provider>
  </AppContainer>
);

}
}

export default App;

3、require.ensure() 方法

在webpack 2的官网上写了这么一句话:
require.ensure() is specific to webpack and superseded by import().
因此,在webpack 2里面应该是不建议使用require.ensure()这个方法的。可是目前该方法仍然有效,因此能够简单介绍一下。包括在webpack 1中也是可使用。下面是require.ensure()的语法:
require.ensure(dependencies: String[], callback: function(require), errorCallback: function(error), chunkName: String)
require.ensure()接受三个参数:
第一个参数dependencies是一个数组,表明了当前require进来的模块的一些依赖;

第二个参数callback就是一个回调函数。其中须要注意的是,这个回调函数有一个参数require,经过这个require就能够在回调函数内动态引入其余模块。值得注意的是,虽然这个require是回调函数的参数,理论上能够换其余名称,可是其实是不能换的,不然webpack就没法静态分析的时候处理它;

第三个参数errorCallback比较好理解,就是处理error的回调;

第四个参数chunkName则是指定打包的chunk名称。

所以,require.ensure()具体的用法以下:

require.ensure([], require => {let chat = require('/components/chart');someOperate(chat);}, error => {console.log('failed');}, 'mychat');});

相关文章
相关标签/搜索