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 相关文章推荐
Mootools 1.2教程 函数
Sep 15 Javascript
选择TreeView控件的树状数据节点的JS方法(jquery)
Feb 06 Javascript
Javascript中Eval函数的使用
Mar 23 Javascript
ASP.NET中基于JQUERY的高性能的TreeView补充
Feb 23 Javascript
js 判断checkbox是否选中的操作方法
Nov 09 Javascript
如何在一个页面显示多个百度地图
Apr 07 Javascript
js模糊查询实例分享
Dec 26 Javascript
iscroll-probe实现下拉刷新和下拉加载效果
Jun 28 Javascript
VUE预渲染及遇到的坑
Sep 03 Javascript
javascript设计模式之装饰者模式
Jan 30 Javascript
ant-design表单处理和常用方法及自定义验证操作
Oct 27 Javascript
jquery实现穿梭框功能
Jan 19 jQuery
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使用内置函数file_put_contents写入文件及追加内容的方法
2015/12/07 PHP
Yii2 assets清除缓存的方法
2016/05/16 PHP
Yii2实现ActiveForm ajax提交
2017/05/26 PHP
PHP进阶学习之类的自动加载机制原理分析
2019/06/18 PHP
使用户点击后退按钮使效三行代码
2007/07/07 Javascript
javascript显示选择目录对话框的代码
2008/11/10 Javascript
javascript URL编码和解码使用说明
2010/04/12 Javascript
轻轻松松学JS调试(不下载任何工具)
2010/04/14 Javascript
javascript中常用编程知识
2013/04/08 Javascript
jQuery数据缓存功能的实现思路及简单模拟
2013/05/27 Javascript
JS模拟实现Select效果代码
2015/09/24 Javascript
jquery实现图片预加载
2015/12/25 Javascript
详解JavaScript节流函数中的Throttle
2016/07/16 Javascript
解决wx.onMenuShareTimeline出现的问题
2016/08/16 Javascript
深入理解JS继承和原型链的问题
2016/12/17 Javascript
详解基于webpack和vue.js搭建开发环境
2017/04/05 Javascript
three.js中3D视野的缩放实现代码
2017/11/16 Javascript
Angular2整合其他插件的方法
2018/01/20 Javascript
实时监控input框,实现输入框与下拉框联动的实例
2018/01/23 Javascript
原生JS实现轮播图效果
2018/10/12 Javascript
详解react组件通讯方式(多种)
2020/05/06 Javascript
Python下rrdtool模块的基本使用方法
2015/11/13 Python
python try except返回异常的信息字符串代码实例
2019/08/15 Python
Python爬虫 批量爬取下载抖音视频代码实例
2019/08/16 Python
python超时重新请求解决方案
2019/10/21 Python
详解Python设计模式之策略模式
2020/06/15 Python
五分钟带你搞懂python 迭代器与生成器
2020/08/30 Python
Web前端绘制0.5像素的几种方法
2017/08/11 HTML / CSS
html5通过canvas实现刮刮卡效果示例分享
2014/01/27 HTML / CSS
阿里巴巴Oracle DBA笔试题答案-备份恢复类
2013/11/20 面试题
大学生毕业的自我鉴定
2013/11/13 职场文书
初中高效课堂实施方案
2014/02/26 职场文书
卖房协议书
2014/04/11 职场文书
2015年电工工作总结
2015/04/10 职场文书
护士旷工检讨书
2015/08/15 职场文书
golang协程池模拟实现群发邮件功能
2021/05/02 Golang