React-router中结合webpack实现按需加载实例


Posted in Javascript onMay 25, 2017

简要介绍:在React-router中,暴露了3个接口,如果结合webpack的code splitting,就通过切换路由实现按需加载。

1.webpack的code splitting

webpack可以通过一些方法,来实现按需加载,暴露的接口为require.ensure

require.ensure(["module-a", "module-b"], function() {
 var a = require("module-a");
 // ...
});

这个require.ensure保证了模块的异步调用,当callback回调中调用了一个模块的时候,可以实现按需加载。

2.React-router实现按需加载的接口

React-router定义了 getChildRoutes, getIndexRoute, getComponents这样3个方法,这3个方法是异步的,并且只在需要的时候调用,通过这3个方法定义的路由,我们称之为“渐进式路由匹配”,React-router在匹配到路由时,只是渐进式的加载改路由所需要的组件,这样就能实现按需加载。

(1)webpack的配置:

output: {
    path: __dirname + '/dist/js/',
    publicPath:'/js/',
    filename: '[name].js',
    chunkFilename: '[name].[chunkhash:5].chunk.js'
  },

在这里我们加上了chunkFilename:…. 这句代码用于分割js,特别注意publicPath这个路径要与服务器的资源的路径对应,否则加载js的时候会出现404错误。

(2)通过getComponents等3个方法重新配置路由

export const routes={
 path:'/',
 getComponent(nextState,callback){
  require.ensure([],require=>{
   callback(null,require('../components/nav').default);
  },'nav');
 },
 indexRoute:{
  getComponent(nextState,callback){
   require.ensure([],require=>{
    callback(null,require('../components/examine').default);
   },'examine');
  }
 },
 childRoutes:[{
  path:'examine',
  getComponent(nextState,callback){
   require.ensure([],require=>{
    callback(null,require('../components/examine').default);
   },'examine');
   }
 },
 {
  path:'admin',
  getComponent(nextState,callback){
   require.ensure([],require=>{
    callback(null,require('../components/admin').default);
   },'admin');
  }
 },
 {
  path:'history',
  getComponent(nextState,callback){
   require.ensure([],require=>{
    callback(null,require('../components/history').default);
   },'history');
  }
 },
 {
  path:'feedback',
  getComponent(nextState,callback){
   require.ensure([],require=>{
    callback(null,require('../components/feedback').default);
   },'feedback')
  }
 }
]
};

这里我们将路由定义中的component替换成了 getComponent。

(3)最后效果:

首页时候,加载了examine.js和nav.js:

React-router中结合webpack实现按需加载实例

切换路由时,比如从首页切换到了商品管理,这样除了加载examine.js外,多加载了admin.js:

React-router中结合webpack实现按需加载实例

(4)总结:

我们看到react-router的按需加载,作用主要表现在可以减少首页请求的文件的大小。

3.注意事项:

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文件。简而言之,需要按需加载的路由级组件必须在路由页面进行加载。

特别是第3点,笔者就是因为这个原因导致按需加载失败,特别注意import不能在任何地方引入按需加载的组件。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery1.4 教程二 ajax方法的改进
Feb 25 Javascript
FireBug 调试JS入门教程 如何调试JS
Dec 23 Javascript
jquery实现邮箱自动补全功能示例分享
Feb 17 Javascript
jquery实现的网页自动播放声音
Apr 30 Javascript
jQuery实现购物车计算价格功能的方法
Mar 25 Javascript
JS正则表达式修饰符中multiline(/m)用法分析
Dec 27 Javascript
jQuery插件HighCharts绘制2D柱状图、折线图的组合双轴图效果示例【附demo源码下载】
Mar 09 Javascript
underscore之Chaining_动力节点Java学院整理
Jul 10 Javascript
vue2.0 datepicker使用方法
Feb 04 Javascript
vue项目搭建以及全家桶的使用详细教程(小结)
Dec 19 Javascript
vue柱状进度条图像的完美实现方案
Aug 26 Javascript
Vue项目结合Vue-layer实现弹框式编辑功能(实例代码)
Mar 11 Javascript
node.js操作mongodb简单示例分享
May 25 #Javascript
React-router 4 按需加载的实现方式及原理详解
May 25 #Javascript
node.js操作mysql简单实例
May 25 #Javascript
基于vue实现swipe分页组件实例
May 25 #Javascript
Javascript 实现匿名递归的实例代码
May 25 #Javascript
Kotlin学习第一步 kotlin语法特性
May 25 #Javascript
jQuery Masonry瀑布流布局神器使用详解
May 25 #jQuery
You might like
php 获取当前访问的url文件名的方法小结
2010/02/08 PHP
php function用法如何递归及return和echo区别
2014/03/07 PHP
ucenter中词语过滤原理分析
2016/07/13 PHP
ThinkPHP+EasyUI之ComboTree中的会计科目树形菜单实现方法
2017/06/09 PHP
JavaScript 内置对象属性及方法集合
2010/07/04 Javascript
jQuery实现dialog设置focus焦点的方法
2015/06/10 Javascript
使用Browserify配合jQuery进行编程的超级指南
2015/07/28 Javascript
Jquery 1.9.1源码分析系列(十二)之筛选操作
2015/12/02 Javascript
BootStrap中Datetimepicker和uploadify插件应用实例小结
2016/05/26 Javascript
BootStrap 动态添加验证项和取消验证项的实现方法
2016/09/28 Javascript
详解如何使用Node.js编写命令工具——以vue-cli为例
2017/06/29 Javascript
vue利用axios来完成数据的交互
2018/03/23 Javascript
vue.js 添加 fastclick的支持方法
2018/08/28 Javascript
Webstorm2016使用技巧(SVN插件使用)
2018/10/29 Javascript
使用React手写一个对话框或模态框的方法示例
2019/04/25 Javascript
使用pkg打包ThinkJS项目的方法步骤
2019/12/30 Javascript
JavaScript代码压缩工具UglifyJS和Google Closure Compiler的基本用法
2020/04/13 Javascript
JavaScript实现表单验证功能
2020/12/09 Javascript
Python 中 list 的各项操作技巧
2017/04/13 Python
python编程通过蒙特卡洛法计算定积分详解
2017/12/13 Python
python 使用值来排序一个字典的方法
2018/11/16 Python
Python aiohttp百万并发极限测试实例分析
2019/10/26 Python
Python中bisect的使用方法
2019/12/31 Python
python爬虫利用selenium实现自动翻页爬取某鱼数据的思路详解
2020/12/22 Python
css和css3弹性盒模型实现元素宽度(高度)自适应
2019/05/15 HTML / CSS
canvas实现扭蛋机动画效果的示例代码
2018/10/17 HTML / CSS
美国正版电视节目和电影在线观看:Hulu
2018/05/24 全球购物
用C#语言写出在本地创建一个UDP接收端口的具体过程
2016/02/22 面试题
C#面试题问题集
2016/04/02 面试题
医学院学生的自我评价分享
2013/11/19 职场文书
运动会入场词100字
2014/02/06 职场文书
《中国梦我的梦》中学生演讲稿
2014/08/20 职场文书
企业百日安全活动总结
2015/05/07 职场文书
幼儿园保教工作总结2015
2015/10/15 职场文书
创业计划书之熟食店
2019/10/16 职场文书
pycharm debug 断点调试心得分享
2021/04/16 Python