详解Vue.js项目API、Router配置拆分实践


Posted in Javascript onMarch 16, 2018

前后端分离开发方式前端拥有更高的控制权

随着前端框架技术的飞速发展,Router这个概念也被迅速普及到前端项目中,在早期前后的没有分离的时期下,并没有明确的路由概念,前端页面跳转大多是通过后端进行请求转发的,比如在Spring MVC项目中,进行一个页面跳转如下(画红线部分):

详解Vue.js项目API、Router配置拆分实践

前端需要一个超链接,链接的href=/manager,这样这个超链接被转发到scs/waitFollowed路径指定的页面。

前后的分离后,前端页面跳转的方式发生了变化,不再需要后端处理了,数据交换方式也改变了,由此前端需要定义Router配置文件,需要定义API配置文件。在项目的权限配置管理中,完全不需要后端什么事了,可以说,权限配置表可以单独拿出来由前端维护了。

详解Vue.js项目API、Router配置拆分实践

比如这个url字段,在前后端不分离的情况下,严重依赖于后端,url就是后端接口地址,如果需要更改就需要后端修改代码修改接口地址,而现在,前端可以自由控制url的值是什么了。

在接口层面,前端也会有自己的配置文件,可以对后端提供的接口进行重命名,组合等。比如

详解Vue.js项目API、Router配置拆分实践

前端都统一使用模块名+接口名的方式管理,管后端提供的接口叫啥已经不重要,在视觉上和维护上都比较方便。在页面上使用,查询起来也很直观:

详解Vue.js项目API、Router配置拆分实践

看到DISTRBUTE().Leads.dataGrid这个接口,就知道这是DISTRBUTE模块下Leasd功能下的列表查询接口

Vue.js中的API、Router配置

在Vue.js项目下,一开始我们只使用一个api.config.js配置文件,所有的接口都定义在这里面,router也一样,都配置在一个router.config.js中,下面是我们项目中API配置文件

详解Vue.js项目API、Router配置拆分实践

可以看到,很多的业务模块,很多的接口,已经达到了570多行,随着业务进一步推进,接口快速膨胀,文件越来越大。

这时候迫切需要拆分,把不同的业务模块单独拆分为一个个API配置文件。同样,我们来看看拆分前的Router配置文件:

详解Vue.js项目API、Router配置拆分实践

这样router一多最大的缺点就是会导致router命名冲突。

拆分!拆分!拆分!

首先考虑API配置文件怎么拆分,对于接口,我们肯定有多套环境,多套环境那么API的URL也不一样,拆分成多个文件后多个文件需要共用同一个获取apiBase的方法,所以这个apiBase就要写在公共的地方,在这里原来的api.config.js就变成了公共配置,apiBase就放在此文件内。

export function apiBase() {
 let hostname = window.location.hostname,
  API_BASE_URL = 'http://test2api.dunizb.com';//默认环境
 if(hostname === 'crm.dunizb.cn') { //正式环境
  API_BASE_URL = 'http://api.dunizb.cn';
 } else if(hostname === 'admin.dunizb.com') {//公网测试环境
  API_BASE_URL = 'http://testapi.dunizb.com';
 } else if(hostname === 'manager.dunizb.com') {//内网测试环境
  API_BASE_URL = 'http://test2api.dunizb.com';
 }
 return API_BASE_URL;
}

然后在每个子API配置文件中引入即可:

import {apiBase} from '../api.config';

具体功能API不需要更改,直接拷贝相应模块API到子模块API配置文件即可。

详解Vue.js项目API、Router配置拆分实践

Router的拆分稍微复杂一点,拆分后的文件目录与API的目录相同:

详解Vue.js项目API、Router配置拆分实践

拆分思路也完全一样,但要保证只有一个router.start即:

return router.start(App, '#app');

虽然你在子router配置文件中也写上页面是能正常工作的,但是Vue.js会在控制台报一个错误:

详解Vue.js项目API、Router配置拆分实践

这个错误的意思就是router已经启动,无需启动多次。所以,子router文件中不能存在 return router.start(App, '#app'); 这样的代码。

拆分后router.config.js内容如下:

/**
 * 路由总文件
 * Created by Bing on 2017/6/19 0019.
 */
import App from './App';
import authority from './routers/authority';
import publics from './routers/public';
import study from './routers/study';
... ...
export default function(router){
 authority(router);//基础与权限模块
 publics(router);//公共模块
 study(router);//教学相关
 ... ...
 return router.start(App, '#app');
}

而子router配置文件的写法就是这样(以study模块为例):

/**
 * 教学排课
 * 教研
 * Created by Bing on 2017/6/19 0019.
 */
