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 相关文章推荐
jQuery实现的原图对比窗帘效果
Jun 15 Javascript
javascript实现鼠标拖动改变层大小的方法
Apr 30 Javascript
实例讲解使用原生JavaScript处理AJAX请求的方法
May 10 Javascript
jQuery EasyUI Pagination实现分页的常用方法
May 21 Javascript
JS表格组件神器bootstrap table详解(强化版)
May 26 Javascript
jQuery新窗口打开外链接
Jul 21 Javascript
概述javascript在Google IE中的调试技巧
Nov 24 Javascript
js实现扫雷小程序的示例代码
Sep 27 Javascript
通过封装scroll.js 获取滚动条的值
Jul 13 Javascript
jQuery实现的点击图片居中放大缩小功能示例
Jan 16 jQuery
vue router 跳转时打开新页面的示例方法
Jul 28 Javascript
vue-router路由模式详解(小结)
Aug 26 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设计模式  Command(命令模式)
2011/06/17 PHP
PHP中iconv函数转码时截断字符问题的解决方法
2015/01/21 PHP
PHP数据库编程之MySQL优化策略概述
2017/08/16 PHP
图片onload事件触发问题解决方法
2011/07/31 Javascript
ASP.NET jQuery 实例13 原创jQuery文本框字符限制插件-TextArea Counter
2012/02/03 Javascript
JQuery插件Style定制化方法的分析与比较
2012/05/03 Javascript
Angular中的Promise对象($q介绍)
2015/03/03 Javascript
Angularjs注入拦截器实现Loading效果
2015/12/28 Javascript
prototype.js常用函数详解
2016/06/18 Javascript
JavaScript将DOM事件处理程序封装为event.js 出现的低级错误问题
2016/08/03 Javascript
关于Promise 异步编程的实例讲解
2017/09/01 Javascript
在react-router4中进行代码拆分的方法(基于webpack)
2018/03/08 Javascript
vue实现tab切换外加样式切换方法
2018/03/16 Javascript
nodejs 十六进制字符串型数据与btye型数据相互转换
2018/07/30 NodeJs
layer.close()关闭进度条和Iframe窗的方法
2018/08/17 Javascript
微信小程序开发之自定义tabBar的实现
2018/09/06 Javascript
vue 中的动态传参和query传参操作
2020/11/09 Javascript
vue+Element-ui实现登录注册表单
2020/11/17 Javascript
python类继承与子类实例初始化用法分析
2015/04/17 Python
在Debian下配置Python+Django+Nginx+uWSGI+MySQL的教程
2015/04/25 Python
Django实现自定义404,500页面教程
2017/03/26 Python
Python网络爬虫中的同步与异步示例详解
2018/02/03 Python
利用Python读取txt文档的方法讲解
2018/06/23 Python
python实现小世界网络生成
2019/11/21 Python
Python 实现加密过的PDF文件转WORD格式
2020/02/04 Python
xadmin使用formfield_for_dbfield函数过滤下拉表单实例
2020/04/07 Python
Sublime Text3最新激活注册码分享适用2020最新版 亲测可用
2020/11/12 Python
HTML5 Canvas入门学习教程
2016/03/17 HTML / CSS
现代化办公人员工作的自我评价
2013/10/16 职场文书
销售团队口号大全
2014/06/06 职场文书
"9.18"国耻日演讲稿范文
2014/09/14 职场文书
副检察长四风问题对照检查材料思想汇报
2014/10/07 职场文书
英语投诉信范文
2015/07/03 职场文书
RPM包方式安装Oracle21c的方法详解
2021/08/23 Oracle
深入浅出讲解Java8函数式编程
2022/01/18 Java/Android
浅谈css清除浮动(clearfix和clear)的用法
2023/05/21 HTML / CSS