react路由懒加载(异步组件)------react-loadable

摘要:
{Component}from“react”classHomeextendsComponent{render(){return(<这是主页<{return(<//通用转换Component constloadingComponent=()=>{return<loading<loading});
https://www.npmjs.com/package/react-loadable

安装

cnpm install react-loadable

基本使用

假设现在项目中有个 home页面组件src/pages/home/index.js

import React, { Component } from 'react'
class Home extends Component {
    render(){
        return (
            <div>这个是home页面</div>
        )
    }
}

export default Home

在没有使用react-loadable之前,在我们的route.js里面是直接import Home这个组件的router.js

import React, { Fragment } from 'react'
import { BrowserRouter, Route } from 'react-router-dom'

import Home from '@pages/home'

const Routes = () => (
    <BrowserRouter>
        <Route path="/home" component={Home}/>
    </BrowserRouter>
);

export default Routes

运行项目后我们可以看chrome的network记录

 
react路由懒加载(异步组件)------react-loadable第1张
image

可以看到1.chunk.js是687k

现在我们来添加react-loadable

在home文件下新建一个loadable.js文件

src/pages/home/loadable.js

import React from 'react';
import Loadable from 'react-loadable';

//通用的过场组件
const loadingComponent =()=>{
    return (
        <div>loading</div>
    ) 
}


export default Loadable({
    loader:import('./index.js'),
    loading:loadingComponent
});

然后再router里面调用

import React, { Fragment } from 'react'
import { BrowserRouter, Route } from 'react-router-dom'

import Home from '@pages/home/loadable'

const Routes = () => (
    <BrowserRouter>
        <Route path="/home" component={Home}/>
    </BrowserRouter>
);

export default Routes

现在再看看chrome的network记录

 
react路由懒加载(异步组件)------react-loadable第2张
image

这个时候1.chunk.js是156k,因为只加载首页所需的依赖,所以体积会小很多,而且这个差距会随着项目的增大而变大

看代码,可以知道,工作原理其实就是在页面组件上有包了一成高级组件来代替原来的页面组件

到这里,代码分割其实已经解决了,但是如果项目有100个页面,那laodable.js就需要写100遍,这样就感觉有点冗余了,所以这个我们可以封装一下

首先,我们建一个util    src/util/loadable.js

import React from 'react';
import Loadable from 'react-loadable';

//通用的过场组件
const loadingComponent =()=>{
    return (
        <div>loading</div>
    ) 
}

//过场组件默认采用通用的,若传入了loading,则采用传入的过场组件
export default (loader,loading = loadingComponent)=>{
    return Loadable({
        loader,
        loading
    });
}

不难看出,我们可以将按需加载的组件和过渡组件通过参数传入最后返回包装后的组件,如此一来,home下面的laodable.js就不需要再建了

router里面调用方式改为如下

import React, { Fragment } from 'react'
import { BrowserRouter, Route } from 'react-router-dom'
import loadable from '../util/loadable'

const Home = loadable(()=>import('@pages/home'))

const Routes = () => (
    <BrowserRouter>
        <Route path="/home" component={Home}/>
    </BrowserRouter>
);

export default Routes

封装之后,laodable只需写一次,改变的只是组件的引入方式,这样一来就方便多了,

react-loadable是以组件级别来分割代码的,这意味着,我们不仅可以根据路由按需加载,还可以根据组件按需加载,使用方式和路由分割一样,只用修改组件的引入方式即可




免责声明:文章转载自《react路由懒加载(异步组件)------react-loadable》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Halcon学习笔记之支持向量机(二)SpringBoot与SpringCloud对应版本及官方查询方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

WPF设置样式的几种方式

第一种方式是直接使用Setter来进行,可以对Background等进行设置。 <Window.Resources> <Style TargetType="Button"> <Setter Property="Background" Value="Red"/> </Style>&...

layui动态创建Tab、Tab右键功能

1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1, maximum-...

Hibernate环境搭建

1、导入jar包 hibernate.jar  antlr-2.7.6.jar  commons-collections-3.1.jar  jta-1.1.jar  dom4j-1.6.1.jar javassist-3.4.GA.jar  slf4j-api-1.5.2.jar  slf4j-log4j12-1.5.2.jar  假设使用C3P0数据源...

1.MyBatis所需要的配置文件

一、Mybatis介绍      MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库...

SpringCloud微服务实战-Zuul-APIGateway(十)

本文转自:http://blog.csdn.net/qq_22841811/article/details/67637786#准备工作 1 API Gateway 2 Zuul介绍 2.1 zuul的功能 Routing in an integral part of a microservice architecture. For example, /...

office 2016 专业版 删除部分组件

office 2016 专业版 删除部分组件 ####1.打开控制面板 2.单击此选项 3.找到office 2016 右击选择更改 4.选择并确定 5.选择你想删除的组件(以Access为例) 6.单击此处 7.点击继续 8.等待 9.完成 此方法并不是真正的删除掉,仅仅是讲此模块禁用,若日后想重新启用,重复前五步操作,并在第六步操...