import courseIndex from 'components/studyCourse/index/index';
import waitCourse from 'components/studyCourse/waitCourse/waitCourse';
import alreadyCourse from 'components/studyCourse/alreadyCourse/alreadyCourse';
import gearCourse from 'components/studyCourse/waitCourse/gearCourse';
import courseWare from 'components/teachingResearch/courseware/courseware.vue';
import courseWareLibrary from 'components/teachingResearch/courseware/library.vue';
export default function(router) {
 router.map({
  '/study/index': {component: courseIndex},
  '/study/waitCourse': {component: waitCourse},//待排课程
  '/study/waitCourse/gearCourse': {component: gearCourse},//待排
  '/study/course': {component: alreadyCourse},//已排课程
  '/tr/courseware': {component: courseWare},//课件管理
  '/tr/courseWare/library': {component: courseWareLibrary},//自主上传课件库
 });
}

拆分后,每个模块管理它自己领域的router、api,router.config.js和api.config.js就大大瘦身了,也降低了命名冲突的问题和将来混乱的问题。

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

Javascript 相关文章推荐
javascript 实用的文字链提示框效果
Jun 30 Javascript
$.ajax返回的JSON无法执行success的解决方法
Sep 09 Javascript
基于jquery的网站幻灯片切换效果焦点图代码
Sep 15 Javascript
JavaScript中奇葩的假值示例应用
Mar 11 Javascript
详解javascript实现自定义事件
Jan 19 Javascript
浅谈js停止事件冒泡 阻止浏览器的默认行为(阻止超连接 #)
Feb 08 Javascript
vue裁切预览组件功能的实现步骤
May 04 Javascript
async/await优雅的错误处理方法总结
Jan 30 Javascript
微信小程序发布新版本时自动提示用户更新的方法
Jun 07 Javascript
Vue 2.0 中依赖注入 provide/inject组合实战
Jun 20 Javascript
详解node登录接口之密码错误限制次数(含代码)
Oct 25 Javascript
Vue实现开关按钮拖拽效果
Sep 22 Javascript
vue实现tab切换外加样式切换方法
Mar 16 #Javascript
javaScript中"=="和"==="的区别详解
Mar 16 #Javascript
node.js博客项目开发手记
Mar 16 #Javascript
vue iView 上传组件之手动上传功能
Mar 16 #Javascript
p5.js入门教程之平滑过渡(Easing)
Mar 16 #Javascript
JavaScript 隐性类型转换步骤浅析
Mar 15 #Javascript
JavaScript的数据类型转换原则(干货)
Mar 15 #Javascript
You might like
php cookie 登录验证示例代码
2009/03/16 PHP
php去除数组中重复数据
2014/11/18 PHP
PHP实现抓取HTTPS内容
2014/12/01 PHP
jquery简单瀑布流实现原理及ie8下测试代码
2013/01/23 Javascript
js的2种继承方式详解
2014/03/04 Javascript
javascript(js)的小数点乘法除法问题详解
2014/03/07 Javascript
jquery中页面Ajax方法$.load的功能使用介绍
2014/10/20 Javascript
JS表的模拟方法
2015/02/05 Javascript
jquery控制页面部分刷新的方法
2015/06/24 Javascript
JavaScript取得WEB安全颜色列表的方法
2015/07/14 Javascript
javascript动画系列之模拟滚动条
2016/12/13 Javascript
JavaScript面向对象继承原理与实现方法分析
2018/08/09 Javascript
atom-design(Vue.js移动端组件库)手势组件使用教程
2019/05/16 Javascript
详解微信小程序支付流程与梳理
2019/07/16 Javascript
js实现图片区域可点击大小随意改变(适用移动端)代码实例
2019/09/11 Javascript
element表格翻页第2页从1开始编号(后端从0开始分页)
2019/12/10 Javascript
Vue-router中hash模式与history模式的区别详解
2020/12/15 Vue.js
[05:09]2016国际邀请赛中国区预选赛淘汰赛首日精彩回顾
2016/06/29 DOTA
python 输出一个两行字符的变量
2009/02/05 Python
利用Python演示数型数据结构的教程
2015/04/03 Python
浅谈Python中的数据类型
2015/05/05 Python
python实现复制整个目录的方法
2015/05/12 Python
利用Python将文本中的中英文分离方法
2018/10/31 Python
如何在Python中实现goto语句的方法
2019/05/18 Python
python语言基本语句用法总结
2019/06/11 Python
tensorflow实现tensor中满足某一条件的数值取出组成新的tensor
2020/01/04 Python
Python安装第三方库攻略(pip和Anaconda)
2020/10/15 Python
海南地接欢迎词
2014/01/14 职场文书
大学学习生活感言
2014/01/18 职场文书
青春励志演讲稿
2014/04/29 职场文书
运动会横幅标语
2014/06/17 职场文书
教师竞聘上岗演讲稿
2014/09/03 职场文书
工资收入证明样本(5篇)
2014/09/16 职场文书
支部书记四风问题自我剖析材料
2014/09/29 职场文书
幼儿园校园小喇叭广播稿
2014/10/17 职场文书
乡镇司法所2015年度工作总结
2015/10/14 职场文书