Webpack + react-router 按需加载

webpack + react-router 按需加载

关键函数

require.ensure(dependencies, callback, chunkName)
详情请见官方文档

webpack 配置

output: {
    path: path.join(__dirname, '../dist'),
    filename: '[name].js',
    sourceMapFilename: '[file].map',
    publicPath: '/static/',
    //加这个!
    chunkFilename: '[name].[chunkhash:5].chunk.js',
},

name 表示创建的chunk的指定名字,如果未指定则用id作为name
chunkhash 是文件的 hash 码,用来保证文件的唯一性,这里使用前五位(前几位可随意选取)

结合react-router

中文文档在这里!
其中提供了三个函数分别是:

  • getChildRoutes
  • getIndexRoute
  • getComponents

他们的作用都是访问到当前路由时才会去加载脚本,由此按需加载便得以实现。
官方的例子中使用的是以对象的形式构建路由,在此,我觉得用jsx更加直观。
所以我们需要将原本Route组件的component属性换成getComponent以此来运行我们的关键函数。

示例代码

import React from 'react';
import {
    Route,
    IndexRedirect,
} from 'react-router';
import rootNode from './rootNode';

const routes = (
    <div>
        <Route path='/' component={rootNode}>
            <IndexRedirect to='index' />
            <Route
                path='index'
                getComponent={(location, cb) => {
                                require.ensure([], require => {
                                    cb(null, require('components/Index').default);
                                }, 'index');
                            }} />
        </Route>
    </div>
);

export default routes;

这样按需就在就完成了,但是我们可以用更优雅的方式来写。

import React from 'react';
import {
    Route,
    IndexRedirect,
} from 'react-router';
import rootNode from './rootNode';

const index  = (location, cb) => {
  require.ensure([], require => {
    cb(null, require('components/Index').default);
  }, 'index');
};

const routes = (
        <Route path='/' component={rootNode}>
            <IndexRedirect to='index' />
            <Route path='index' getComponent={index} />
        </Route>
    );

export default routes;

将对应组件的加载函数进行封装,这样更加直观易懂。
注意点

1、require(‘components/Index’).default中require方法的参数不能使用变量,只能使用字符串!

2、如果你的组件是使用es5的module.exports导出的话,那么只需要require(‘components/Index’)即可。而如果你的组件是使用es6的export
default导出的话,那么需要加上default!例如:require(‘components/Index’).default

3、如果在路由页面使用了按需加载(require.ensure)加载路由级组件的方式,那么在其他地方(包括本页面)就不要再import了,否则不会打包生成chunk文件。简而言之,需要按需加载的路由级组件必须在路由页面进行加载。

未使用redux:react-hot
使用redux:react-redux-github
使用redux:react-redux-github

参考

1、react-router 按需加载
2、webpack 按需打包加载

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值