美文网首页React.js学习React
Webpack懒加载React Router的页面组件

Webpack懒加载React Router的页面组件

作者: 一米米尺 | 来源:发表于2017-10-22 21:07 被阅读92次

在浏览器打开React单页应用,习惯上会把整个应用所有的JS文件一次性加载完。什么?暂时不需要的JS文件也要加载,这肯定很慢吧?对。那你不妨试试下面这种对JS文件的懒加载,看合不合你项目使用。

一、安装bundle-loader依赖

npm i --save-dev bundle-loader

二、定义一个叫作lazy.js的React高阶类。

import React, {Component} from 'react'
import PropTypes from 'prop-types'

class Lazy extends 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((mod) => {
            this.setState({
                mod: mod.default ? mod.default : mod
            })
        })
    }

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

Bundle.propTypes = {
    load: PropTypes.any,
    children: PropTypes.any
}

export default function lazy (lazyClass) {
    return function Wrapper (props) {
        return <Bundle load={lazyClass}>
            {(Clazz) => <Clazz {...props} />}
        </Bundle>
    }
}

三、对<Router>部分的代码进行修改。

改前:

            <Router history={hashHistory}>
                <div>
                    <Route exact path={['/', '/index.html']} component={Home} />
                    <Route path='/case' component={Demo} />
                    <Route path='/about' component={About} />
                    <Route path='/article' component={Article} />
                </div>
            </Router>

改后:

            <Router history={hashHistory}>
                <div>
                    <Route exact path={['/', '/index.html']} component={lazy(Home)} />
                    <Route path='/case' component={lazy(Demo)} />
                    <Route path='/about' component={lazy(About)} />
                    <Route path='/article' component={lazy(Article)} />
                </div>
            </Router>

使用之前,记得先把lazy.js import进来。如

import lazy from './lazy.js'

看到没有,就是用一个叫做lazy()的方法,去包住原来的那个React自定义组件名,如Home, About等。

四、正常运行你的webpack的编译过程,你会发现原来所生成的单一的JS文件,如bundle.js,现在已经变成了像下面这样的四个文件。

bundle.js
bundle-0.js
bundle-1.js
bundle-2.js
bundle-3.js

五、快去打开浏览器看看,是不是真的实现了JS懒加载。

如打开http://localhost:7000/about,会加载bundle.js和bundle-3.js

image.png

如打开http://localhost:7000/case,会加载bundle.js和bundle-1.js

image.png

(本文供刁导参考)

相关文章

  • Webpack懒加载React Router的页面组件

    在浏览器打开React单页应用,习惯上会把整个应用所有的JS文件一次性加载完。什么?暂时不需要的JS文件也要加载,...

  • Vue路由懒加载-prefetch预加载问题

    通常项目配置router的懒加载,基于webpack4+和ES6,最简单的写法是 此时文件加载按页面引入,每个页面...

  • vue按需加载

    问题 一个单页面应用,采用组件化的开发模式,没有采用懒加载,运用webpack打包,每次启动首页都会加载全部组件,...

  • React-Router + Webpack懒加载

    安装Bundle Loader 创建bundle.js 创建lazyLoad.js文件 使用 注意:import ...

  • Webpack Vue 技巧总结[按需加载, 懒加载,vue-r

    1. 懒加载 SPA 应用中....所以.... 常见的比如在 vue-router 中使用懒加载 webpack...

  • 踩坑记录——React.lazy

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

  • Vue优化总结(持续更新中。。。)

    Vue-Router路由懒加载(利用Webpack的代码切割) 把不同路由对应的组件分割为不同的代码块,当路由被访...

  • Vue路由异步组件

    vue异步组件和懒加载可以优化vue的性能 一、 原理 利用webpack对代码进行分割是懒加载的前提,懒加载就是...

  • vue项目按需加载

    原理:利用webpack对代码进行分割是懒加载的前提,懒加载就是异步调用组件,需要时候才下载。 1、vue异步组件...

  • vue-01

    vue+webpack 优化 一.异步加载 1.异步加载组件,其实就是组件懒加载。可以理解为:当我需要使用组件的时...

网友评论

  • 764790a9209c:Bundle.propTypes = {
    load: PropTypes.any,
    children: PropTypes.any
    }
    好吧,Bundle从哪里来?少了点东西。bundle-loader 在webpack要配置吗
  • 一米米尺:果然是好文章。。。

本文标题:Webpack懒加载React Router的页面组件

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