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 相关文章推荐
Firefox和IE浏览器兼容JS脚本写法小结
Jul 07 Javascript
用JavaScript实现UrlEncode和UrlDecode的脚本代码
Jul 23 Javascript
JQuery 图片延迟加载并等比缩放插件
Nov 09 Javascript
jQuery中与toggleClass等价的程序段 以及未来学习的方向
Mar 18 Javascript
js简单实现HTML标签Select联动带跳转
Oct 23 Javascript
举例讲解如何判断JavaScript中对象的类型
Apr 22 Javascript
js实现的页面加载完毕之前loading提示效果完整示例【附demo源码下载】
Aug 02 Javascript
React注册倒计时功能的实现
Sep 06 Javascript
搭建基于express框架运行环境的方法步骤
Nov 15 Javascript
详解JWT token心得与使用实例
Aug 02 Javascript
layui实现tab的添加拒绝重复的方法
Sep 04 Javascript
Echarts实现单条折线可拖拽效果
Dec 19 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实现维护文件代码
2007/06/14 PHP
php fsockopen中多线程问题的解决办法[翻译]
2011/11/09 PHP
php实现读取超大文件的方法
2014/07/28 PHP
javascript 按回车键相应按钮提交事件
2009/11/02 Javascript
jquery实现input输入框实时输入触发事件代码
2014/01/28 Javascript
js获取元素相对窗口位置的实现代码
2014/09/28 Javascript
nodejs中操作mysql数据库示例
2014/12/20 NodeJs
JavaScript实现文字跟随鼠标特效
2015/08/06 Javascript
Angular中$compile源码分析
2016/01/28 Javascript
基于jQuery实现点击列表加载更多效果
2016/05/31 Javascript
微信小程序 图片等比例缩放(图片自适应屏幕)
2016/11/16 Javascript
Bootstrap3 模态框使用实例
2017/02/22 Javascript
AngularJS封装$http.post()实例详解
2017/05/06 Javascript
React-Native使用Mobx实现购物车功能
2017/09/14 Javascript
微信小程序实现预览图片功能
2020/10/22 Javascript
vue项目上传Github预览的实现示例
2018/11/06 Javascript
详解如何写出一个利于扩展的vue路由配置
2019/05/16 Javascript
基于jQuery实现挂号平台首页源码
2020/01/06 jQuery
Vue项目打包压缩的实现(让页面更快响应)
2020/03/10 Javascript
vue中使用router全局守卫实现页面拦截的示例
2020/10/23 Javascript
解决vue打包报错Unexpected token: punc的问题
2020/10/24 Javascript
vue的hash值原理也是table切换实例代码
2020/12/14 Vue.js
python学习笔记:字典的使用示例详解
2014/06/13 Python
python实现图书馆研习室自动预约功能
2018/04/27 Python
利用python如何处理百万条数据(适用java新手)
2018/06/06 Python
python复制列表时[:]和[::]之间有什么区别
2018/10/16 Python
对python中list的拷贝与numpy的array的拷贝详解
2019/01/29 Python
django 微信网页授权认证api的步骤详解
2019/07/30 Python
Python读取excel文件中带公式的值的实现
2020/04/17 Python
升级keras解决load_weights()中的未定义skip_mismatch关键字问题
2020/06/12 Python
在印度上传处方,在线订购药品:Medlife
2019/03/28 全球购物
什么是serialVersionUID
2016/03/04 面试题
期末自我鉴定
2014/01/23 职场文书
组工干部演讲稿
2014/09/02 职场文书
退休职工欢送会致辞
2015/08/01 职场文书
Nginx 过滤静态资源文件的访问日志的实现
2021/03/31 Servers