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 相关文章推荐
div当滚动到页面顶部的时候固定在顶部实例代码
May 27 Javascript
jquery 取子节点及当前节点属性值的方法
Aug 24 Javascript
jQuery扁平化风格下拉框美化插件FancySelect使用指南
Feb 10 Javascript
百度地图API之本地搜索与范围搜索
Jul 30 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(二)
Jan 21 Javascript
jQuery复合事件结合toggle()方法的用法示例
Jun 10 jQuery
vue-router3.0版本中 router.push 不能刷新页面的问题
May 10 Javascript
Vue配合iView实现省市二级联动的示例代码
Jul 27 Javascript
Vuex的基本概念、项目搭建以及入坑点
Nov 04 Javascript
js实现unicode码字符串与utf8字节数据互转详解
Mar 21 Javascript
javascript实现简易的计算器
Jan 17 Javascript
JavaScript实现手风琴效果
Feb 18 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中使用Akismet防止垃圾评论的代码
2011/06/10 PHP
PHP Error与Logging函数的深入理解
2013/06/03 PHP
PHP的curl实现get,post和cookie(实例介绍)
2013/06/17 PHP
Smarty变量调节器失效的解决办法
2014/08/20 PHP
ThinkPHP模板之变量输出、自定义函数与判断语句用法
2014/11/01 PHP
php获取CSS文件中图片地址并下载到本地的方法
2014/12/02 PHP
浅谈PHP中如何实现Hook机制
2017/11/14 PHP
js 加载时自动调整图片大小
2008/05/28 Javascript
Ajax同步与异步传输的示例代码
2013/11/21 Javascript
js 处理数组重复元素示例代码
2013/12/27 Javascript
angularJS 中$attrs方法使用指南
2015/02/09 Javascript
AngularJS进行性能调优的7个建议
2015/12/28 Javascript
基于JavaScript如何制作遮罩层对话框
2016/01/26 Javascript
Vue.js路由组件vue-router使用方法详解
2016/12/02 Javascript
详解Node.js 命令行程序开发教程
2017/06/07 Javascript
详解如何使用Node.js编写命令工具——以vue-cli为例
2017/06/29 Javascript
element ui table(表格)实现点击一行展开功能
2018/12/04 Javascript
python通过scapy获取局域网所有主机mac地址示例
2014/05/04 Python
Python中replace方法实例分析
2014/08/20 Python
基于tensorflow加载部分层的方法
2018/07/26 Python
python实现证件照换底功能
2019/08/20 Python
python 解决Fatal error in launcher:错误问题
2020/05/21 Python
浅析python 字典嵌套
2020/09/29 Python
Python + opencv对拍照得到的图片进行背景去除的实现方法
2020/11/18 Python
python 基于opencv 绘制图像轮廓
2020/12/11 Python
css3实现元素环绕中心点布局的方法示例
2019/01/15 HTML / CSS
彪马西班牙官网:PUMA西班牙
2019/06/18 全球购物
工艺员岗位职责
2014/02/11 职场文书
母亲节感恩寄语
2014/02/21 职场文书
专项法律服务方案
2014/06/11 职场文书
关于感恩的演讲稿500字
2014/08/26 职场文书
实习介绍信模板
2015/01/30 职场文书
大学生十八大感想
2015/08/11 职场文书
2015年度女工工作总结
2015/10/22 职场文书
React实现动效弹窗组件
2021/06/21 Javascript
Qt自定义Plot实现曲线绘制的详细过程
2021/11/02 Python