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写的简单的计算器,内容很多,方法实用,推荐
Dec 29 Javascript
分享精心挑选的23款美轮美奂的jQuery 图片特效插件
Aug 14 Javascript
JavaScript的递归之递归与循环示例介绍
Aug 05 Javascript
js取模(求余数)隔行变色
May 15 Javascript
学习javascript的闭包,原型,和匿名函数之旅
Oct 18 Javascript
JS实现添加,替换,删除节点元素的方法
Jun 30 Javascript
AngularJS基于factory创建自定义服务的方法详解
May 25 Javascript
Vue.js项目部署到服务器的详细步骤
Jul 17 Javascript
详解webpack运行Babel教程
Jun 13 Javascript
微信小程序:数据存储、传值、取值详解
May 07 Javascript
jQuery实现可编辑的表格
Dec 11 jQuery
JavaScript arguments.callee作用及替换方案详解
Sep 02 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
MySQL 日期时间函数常用总结
2012/06/12 PHP
php中删除字符串中最先出现某个字符的实现代码
2013/02/03 PHP
ThinkPHP表单自动验证实例
2014/10/13 PHP
深入探究PHP的多进程编程方法
2015/08/18 PHP
php微信公众平台开发之微信群发信息
2016/09/13 PHP
PHP序列化操作方法分析
2016/09/28 PHP
php获取微信共享收货地址的方法
2017/12/21 PHP
Laravel框架中自定义模板指令总结
2017/12/17 PHP
Laravel框架Eloquent ORM修改数据操作示例
2019/12/03 PHP
整理JavaScript创建对象的八种方法
2015/11/03 Javascript
详解JavaScript中双等号引起的隐性类型转换
2016/05/30 Javascript
Angular4开发解决跨域问题详解
2017/08/28 Javascript
基于vue2.0动态组件及render详解
2018/03/17 Javascript
vue实现压缩图片预览并上传功能(promise封装)
2019/01/10 Javascript
vue设置动态请求地址的例子
2019/11/01 Javascript
Node如何后台数据库使用增删改查功能
2019/11/21 Javascript
基于Vue+Webpack拆分路由文件实现管理
2020/11/16 Javascript
利用JavaScript模拟京东按键输入功能
2020/12/01 Javascript
python使用append合并两个数组的方法
2015/04/28 Python
如何使用python爬取csdn博客访问量
2016/02/14 Python
用Django实现一个可运行的区块链应用
2018/03/08 Python
Python中跳台阶、变态跳台阶与矩形覆盖问题的解决方法
2018/05/19 Python
Python实现报警信息实时发送至邮箱功能(实例代码)
2019/11/11 Python
python单例设计模式实现解析
2020/01/07 Python
python识别验证码的思路及解决方案
2020/09/13 Python
python 下载m3u8视频的示例代码
2020/11/11 Python
python中pyqtgraph知识点总结
2021/01/26 Python
css3制作彩色边线3d立体按钮的示例(css3按钮)
2014/05/06 HTML / CSS
造价工程师个人求职信
2013/09/21 职场文书
营销与策划应届生求职信
2013/11/04 职场文书
工会主席事迹材料
2014/06/03 职场文书
党员自我评议对照检查材料
2014/09/27 职场文书
走群众路线学习笔记
2014/11/06 职场文书
工作表扬信范文
2015/01/17 职场文书
Python基于百度AI实现抓取表情包
2021/06/27 Python
Python基本的内置数据类型及使用方法
2022/04/13 Python