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下IE与Firefox下的差异兼容写法总结
Jun 18 Javascript
js+css 实现遮罩居中弹出层(随浏览器窗口滚动条滚动)
Dec 11 Javascript
js弹出div并显示遮罩层
Feb 12 Javascript
jQuery实现的个性化返回底部与返回顶部特效代码
Oct 30 Javascript
基于jQuery实现复选框是否选中进行答题提示
Dec 10 Javascript
JS判断输入字符串长度实例代码(汉字算两个字符,字母数字算一个)
Aug 02 Javascript
vue2.0嵌套路由实现豆瓣电影分页功能(附demo)
Mar 13 Javascript
Vue的土著指令和自定义指令实例详解
Feb 04 Javascript
AngularJs返回前一页面时刷新一次前面页面的方法
Oct 09 Javascript
小程序从手动埋点到自动埋点的实现方法
Jan 24 Javascript
node.js ws模块搭建websocket服务端的方法示例
Apr 25 Javascript
小程序角标的添加及绑定购物车数量进行实时更新的实现代码
Dec 07 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
ajax php 实现写入数据库
2009/09/02 PHP
浅谈PHP 闭包特性在实际应用中的问题
2009/10/30 PHP
PHP数组对比函数,存在交集则返回真,否则返回假
2011/02/03 PHP
php中根据某年第几天计算出日期年月日的代码
2011/02/24 PHP
PHP统计目录中文件以及目录中目录大小的方法
2016/01/09 PHP
Yii框架表单模型和验证用法
2016/05/20 PHP
php版微信公众平台实现预约提交后发送email的方法
2016/09/26 PHP
PHP获取链表中倒数第K个节点的方法
2018/01/18 PHP
ExtJS下grid的一些属性说明
2009/12/13 Javascript
Dom 结点创建 基础知识
2011/10/01 Javascript
jQuery实现鼠标单击网页文字后在文本框显示的方法
2015/05/06 Javascript
浅谈Javascript中的12种DOM节点类型
2016/08/19 Javascript
jQuery生成假加载动画效果
2016/12/01 Javascript
TypeScript入门-接口
2017/03/30 Javascript
微信小程序搜索组件wxSearch实例详解
2017/06/08 Javascript
webpack中CommonsChunkPlugin详细教程(小结)
2017/11/09 Javascript
JavaScript canvas实现围绕旋转动画
2017/11/18 Javascript
如何实现小程序tab栏下划线动画效果
2019/05/18 Javascript
vue 路由守卫(导航守卫)及其具体使用
2020/02/25 Javascript
关于angular浏览器兼容性问题的解决方案
2020/07/26 Javascript
简单实现python进度条脚本
2017/12/18 Python
Python生成器generator用法示例
2018/08/10 Python
python梯度下降法的简单示例
2018/08/31 Python
python爬取cnvd漏洞库信息的实例
2019/02/14 Python
让Python脚本暂停执行的几种方法(小结)
2019/07/11 Python
Python 日志logging模块用法简单示例
2019/10/18 Python
python 读取数据库并绘图的实例
2019/12/03 Python
Python TestSuite生成测试报告过程解析
2020/07/23 Python
html+css3实现的登录界面
2020/12/09 HTML / CSS
HTML5 实现图片上传预处理功能
2020/02/06 HTML / CSS
《哪吒闹海》教学反思
2014/02/28 职场文书
理想演讲稿范文
2014/05/21 职场文书
师范生免费教育协议书范本
2014/10/09 职场文书
开业典礼致辞
2015/07/29 职场文书
董事长新年致辞
2015/07/29 职场文书
导游词之山西-五老峰
2019/10/07 职场文书