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 相关文章推荐
在textarea中显示html页面的javascript代码
Apr 20 Javascript
鼠标事件延时切换插件
Mar 12 Javascript
jquery实现网站超链接和图片提示效果
Mar 21 Javascript
jQuery使用load()方法载入另外一个网页文件内的指定标签内容到div标签的方法
Mar 25 Javascript
13个PHP函数超实用
Oct 21 Javascript
在JavaScript中call()与apply()区别
Jan 22 Javascript
AngularJS 中的事件详解
Jul 28 Javascript
js实现把图片的绝对路径转为base64字符串、blob对象再上传
Dec 29 Javascript
vue+axios实现登录拦截的实例代码
May 22 Javascript
使用webpack搭建react开发环境的方法
May 15 Javascript
详解js的视频和音频采集
Aug 09 Javascript
运用js实现图层拖拽的功能
May 24 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、MySQL 和 Zend Framework 的乱码问题
2009/03/03 PHP
深入php内核之php in array
2015/11/10 PHP
基于thinkphp6.0的success、error实现方法
2019/11/05 PHP
PHP设计模式之数据访问对象模式(DAO)原理与用法实例分析
2019/12/12 PHP
PHP基于进程控制函数实现多线程
2020/12/09 PHP
js操作select控件的几种方法
2010/06/02 Javascript
jQuery中使用了document和window哪些属性和方法小结
2011/09/13 Javascript
js冒泡法和数组转换成字符串示例代码
2013/08/14 Javascript
javascript的数组和常用函数详解
2014/05/09 Javascript
JS实现兼容各浏览器解析XML文档数据的方法
2015/06/01 Javascript
四种参数传递的形式——URL,超链接,js,form表单
2015/07/24 Javascript
jQuery实现带有动画效果的回到顶部和底部代码
2015/11/04 Javascript
JS实现简单的右下角弹出提示窗口完整实例
2016/06/21 Javascript
require简单实现单页应用程序(SPA)
2016/07/12 Javascript
基于JavaScript实现轮播图代码
2016/07/14 Javascript
jQuery webuploader分片上传大文件
2016/11/07 Javascript
Angular2学习教程之组件中的DOM操作详解
2017/05/28 Javascript
JavaScript门面模式详解
2017/10/19 Javascript
Vue中的异步组件函数实现代码
2018/07/20 Javascript
推荐15个最好用的JavaScript代码压缩工具
2019/02/13 Javascript
vue计算属性computed的使用方法示例
2019/03/13 Javascript
jQuery操作cookie的示例代码
2019/06/05 jQuery
vue如何实现自定义底部菜单栏
2019/07/01 Javascript
微信小程序实用代码段(收藏版)
2019/12/17 Javascript
vue-cli3单页构建大型项目方案
2020/04/07 Javascript
Jquery使用each函数实现遍历及数组处理
2020/07/14 jQuery
JavaScript实现多层颜色选项卡嵌套
2020/09/21 Javascript
[52:27]2018DOTA2亚洲邀请赛 3.31 小组赛B组 paiN vs Secret
2018/04/01 DOTA
python远程登录代码
2008/04/29 Python
python3使用pandas获取股票数据的方法
2018/12/22 Python
Django生成PDF文档显示网页上以及PDF中文显示乱码的解决方法
2019/12/17 Python
python实现简单的tcp 文件下载
2020/09/16 Python
加拿大城市本地限时优惠:Buytopia.ca
2018/09/19 全球购物
求职信的七个关键技巧
2014/02/05 职场文书
教育专业毕业生推荐信
2014/07/10 职场文书
公司开会通知
2015/04/20 职场文书