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 相关文章推荐
用js实现随机返回数组的一个元素
Aug 13 Javascript
javascript jscroll模拟html元素滚动条
Dec 18 Javascript
jQuery 属性选择器element[herf*='value']使用示例
Oct 20 Javascript
浅谈Javascript中深复制
Dec 01 Javascript
最简单的JavaScript验证整数、小数、实数、有效位小数正则表达式
Apr 17 Javascript
AngularJS中的$watch(),$digest()和$apply()区分
Apr 04 Javascript
JavaScript中Promise的使用详解
Feb 26 Javascript
JavaScript实现左右下拉框动态增删示例
Mar 09 Javascript
JS实现简单的浮动碰撞效果示例
Dec 28 Javascript
angular 实现的输入框数字千分位及保留几位小数点功能示例
Jun 19 Javascript
基于Vue实现电商SKU组合算法问题
May 29 Javascript
vue实现购物车加减
May 30 Javascript
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实现文件下载更能介绍
2012/11/23 PHP
PHP设置一边执行一边输出结果的代码
2013/09/30 PHP
php查询内存信息操作示例
2019/05/09 PHP
Javascript 圆角div的实现代码
2009/10/15 Javascript
推荐11款jQuery开发的复选框和单选框美化插件
2011/08/02 Javascript
window.location.href = window.location.href 跳转无反应 a超链接onclick事件写法
2013/08/21 Javascript
js中switch case循环实例代码
2013/12/30 Javascript
基于zepto.js实现仿手机QQ空间的大图查看组件ImageView.js详解
2015/03/05 Javascript
Bootstrap carousel轮转图的使用实例详解
2016/05/17 Javascript
js实现复选框的全选和取消全选效果
2017/01/03 Javascript
jfinal与bootstrap的登出实战详解
2017/11/27 Javascript
基于jquery实现九宫格拼图小游戏
2018/11/30 jQuery
js Array.slice的8种不同用法示例
2019/07/10 Javascript
浅谈bootstrap layer.open中end的使用方法
2019/09/12 Javascript
微信小程序vant弹窗组件的实现方式
2020/02/21 Javascript
element跨分页操作选择详解
2020/06/29 Javascript
教你用Type Hint提高Python程序开发效率
2016/08/08 Python
Python遍历pandas数据方法总结
2018/02/09 Python
解决Pycharm下面出现No R interpreter defined的问题
2018/10/29 Python
详解Python网络框架Django和Scrapy安装指南
2019/04/01 Python
如何用Python做一个微信机器人自动拉群
2019/07/03 Python
python基于TCP实现的文件下载器功能案例
2019/12/10 Python
python简单的三元一次方程求解实例
2020/04/02 Python
Django 解决开发自定义抛出异常的问题
2020/05/21 Python
mac安装python3后使用pip和pip3的区别说明
2020/09/01 Python
Django url 路由匹配过程详解
2021/01/22 Python
灵活运用CSS3特性绘制简易版围棋效果
2016/09/28 HTML / CSS
匡威帆布鞋美国官网:Converse美国
2016/08/22 全球购物
Perfume’s Club美国官网:西班牙第一家在线美容店
2020/06/10 全球购物
岗位职责定义及内容
2013/11/08 职场文书
酒店执行总经理岗位职责
2013/12/15 职场文书
代办社保委托书范文
2014/10/06 职场文书
教师批评与自我批评剖析材料
2014/10/16 职场文书
致800米运动员广播稿(10篇)
2014/10/17 职场文书
工作违纪检讨书范文
2015/01/26 职场文书
2015年公司保安年终工作总结
2015/05/14 职场文书