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小括号“()”的多义性
Dec 03 Javascript
JQuery性能优化的几点建议
May 14 Javascript
Js使用WScript.Shell对象执行.bat文件和cmd命令
Dec 18 Javascript
深入理解JavaScript系列(38):设计模式之职责链模式详解
Mar 04 Javascript
微信小程序获取循环元素id以及wx.login登录操作
Aug 17 Javascript
JavaScript中递归实现的方法及其区别
Sep 12 Javascript
Three.js利用顶点绘制立方体的方法详解
Sep 27 Javascript
jQuery创建及操作xml格式数据示例
May 26 jQuery
javascript少儿编程关于返回值的函数内容
May 27 Javascript
vue实现下拉加载其实没那么复杂
Aug 13 Javascript
vue页面跳转实现页面缓存操作
Jul 22 Javascript
vant picker+popup 自定义三级联动案例
Nov 04 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中设置、使用、删除Cookie的解决方法
2013/05/06 PHP
解决PHP程序运行时:Fatal error: Maximum execution time of 30 seconds exceeded in的错误提示
2016/11/25 PHP
Yii框架实现记录日志到自定义文件的方法
2017/05/23 PHP
浅析PHP中的闭包和匿名函数
2017/12/25 PHP
jqgrid 编辑添加功能详细解析
2013/11/08 Javascript
Jquery模仿Baidu、Google搜索时自动补充搜索结果提示
2013/12/26 Javascript
javascript 判断两个日期之差的示例代码
2015/09/05 Javascript
基于jQuery实现select下拉选择可输入附源码下载
2016/02/03 Javascript
创建一个类Person的简单实例
2016/05/17 Javascript
Angular 中 select指令用法详解
2016/09/29 Javascript
Javascript 函数的四种调用模式
2016/11/05 Javascript
jquery插件bootstrapValidator表单验证详解
2016/12/15 Javascript
React Form组件的实现封装杂谈
2018/05/07 Javascript
JS 实现分页打印功能
2018/05/16 Javascript
微信小程序实现录音时的麦克风动画效果实例
2019/05/18 Javascript
JS使用new操作符创建对象的方法分析
2019/05/30 Javascript
JS随机密码生成算法
2019/09/23 Javascript
[54:45]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 Optic vs OG
2018/04/02 DOTA
Python使用win32com模块实现数据库表结构自动生成word表格的方法
2018/07/17 Python
python用fsolve、leastsq对非线性方程组求解
2018/12/15 Python
linux下安装python3和对应的pip环境教程详解
2019/07/01 Python
django 扩展user用户字段inlines方式
2020/03/30 Python
python实现坦克大战
2020/04/24 Python
Python退出时强制运行一段代码的实现方法
2020/04/29 Python
快速创建python 虚拟环境
2020/11/28 Python
Html5插件教程之添加浏览器放大镜效果的商品橱窗
2016/01/07 HTML / CSS
C语言笔试集
2012/07/24 面试题
生产总经理岗位职责
2013/12/19 职场文书
员工工作表扬信范文
2014/01/13 职场文书
如何编写优秀的食品项目创业计划书
2014/01/23 职场文书
工伤事故赔偿协议书(标准)
2014/09/29 职场文书
法院执行局工作总结
2015/08/11 职场文书
学雷锋主题班会教案
2015/08/13 职场文书
2016廉洁教育心得体会
2016/01/20 职场文书
2019年冬至:天冷暖人心的问候祝福语大全
2019/12/20 职场文书
Laravel中获取IP的真实地理位置
2021/04/01 PHP