react-router实现按需加载


Posted in Javascript onMay 09, 2017

本文使用的 React-router 版本为 2.8.1

React Router自己就有一套按需加载解决方案,将代码拆分成多个小包,在浏览过程中实现按需加载;

如过你的项目搭配了webpack打包工具,那么需要在webpack.config.js的output内加上chunkFilename

output: {
  path: path.join(__dirname, '/../dist/assets'),
  filename: 'app.js',
  publicPath: defaultSettings.publicPath,
  // 添加 chunkFilename
  chunkFilename: '[name].[chunkhash:5].chunk.js',
},

name是代码里创建chunk指定的名字,如果代码中没有指定,则webpack会默认分配id号码作为name;

chunkhash是文件的hash码,因为hash码比较长,所以这里只取前五位。

我们需要让路由动态加载组件,需要将 component 换成 getComponent。首先将路由拆出来,创建一个根路由 rootRoute:

const rootRoute = {
 path: '/',
 indexRoute: {
  getComponent(nextState, cb) {
   require.ensure([], (require) => {
    cb(null, require('components/layer/HomePage'))
   }, 'HomePage')
  },
 },
 getComponent(nextState, cb) {
  require.ensure([], (require) => {
   cb(null, require('components/Main'))
  }, 'Main')
 },
 childRoutes: [
  require('./routes/baidu'),
  require('./routes/404'),
  require('./routes/redirect')
 ]
}

ReactDOM.render(
 (
  <Router
   history={browserHistory}
   routes={rootRoute}
   />
 ), document.getElementById('root')
);

这里有四个属性:

path

不用多说,匹配路由;

getComponent

对应于以前的 component 属性,但是这个方法是异步的,也就是当路由匹配时,才会调用这个方法。

这里面有个 require.ensure 方法

require.ensure(dependencies, callback, chunkName)

这是 webpack 提供的方法,这也是按需加载的核心方法。第一个参数是依赖,第二个是回调函数,第三个就是上面提到的 chunkName,用来指定这个 chunk file 的 name。

indexRoute

用来设置主页。(单独抽离主页)

注意这里的 indexRoute 写法, 这是个对象,在对象里面使用 getComponent。

childRoutes

子路由

这里面放置的就是子路由的配置,对应于以前的子路由们。我们将以前的 /baidu、/404 和 * 都拆了出来,接下来将分别为他们创建路由配置。

路由控制

上面的childRoutes 里面,我们 require 了三个子路由,在目录下创建 routes 目录,将这三个路由放置进去。

routes/
├── 404
│  └── index.js
├── baidu
│  ├── index.js
│  └── routes
│    ├── frequency
│    │  └── index.js
│    └── result
│      └── index.js
└── redirect
  └── index.js

和 rootRoute 类似,里面的每个 index.js 都是一个路由对象:

/404/index.js

module.exports = {
 path: '404',

 getComponent(nextState, cb) {
  require.ensure([], (require) => {
   cb(null, require('components/layer/NotFoundPage'))
  }, 'NotFoundPage')
 }
}

/baidu/index.js

module.exports = {
 path: 'baidu',

 getChildRoutes(partialNextState, cb) {
  require.ensure([], (require) => {
   cb(null, [
    require('./routes/result'),
    require('./routes/frequency')
   ])
  })
 },

 getComponent(nextState, cb) {
  require.ensure([], (require) => {
   cb(null, require('components/layer/BaiduPage'))
  }, 'BaiduPage')
 }
}

/baidu/routes/frequency/index.js

module.exports = {
 path: 'frequency',
 getComponent(nextState, cb) {
  require.ensure([], (require) => {
   cb(null, require('components/layer/BaiduFrequencyPage'))
  }, 'BaiduFrequencyPage')
 }
}

等················

下面来说一下设置Redirect

我们需要把这个重定向的路由单独拆出来,也就是 * 这个路由,我们上面已经为他创建了一个 redirect 目录。这里使用到 onEnter 方法,然后在这个方法里改变路由状态,调到另外的路由,实现 redirect :

/redirect/index.js官方例子

