1 Star 0 Fork 0

鸿基梦 / webStaging

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
OPTIMIZE_README.MD 6.31 KB
一键复制 编辑 原始数据 按行查看 历史
鸿基梦 提交于 2018-05-17 16:13 . 优化说明文件提交

Vue.js项目Router配置拆分实践

场景:

  1. 最近项目开发完毕,终于抽出点时间来优化一下代码,这里重点介绍路由的优化

  2. 我们搭建vue项目的时候基本上都是从vue-cli中clone后修改的,我们的路由一般写在一个 router.js中

分析

  1. 问题来了,随着业务进一步推进,页面文件的增加,导致router.js这个文件越来越大。

  2. 带来的危害:1.不方便维护; 2.router命名冲突; 3.很不美观

拆分!拆分!拆分!

  1. 按照业务逻辑来为路由分类,可以与后台api控制器命名对应,这样方便寻找

  2. 推荐使用扁平化路由命名规范

路由文件夹层级

.           
├── router       
    ├── authority.js    // 基础与权限模块文件
    ├── publics.js      // 公共模块文件                  
    ├── user.js         // 用户模块文件
    ├── agent.js        // 代理模块文件        
    └── router.js       // 主路由文件            
.

主路由文件(router.js)

/**
 * 路由总文件
 * User: hjm100
 * Date: 18-05-16 16:55 
 */
import App from './App';
import authority from './authority';
import publics   from './publics';
import user from './user';
import agent from './agent';
... ...

export default Object.assign(
  authority,   // 基础与权限模块
  publics,     // 公共模块
  user,        // 用户模块
  agent        // 代理模块
);

模块路由文件(user.js,agent.js,...) [这里以publics.js为例]


/**
 * 公共模块文件
 * User: hjm100
 * Date: 18-05-16 16:55 
 */
import Wechat from "../page/payment/Wechat.vue";
import payment from "../page/payment/payment.vue";
import paymentResult from "../page/payment/result.vue"; //支付完成后的回调页面
import paymentCheck from "../page/payment/check.vue"; //支付结果(联动优势微信公众号支付)

const PUBLICS_ROUTER = [
    { path: '/payment',component: payment,meta: { title: "支付" }, name: "paymentResult" },
    { path: '/payment/result', component: paymentResult, meta: { title: "支付返回" }, name: "payment" },
    { path: '/payment/check',component: paymentCheck, meta: { title: "支付结果" }, name: "paymentCheck" },
    { path: '/wechat',component: Wechat, meta: { title: "等待请求结果" }, name: "Wechat" },
]

export default PUBLICS_ROUTER;

main.js中引入

/**
 * main.js文件
 * User: hjm100
 * Date: 18-05-16 16:55 
 */
import Vue from "vue";
import VueRouter from "vue-router";
import routes from "./router/router";
//定义路由函数
Vue.use(VueRouter);
const router = new VueRouter({
  mode: "history",
  routes
});
//创建每一页的title
router.beforeEach((to, from, next) => {
  window.document.title = to.meta.title;
  next();
});

export default new Vue({
  router
}).$mount("#app");

实践总结:

  1. 拆分后,每个模块管理它自己领域的router、router.js就大大瘦身了

  2. 重点是降低了命名冲突的问题和将来混乱的问题。

  3. 关于路由以及api的设计问题建议提前构思与规划,当项目基本成型,在想起优化将会花费你的很多时间。

  4. 想好在做能节约你的很多时间

  5. 关于文件命名问题最好根据业务来命名,以维护(提高工作效率)

如果是vue1的话可以参考下面路由文件

主路由文件(router.js)

/**
 * 路由总文件
 * User: hjm100
 * Date: 18-05-16 16:55 
 */
import App from './App';
import authority from './authority';
import publics   from './publics';
import user from './user';
import agent from './agent';
... ...
export default function(router){
  authority(router);  // 基础与权限模块
  publics(router);    // 公共模块
  user(router);       // 用户模块
  agent(router);      // 代理模块
  ... ...
  return router.start(App, '#app');
  // 拆分路由的时候我们要保证只有一个router.start
  // 因为虽然你在子router配置文件中也写上页面是能正常工作的,但是Vue.js会在控制台报一个错误:
  // [vue-router] already started
  // 这个错误的意思就是router已经启动,无需启动多次。
  // 所以,子router文件中不能存在 return router.start(App, '#app'); 这样的代码。
}

模块路由文件(user.js,agent.js,...) [这里以agent.js为例]

/**
 * 代理模块文件
 * User: hjm100
 * Date: 18-05-16 16:55 
 */
import Agent from "../page/agent/Agent.vue";
import AgentMain from "../page/agent/AgentMain.vue";
import AgentList from "../page/agent/agentlist/AgentList.vue";
import AgentDetail from "../page/agent/agentlist/AgentDetail.vue";

export default function (router) {
  router.map({
    '/agent': { component: Agent },
    '/agent/main': { component: AgentMain, meta: { title: "代理数据" }, name: "AgentMain" },//代理数据
    '/agent/list': { component: AgentList, meta: { title: "代理列表" }, name: "AgentList" },//代理列表
    '/agent/detail': { component: AgentDetail, meta: { title: "代理详情" }, name: "AgentDetail" },//代理详情
  });
}

关于api链接的封装:

  1. 首先考虑API配置文件怎么拆分,对于接口,我们肯定有多套环境,多套环境那么API的URL也不一样,

  2. 拆分成多个文件后多个文件需要共用同一个获取apiBase的方法,

  3. 所以这个apiBase就要写在公共的地方,在这里原来的api.config.js就变成了公共配置,apiBase就放在此文件内。

/**
 * api.config.js api配置文件
 * User: hjm100
 * Date: 18-05-16 16:55 
 */
export function apiBase() {
  let hostname = window.location.hostname,
    API_BASE_URL = 'http://192.168.1.237';//本地测试
  if(hostname === 'hjm100.cn') {  //正式环境
    API_BASE_URL = 'http://hjmapi.cn';
  } else if(hostname === 'hjmtest.cn') {//公网测试环境
    API_BASE_URL = 'http://hjmtestapi.cn';
  } else if(hostname === 'hjmdev.cn') {//内网测试环境
    API_BASE_URL = 'http://hjmdevapi.cn';
  }
  return API_BASE_URL;
}
//然后在每个子API配置文件中引入即可:

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

更多相关

  1. Vue.js项目Router配置拆分之旅

  2. vue服务封装基于axios

  3. vue脚手架项目

JavaScript
1
https://gitee.com/hjm100/webStaging.git
git@gitee.com:hjm100/webStaging.git
hjm100
webStaging
webStaging
master

搜索帮助