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操作对象数组的实现代码
Apr 27 Javascript
JavaScript事件处理器中的event参数使用介绍
May 24 Javascript
javascript内置对象操作详解
Feb 04 Javascript
动态创建按钮的JavaScript代码
Jan 29 Javascript
分享十三个最佳JavaScript数据网格库
Apr 07 Javascript
使用JavaScript实现一个小程序之99乘法表
Sep 21 Javascript
vue实现点击关注后及时更新列表功能
Jun 26 Javascript
vue展示dicom文件医疗系统的实现代码
Aug 27 Javascript
vscode 开发Vue项目的方法步骤
Nov 25 Javascript
Element Notification通知的实现示例
Jul 27 Javascript
快速解决Vue、element-ui的resetFields()方法重置表单无效的问题
Aug 12 Javascript
Vue实现开关按钮拖拽效果
Sep 22 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 将图片按创建时间进行分类存储的实现代码
2010/01/05 PHP
php结合表单实现一些简单功能的例子
2011/06/04 PHP
PHP记录搜索引擎蜘蛛访问网站足迹的方法
2015/04/15 PHP
PHP字符串与数组处理函数用法小结
2020/01/07 PHP
基于PHP实现堆排序原理及实例详解
2020/06/19 PHP
JS 强制设为首页的代码
2009/01/31 Javascript
JavaScript 一道字符串分解的题目
2011/08/03 Javascript
jQuery实现切换页面布局使用介绍
2011/10/09 Javascript
JavaScript中“+”的陷阱深刻理解
2012/12/04 Javascript
非常好用的JsonToString 方法 简单实例
2013/07/18 Javascript
JS this作用域以及GET传输值过长的问题解决方法
2013/08/06 Javascript
实例分析javascript中的call()和apply()方法
2014/11/28 Javascript
js实现字符串和数组之间相互转换操作
2016/01/12 Javascript
nodejs利用ajax实现网页无刷新上传图片实例代码
2017/06/06 NodeJs
详解如何使用nvm管理Node.js多版本
2019/05/06 Javascript
React+TypeScript+webpack4多入口配置详解
2019/08/08 Javascript
d3.js实现图形缩放平移
2019/12/19 Javascript
解决vue-router 切换tab标签关闭时缓存问题
2020/07/22 Javascript
js实现筛选功能
2020/11/24 Javascript
[02:25]DOTA2英雄基础教程 生死判决瘟疫法师
2013/12/06 DOTA
Python实现的金山快盘的签到程序
2013/01/17 Python
Python聚类算法之凝聚层次聚类实例分析
2015/11/20 Python
Python OpenCV处理图像之图像直方图和反向投影
2018/07/10 Python
基于Python的ModbusTCP客户端实现详解
2019/07/13 Python
使用Python为中秋节绘制一块美味的月饼
2019/09/11 Python
Python库skimage绘制二值图像代码实例
2020/04/10 Python
python为什么会环境变量设置不成功
2020/06/23 Python
Python unittest生成测试报告过程解析
2020/09/08 Python
Django生成数据库及添加用户报错解决方案
2020/10/09 Python
利用python实现汉诺塔游戏
2021/03/01 Python
英国领先的电视购物零售商:Ideal World
2019/03/18 全球购物
Puccini乌克兰:购买行李箱、女士手袋网上商店
2020/08/06 全球购物
高级Java程序员面试题
2016/06/23 面试题
护理学专业求职信
2014/06/29 职场文书
2015年实习生工作总结报告
2015/04/28 职场文书
债务追讨律师函
2015/06/24 职场文书