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 相关文章推荐
基于jquery的滚动新闻列表
Jun 19 Javascript
Jquery+CSS3实现一款简洁大气带滑动效果的弹出层
May 15 Javascript
js css 实现遮罩层覆盖其他页面元素附图
Sep 22 Javascript
node+express+jade制作简单网站指南
Nov 26 Javascript
JavaScript原生对象之String对象的属性和方法详解
Mar 13 Javascript
jquery实现通用的内容渐显Tab选项卡效果
Sep 07 Javascript
jQuery实现浮动层随浏览器滚动条滚动的方法
Sep 22 Javascript
VueJS全面解析
Nov 10 Javascript
微信小程序 配置文件详细介绍
Dec 14 Javascript
关于vue单文件中引用路径的处理方法
Jan 08 Javascript
对vue2.0中.vue文件页面跳转之.$router.push的用法详解
Aug 24 Javascript
关于在LayUI中使用AJAX提交巨坑记录
Oct 25 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函数之error_reporting(E_ALL ^ E_NOTICE)详细说明
2011/07/01 PHP
最常用的8款PHP调试工具
2014/07/06 PHP
php查询ip所在地的方法
2014/12/05 PHP
支付宝接口开发集成支付环境小结
2015/03/17 PHP
thinkPHP中验证码的简单实现方法
2016/12/05 PHP
基于laravel缓冲cache的用法详解
2019/10/23 PHP
javascript form 验证函数 弹出对话框形式
2009/06/23 Javascript
Jquery中Ajax 缓存带来的影响的解决方法
2011/05/19 Javascript
基于mouseout和mouseover等类似事件的冒泡问题解决方法
2013/11/18 Javascript
LABjs、RequireJS、SeaJS的区别
2014/03/04 Javascript
jQuery的ready方法详解
2014/11/27 Javascript
jQuery中$.extend()用法实例
2015/06/24 Javascript
jquery实现可点击伸缩与展开的菜单效果代码
2015/08/31 Javascript
jQuery+Ajax+PHP+Mysql实现分页显示数据实例讲解
2015/09/27 Javascript
vue.js根据代码运行环境选择baseurl的方法
2018/02/28 Javascript
浅谈angularJs函数的使用方法(大小写转换,拷贝,扩充对象)
2018/10/08 Javascript
Vue中点击active并第一个默认选中功能的实现
2020/02/24 Javascript
[01:28:31]《加油DOTA》真人秀 第五期
2014/09/01 DOTA
深入解析Python中的descriptor描述器的作用及用法
2016/06/27 Python
浅谈Python大神都是这样处理XML文件的
2019/05/31 Python
基于python的列表list和集合set操作
2019/11/24 Python
python3通过subprocess模块调用脚本并和脚本交互的操作
2020/12/05 Python
CSS3实现多重边框的方法总结
2016/05/31 HTML / CSS
西班牙电子产品购物网站:Electronicamente
2018/07/26 全球购物
加拿大著名的奢侈品购物网站:SSENSE(支持中文)
2020/06/25 全球购物
JPA的特点
2014/10/25 面试题
公司前台辞职报告
2014/01/19 职场文书
汽车装潢店创业计划书范文
2014/02/05 职场文书
个人承诺书
2014/03/26 职场文书
优秀党务工作者先进事迹材料
2014/12/25 职场文书
2015年服务员工作总结
2015/04/08 职场文书
毕业论文致谢信
2015/05/14 职场文书
2020年元旦祝福语录,总有适合你的
2019/12/31 职场文书
Nginx下配置Https证书详细过程
2021/04/01 Servers
MySQL日期时间函数知识汇总
2022/03/17 MySQL
Redis监控工具RedisInsight安装与使用
2022/03/21 Redis