react-router4的按需加载实践(基于create-react-app和Bundle组件)

react-router4的按需加载实践(基于create-react-app和Bundle组件)

大家好,又见面了,我是你们的朋友全栈君。

最近在网上也看到了react-router4的好多种按需加载的方法。

传送门:https://blog.csdn.net/foralienzhou/article/details/73437057

虽然自己的项目不大,但是也要区分前台和后台,如果让访问前台的用户也加载了后台的js代码,还是很影响体验的,所以挑了一种按需加载的方法进行实践(基于create-react-app和Bundle组件)。

import()

这里的import不同于模块引入时的import,可以理解为一个动态加载的模块的函数(function-like),传入其中的参数就是相应的模块。例如对于原有的模块引入import react from ‘react’可以写为import(‘react’)。但是需要注意的是,import()会返回一个Promise对象。因此,可以通过如下方式使用:

btn.addEventListener('click', e => {
    // 在这里加载chat组件相关资源 chat.js
    import('/components/chart').then(mod => {
        someOperate(mod);
    });
});
复制代码

可以看到,使用方式非常简单,和平时我们使用的Promise并没有区别。当然,也可以再加入一些异常处理:

btn.addEventListener('click', e => {
    import('/components/chart').then(mod => {
        someOperate(mod);
    }).catch(err => {
        console.log('failed');
    });
});
复制代码

我们首先需要一个异步加载的包装组件Bundle。Bundle的主要功能就是接收一个组件异步加载的方法,并返回相应的react组件。

import React from 'react';

export default class Bundle extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            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().then((mod) => {
            this.setState({
                mod: mod.default ? mod.default : mod
            });
        });
    }

    render() {
        return this.state.mod ? this.props.children(this.state.mod) : null;
    }
}

复制代码

引入模块的时候需要用Bundle组件包一下

import Bundle from './Bundle'
const Dashboard = (props) => (
    <Bundle load={() => import('./Dashboard')}>
        {(Dashboard) => <Dashboard {...props}/>}
    </Bundle>
);
复制代码

路由部分没有变化

<HashRouter>
    <Switch>
        <Route path='/' exact component={Index} />
        <Route path='/dashboard' component={Dashboard} />
    </Switch>
</Router>
复制代码

这时候,执行npm start,可以看到在载入最初的页面时加载的资源如下

而当点击触发到/dashboard路径时,可以看到

代码拆分在单页应用中非常常见,对于提高单页应用的性能与体验具有一定的帮助。按需加载的方式还不止这一种,还可以使用require.ensure()或者一些loader也可以同样实现这个功能。

如果加载的js很大,或者用户的网络状况不好的话,需要加上一个loading的效果,这里我用的是antd的Spin组件。在render函数的mod没set的时候加上就可以了。

render() {
    let spin = <div style={
   
   {textAlign: 'center', marginTop:50}}><Spin size="large"/><br/>正在玩命加载中。。。</div>;
    return  this.state.mod ? this.props.children(this.state.mod) : spin;
}
复制代码

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107561.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【《重构 改善既有代码的设计》学习笔记7】在对象之间搬移特性「建议收藏」

    本篇文章的内容来自《重构 改善既有代码的设计》一书学习笔记整理并且加上自己的浅显的思考总结!在对象之间搬移特性,核心就是: 决定把责任放在哪儿,重点关注责任,也就是尽量一个类之处理一类事情,或者是某个责任和这个类关系不大,就将此责任移动到关系大的类中。本篇内容两两放在一起,互相对比学习。也更方便理解和记忆。1、搬移函数(Move Method)&amp; 搬移字段(Move field…

    2022年2月27日
    33
  • vs2010 sp1下载_vs2005下载

    vs2010 sp1下载_vs2005下载vs2005sp1下载地址、安装方法–更新非常慢2007年03月14日下午09:17(转)VS2005SP1发布,解决只能创建WebSite,无法创建WebApplication项目的问题

    2022年9月28日
    0
  • mysql跨库分页、分表为什么这么难?[通俗易懂]

    mysql跨库分页、分表为什么这么难?[通俗易懂]前言:当业务数据达到一定量级(比如:mysql单表记录量>1千万)后,通常会考虑“分库分表”将数据分散到不同的库或表中,这样可以大大提高读/写性能。但是问题来了,对于select*fromtablelimitoffset,pagesize这种分页方式,原来一条语句就可以简单搞定的事情会变得很复杂,本文将与大家一起探讨分库分表后”分页”面临的新问题。mysql跨库分页、分表为什么这么难?一、分表对分页的影响1.1分段法1.2模余均摊法二、全局法(limitx+y)2.1按分段

    2022年7月20日
    9
  • 浏览器javascript 下载m3u8视频合成mp4

    浏览器javascript 下载m3u8视频合成mp4m3u8download.jsdownloadm3u8URLtomp4下载m3u8视频合成一个完整的mp4源码:https://github.com/ccjy88/m3u8download.js功能m3u8downloader是在chrome浏览器中运行的html和js,用于下载m3u8视频。当视频链接比如是https://test-streams.mux.dev/x36xh…

    2022年5月3日
    194
  • 多行注释快捷键_jsp注释快捷键

    多行注释快捷键_jsp注释快捷键1、Pycharm同时编辑多行:alt+shift+ctral+鼠标左键2、Pycharm同时多行注释:多行选中后ctrl+\

    2022年8月28日
    3
  • mysql配置环境变量(win 10)[通俗易懂]

    1、安装完mysql后就需要配置环境变量(win10)选择“我的电脑”,单击右键,选择“属性-&gt;高级-&gt;环境变量中的系统变量,对MYSQL_HOME、Path这2个系统变量分别设置如下相应的值(设置原则:如果存在相应的变量,直接对该变量进行编辑,注意只添加不删除;如果该变量不存在,则新建后再编辑。)这里由于没有于是就新建一个环境变量MYSQL_HOM MYSQL_H…

    2022年4月4日
    115

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号