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 相关文章推荐
Javascript 更新 JavaScript 数组的 uniq 方法
Jan 23 Javascript
UserData用法总结 lanyu出品
Jul 01 Javascript
flexigrid 参数说明
Nov 23 Javascript
javascript中局部变量和全局变量的区别详解
Feb 27 Javascript
js实现类似jquery里animate动画效果的方法
Apr 10 Javascript
javascript小数精度丢失的完美解决方法
May 31 Javascript
BootStrap 智能表单实战系列(十)自动完成组件的支持
Jun 13 Javascript
利用Node.js了解与测量HTTP所花费的时间详解
Sep 22 Javascript
vue中实现先请求数据再渲染dom分享
Mar 17 Javascript
JS实现图片懒加载(lazyload)过程详解
Apr 02 Javascript
javascript使用Blob对象实现的下载文件操作示例
Apr 18 Javascript
Vue实现图书管理小案例
Dec 03 Vue.js
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中通过加号合并数组的一个简单方法分享
2011/01/27 PHP
基于php伪静态的实现详细介绍
2013/04/28 PHP
php从文件夹随机读取文件的方法
2015/06/01 PHP
Laravel模糊查询区分大小写的实例
2019/09/29 PHP
用按钮控制iframe显示的网页实现方法
2013/02/04 Javascript
select标签模拟/美化方法采用JS外挂式插件
2013/04/01 Javascript
使用jquery菜单插件HoverTree仿京东无限级菜单
2014/12/18 Javascript
JS实现网页表格自动变大缩小的方法
2015/03/09 Javascript
jquery计算鼠标和指定元素之间距离的方法
2015/06/26 Javascript
jquery实现鼠标点击后展开列表内容的导航栏效果
2015/09/14 Javascript
JS实现下拉菜单列表与登录注册弹窗效果
2017/08/10 Javascript
angularjs实现过滤并替换关键字小功能
2017/09/19 Javascript
Vue中的无限加载vue-infinite-loading的方法
2018/04/08 Javascript
解决vue脚手架项目打包后路由视图不显示的问题
2018/09/20 Javascript
Iview Table组件中各种组件扩展的使用
2018/10/20 Javascript
ES6知识点整理之数组解构和字符串解构的应用示例
2019/04/17 Javascript
jquery选择器和属性对象的操作实例分析
2020/01/10 jQuery
WebStorm中如何将自己的代码上传到github示例详解
2020/10/28 Javascript
[02:09]DOTA2辉夜杯 EHOME夺冠举杯现场
2015/12/28 DOTA
python比较两个列表大小的方法
2015/07/11 Python
浅析Python编写函数装饰器
2016/03/18 Python
wxPython之解决闪烁的问题
2018/01/15 Python
Python使用matplotlib简单绘图示例
2018/02/01 Python
pip安装时ReadTimeoutError的解决方法
2018/06/12 Python
pandas的resample重采样的使用
2020/04/24 Python
Python多个装饰器的调用顺序实例解析
2020/05/22 Python
Django model重写save方法及update踩坑详解
2020/07/27 Python
详解scrapy内置中间件的顺序
2020/09/28 Python
通过代码实例了解Python3编程技巧
2020/10/13 Python
CSS Houdini实现动态波浪纹效果
2019/07/30 HTML / CSS
HTML5各种头部meta标签的功能(推荐)
2017/03/13 HTML / CSS
英国最大的汽车配件在线商店:Euro Car Parts
2019/09/30 全球购物
中秋节礼品促销方案
2014/02/02 职场文书
建设幸福中国演讲稿
2014/09/11 职场文书
2014财产信托协议书范本
2014/11/18 职场文书
2015年清明节网上祭英烈留言寄语
2015/03/04 职场文书