美文网首页
React组件懒加载

React组件懒加载

作者: 我叫Aliya但是被占用了 | 来源:发表于2018-01-17 17:21 被阅读2746次

转载自:https://segmentfault.com/a/1190000010640236

bundle-loader

新版的React建议我们使用bundle-loader进行代码的分离,下面我们看下它的用法:

// 当你用到这个函数时,这个chunk才会被请求
var waitForChunk = require("bundle-loader!./file.js");

//  当请求的chunk加载完成才会执行传入的回调函数,并将请求的模块作为参数传入回调函数
waitForChunk(function(file) {
    // 接收到懒加载模块,类似于下面代码
    // var file = require("./file.js");
});

这个插件使用非常简单,只是对require.ensure的封装,使用起来类似于AMD的方式,
只需在回调函数里接收到懒加载的模块即可。


结合React

React 组件也是模块,因此可以使用bundle-loader进行代码分离,只是需要在合适的地方请求调用即可。

怎样知道何时需要请求这个组件呢?社区建议的是先加载一个bundle容器组件(这个bundle容器组件本身非常小),当这个容器组件被渲染到dom时则可认为我们需要请求对应的懒加载组件了。

我们可以为所有的懒加载组件封装一个通用的容器组件:
(这里也有已经封装好的:react-lazy-bundle,直接安装即可)

import React, { Component } from "react";

class Bundle extends Component {
  state = {
    // 因为module被占用了,我们用mod定义变量
    mod: null
  };

  componentWillMount() {
    this.load(this.props);
  }

  componentWillReceiveProps(nextProps) {
    if (nextProps.load !== this.props.load) {
      this.load(nextProps);
    }
  }

  load(props) {
    this.setState({
      mod: null
    });
    props.load(mod => {
      this.setState({
        // 为了兼容es module 和 AMD module
        mod: mod.default ? mod.default : mod
      });
    });
  }

  render() {
    //若加载完成则渲染对应懒加载的组件,反之加载beforeLoad传入的组件
    return this.state.mod
      ? <this.state.mod {...this.props} />
      : <this.props.beforeLoad {...this.props} />;
  }
}

export default Bundle;

如上封装,使用时我们只需如下即可:

import React, { Component } from "react";
import Bundle from "./Bundle";

import Test from "bundle-loader?lazy&name=[name]!./test";

const BeforeLoadComponent = props =>
  <div>
    before load {props.name}
  </div>;

class HomePage extends Component {
  render() {
    return (
      <div>
        <Bundle name="flypie" load={Test} beforeLoad={BeforeLoadComponent} />
      </div>
    );
  }
}

export default HomePage;

结合React Router

结合React Router也非常简单,因为已经把Bundle作为Route的component参数了,
所以要再封装一层,把load和beforeLoad预先传入即可。

import Bundle from "./Bundle";
import About from "bundle-loader?lazy&name=[name]!./About";

const AboutWrapper = props => <Bundle load={About} {...props}/>;

class App extends Component {

  render() {
    return (
      <div>
        <h1>Welcome!</h1>
        <Route path="/about" component={AboutWrapper}/>
      </div>
    )
  }
}

相关文章

  • 搭建一套好用的react项目架构

    项目目录 组织架构 react16.x、react.hooks、react.lazy组件懒加载、react-rou...

  • 在React中可以用来优化组件性能的方法

    在React中可以用来优化组件性能的方法有: 组件懒加载(React.lazy(...)和 ) Pure Comp...

  • React项目中组件懒加载的四种方式

    什么是懒加载? 懒加载顾名思义就是延时加载,即当对象需要用到的时候再去加载。 react中组件的懒加载的4种方法 ...

  • React组件懒加载

    转载自:https://segmentfault.com/a/1190000010640236 bundle-lo...

  • metaapp面经

    react生命周期 react组件传值 vue懒加载 es6的class echarts复杂图表 css动画 一个...

  • 实现vue-router 路由懒加载

    相比React,Vue实现组件的懒加载还是比较简单的,以下是官方文档的说明 以上是按照官方文档写的懒加载代码,但是...

  • React.lazy的使用方法

    平时一般引入组件都是 我们也可以使用React.lazy提供的懒加载方法动态加载组件,例如 但是值得注意的是Rea...

  • react记录 二

    目录 一.react异步加载组件,分模块加载,提高打开性能 二. 三. 四. 一.react异步加载组件,分模块加...

  • vue中组件懒加载

    vue中组件懒加载的方法 1.异步实现路由懒加载 2.import(推荐使用这种方式) 同理,路由懒加载和组件懒加...

  • 踩坑记录——React.lazy

    项目背景:一个页面内嵌三个页面组件,试图使用React.lazy懒加载实现分包加载性能优化,原本使用的是alias...

网友评论

      本文标题:React组件懒加载

      本文链接:https://www.haomeiwen.com/subject/dbpuoxtx.html