美文网首页
React-Router + Webpack懒加载

React-Router + Webpack懒加载

作者: Mr君 | 来源:发表于2018-12-16 11:33 被阅读0次
  1. 安装Bundle Loader
npm i bundle-loader --save
  1. 创建bundle.js
import React from 'react';

class Bundle extends React.Component {
    constructor(arg){
        super(arg)
        this.state = {
            mod: null,
        }
    }
    
    componentWillMount() {
        this.load(this.props);
    }
    componentWillReceiveProps(nextProps) {
        if (nextProps.load !== this.props.load) {
            this.load(nextProps);
        }
    }
    // load 方法,用于更新mod状态
    load(props) {
        // 初始化
        this.setState({
            mod: null
        });
        /*
            调用传入的load方法,并传入一个回调函数
            这个回调函数接收在load方法内部异步获取到组件,并将其更新为mod
        */ 
        props.load(mod => {
            this.setState({
            mod: mod.default ? mod.default : mod
            });
        });
    }

    render() {
        /*
            将存在状态中的mod组件作为参数传递给当前包装组件的子组件
        */ 
        return this.state.mod ? this.props.children(this.state.mod) : null;
    }
}

export default Bundle ;

  1. 创建lazyLoad.js文件
// 懶加載方法
import React from 'react';
import Bundle from './Bundle';

console.log(Bundle);
// 默认加载组件,可以直接返回null
const Loading = () => <div>Loading...</div>;

/*
   包装方法,第一次调用后悔返回一个组件(函数式组件)包装方法,第一次调用后会返回
   由于要将其作为路由下的组件,所以需要将props传入
*/

const lazyLoad = loadComponent => props => (
   <Bundle load={loadComponent}>
      {Comp => (Comp ? <Comp {...props} /> : <Loading />)}
   </Bundle>
);

console.log(lazyLoad);
export default lazyLoad;    // 实际上lazyLoad就是一个函数,组件调用即可
  1. 使用
import React from 'react';
import { NavLink,Route,Switch,BrowserRouter as Router } from 'react-router-dom'
import './style/style.css'
import 'bundle-loader'
// bundle模型用來異步加載組件
import Bundle from '../routes/Bundle.js';
import lazyLoad from '../routes/lazyLoad';

import Page1 from 'bundle-loader?lazy&name=page1!../components/page1/index';
import Page2 from 'bundle-loader?lazy&name=page2!../components/page2/index';
import Page3 from 'bundle-loader?lazy&name=page3!../components/page3/index';

class AppPage extends React.Component{
    constructor(arg){
        super(arg)

        this.state={}
    }
    render(){
        return(
            <Router  basename="/" >
                <div className="appWried">
                    <div className="appBtn">
                        <NavLink to="/page1" className="button" activeClassName="active">
                            PAGE1
                        </NavLink>
                        <NavLink to="/page2" className="button" activeClassName="active">
                            PAGE2
                        </NavLink>
                        <NavLink to="/page3" className="button" activeClassName="active">
                            PAGE3
                        </NavLink>
                    </div>
                    <Switch>
                        <Route path="/page1" component={lazyLoad(Page1)}/> 
                        <Route path="/page2" component={lazyLoad(Page2)}/> 
                        <Route path="/page3" component={lazyLoad(Page3)}/> 
                    </Switch>
                </div>
            </Router>
        )
    }
}

export default AppPage;

注意:
import 异步加载组件的时候,名字部分变更为
'bundle-loader?lazy&name=page1!../components/page1/index'
其中,bundle-loader表示按需加载模块,lazy表示lazy:true;懒加载
name表示异步生成的文档名字

//webpack.config.js
...
    module.exports = {
        ...
        output:{
         path: path.join(__dirname, "../build"),//出口文件
         filename: "[name].[hash:8].js",
         publicPath: "/",    //自動生成html引入js的路徑
         //按需加載
         chunkFilename:'[name].chunk.[hash:8].js'
        },
        ...
    }

这里需要注意一下publicPath这个参数。
如果未设置publicPath参数,折磨人打包生成html引入js文件为

<script type="text/javascript" src="bundle.js"></script>

如果设置publicPath为publicPath: './dist',则打包后html引入js的格式为:

<script type="text/javascript" src="/dist/bundle.js"></script>

相关文章

  • React-Router + Webpack懒加载

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

  • 用webpack实现模块懒加载、预取/预加载

    模块懒加载本身与webpack没有关系,webpack可以让懒加载的模块代码打包到单独的文件中,实现真正的按需加载...

  • webpack vue 异步组件加载 按需加载

    webpack分包:减少首屏加载时间-路由懒加载 使用webpack中的syntax-dynamic-import...

  • webpack打包代码实现

    webpack模块加载 异步模块加载 通过 import()实现指定模块的懒加载操作 懒加载的核心原理就是创建js...

  • webpack打包优化 - 懒加载

    webpack 懒加载 分割代码会产生chunk,异步加载的时候也会产生chunk 引入动态数据 -> 懒加载(当...

  • 懒加载

    知识点 webpack代码拆分动态倒入懒加载 1.懒加载 懒加载我们都知道,不即时加载所有资源,而是在需要的时候才...

  • Vue路由异步组件

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

  • vue 懒加载

    懒加载 为什么需要懒加载? 像vue这种单页面应用,如果没有应用懒加载,运用webpack打包后的文件将会异常的大...

  • webpack 懒加载

    使用 import 的动态引入方式,实现代码分割并异步的加载相应的内容具体步骤如下 1、安装 @babel/plu...

  • vue异步组件 懒加载& webpack按需加载——性能优化

    利用webpack对代码进行分割是懒加载的前提,懒加载就是异步调用组件,需要时候才下载(按需加载)。 为什么需要懒...

网友评论

      本文标题:React-Router + Webpack懒加载

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