module.exports = {
 path: '*',
 onEnter: (_, replaceState) => replaceState(null, "/404")
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript Base类 包含基本的方法
Jul 22 Javascript
通过js动态操作table(新增,删除相关列信息)
May 23 Javascript
javascript的字符串按引用复制和传递,按值来比较介绍与应用
Dec 28 Javascript
jQuery 借助插件Lavalamp实现导航条动态美化效果
Sep 27 Javascript
Jquery通过Ajax访问XML数据的小例子
Nov 18 Javascript
JavaScript DSL 流畅接口(使用链式调用)实例
Mar 15 Javascript
JS中生成随机数的用法及相关函数
Jan 09 Javascript
详解Html a标签中href和onclick用法、区别、优先级别
Jan 16 Javascript
js+html5生成自动排列对话框实例
Oct 09 Javascript
使用vue2实现购物车和地址选配功能
Mar 29 Javascript
使用Node.js写一个代码生成器的方法步骤
May 10 Javascript
详解Vue的列表渲染
Nov 20 Vue.js
BootStrap表单时间选择器详解
May 09 #Javascript
兼容浏览器的js事件绑定函数(详解)
May 09 #Javascript
JS触摸与手势事件详解
May 09 #Javascript
Angualrjs 表单验证的两种方式(失去焦点验证和点击提交验证)
May 09 #Javascript
微信小程序之获取当前位置经纬度以及地图显示详解
May 09 #Javascript
JS中的数组转变成JSON格式字符串的方法
May 09 #Javascript
jQuery插件开发发送短信倒计时功能代码
May 09 #jQuery
You might like
PHP简介
2006/10/09 PHP
php中convert_uuencode()与convert_uuencode函数用法实例
2014/11/22 PHP
Laravel 已登陆用户再次查看登陆页面的自动跳转设置方法
2019/09/30 PHP
一个简单的jQuery插件制作 学习过程及实例
2010/04/25 Javascript
js输出列表实现代码
2010/09/12 Javascript
JS根据变量保存方法名并执行方法示例
2014/04/04 Javascript
javascript实现网页字符定位的方法
2015/07/14 Javascript
jquery实现简单的二级导航下拉菜单效果
2015/09/07 Javascript
推荐阅读的js快速判断IE浏览器(兼容IE10与IE11)
2015/12/13 Javascript
JS表格组件神器bootstrap table详解(强化版)
2016/05/26 Javascript
总结Node.js中的一些错误类型
2016/08/15 Javascript
基于JavaScript实现购物车功能
2017/02/07 Javascript
JavaScript实现的冒泡排序法及统计相邻数交换次数示例
2017/04/26 Javascript
three.js中文文档学习之如何本地运行详解
2017/11/20 Javascript
详解vue表单——小白速看
2018/04/08 Javascript
Koa代理Http请求的示例代码
2018/10/10 Javascript
在移动端使用vue-router和keep-alive的方法示例
2018/12/02 Javascript
监听element-ui table滚动事件的方法
2019/03/26 Javascript
javascript 数组(list)添加/删除的实现
2020/12/17 Javascript
[01:19]DOTA2城市挑战赛报名开始 开启你的城市传奇
2018/03/23 DOTA
python matplotlib画图实例代码分享
2017/12/27 Python
Django自定义过滤器定义与用法示例
2018/03/22 Python
python如何获取当前文件夹下所有文件名详解
2019/01/25 Python
python3通过udp实现组播数据的发送和接收操作
2020/05/05 Python
基于python实现操作redis及消息队列
2020/08/27 Python
屈臣氏马来西亚官网:Watsons马来西亚
2019/06/15 全球购物
日本AOKI官方商城:AOKI西装
2020/06/11 全球购物
Java程序员常见面试题
2015/07/16 面试题
JavaScript实现前端网页版倒计时
2021/03/24 Javascript
2014年商场超市庆元旦活动方案
2014/02/14 职场文书
英语老师推荐信
2014/02/26 职场文书
市场营销专业毕业生求职信
2014/03/26 职场文书
小学生环保倡议书
2014/05/15 职场文书
2016年万圣节活动总结
2016/04/05 职场文书
详解Python为什么不用设计模式
2021/06/24 Python
JS前端使用canvas实现物体的点选示例
2022/08/05 Javascript