我的编程空间,编程开发者的网络收藏夹
学习永远不晚

vue 项目代码拆分的方案

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

vue 项目代码拆分的方案

背景

由于之前的数据库防火墙产品与数据库审计产品使用的是同一套代码,随着两个产品功能的差异越来越大,代码的冗余度和偶合度越来越高,为了便于后期维护以及添加新功能,所以基于原来的项目代码,进行了代码结构拆分。

注意:本次拆分只拆分了可以拆分的部分,有的模块例如:规则、关于我们,是没有进行拆分的,一是有的模块很简单,没必要拆分;二是有的模块原先写得代码偶合太严重,无法拆分,如果要拆分,需要花费大量精力去梳理代码,同时还要后端配合拆分。

目的

将此次代码拆分方案记录下来,便于后来的开发人员快速熟悉项目结构。

拆分前

流程设计

项目拆分前,区分数审和防火墙功能的流程如上图所示。

访问系统时,先加载入口文件 main.js,然后加载登录页 login.vue,加载登录页的同时获取产品模式并保存到 session.storage.platformType 中,接着用户登录系统进入具体页面,该页面同时包含了数审和防火墙的功能,根据 session.storage.platformType 保存的值来判断,具体显示哪个功能。

目录结构设计

项目拆分前的目录结构如上图所示。

该目录结构是初始化一个 Vue 项目时的基本目录,根据目录结构,基本上看不出该项目包含了两个不同的产品,也不知道不同产品模式下会加载哪一部分文件,结构不清晰。

存在的问题

通过分析,可以发现当前的系统流程和目录结构是存在很多问题的,大概总结下:

  1. 加载登录页的时候才获取产品模式,如果登录页加载完成,而产品模式还未获取或者获取不到,那么登录页显示的产品信息有可能是错误的;
  2. 每次进入一个具体页面,如果同时包含了数审和防火墙的功能,都要重新判断一次,当前的功能是数审的还是防火墙的;
  3. 目录结构不清晰,不清楚哪些模块是公共模块,哪些是数审独有的模块,哪些是防火墙独有的模块;
  4. 可维护性和可扩展性差。数审的代码和防火墙的代码混在一个文件内,改代码的时候需要重头看一遍才知道哪块代码属于数审,哪块代码属于防火墙。如果想要添加一个功能,还得继续加逻辑判断,代码越来越臃肿;
  5. 业务逻辑混乱,与后端通信使用了同一个接口。

拆分后

流程设计

项目拆分后,区分数审和防火墙功能的流程如上图所示。

访问系统时,先加载入口文件 main.js,该文件中写了路由拦截相关的逻辑,在路由拦截时,如果没有产品模式,则要先获取产品模式,否则会被拦截,进不去系统。获取产品模式后,根据当前产品模式,会注册对应的登录页、路由配置、接口请求等。当注册完毕后,每次访问具体的页面,都应该是独立的模块了。

目录结构设计

项目拆分后的目录结构如上两个图所示。

该目录结构经过拆分,已经可以清晰地看到不同产品之间分离出来的文件了,从入口文件开始,经过路由拦截后,会加载指定的登录页,然后把对应产品需要的文件合并到公共文件中。比如:http 请求、路由配置等。最终结果,程序只会把需要的文件加载进去。

解决的问题

经过重新设计,解决了当前项目存在的一些问题:

  1. 在加载登录页之前,通过路由拦截,必须先获取产品模式,才能进入系统,登录页是在获取到产品模式之后才加载的,不会出现产品信息显示错误的问题;
  2. 只有在第一次进入系统或刷新页面的时候,才会重新获取产品模式,合并产品模式对应的文件,合并的文件是拆分后的文件,不需要在文件内再次判断该有数审的功能还是防火墙的功能。
  3. 目录结构清晰,防火墙相关的功能模块文件都放在 views-fw 文件夹内。
  4. 提高了项目的可维护性和可扩展性,降低了代码的偶合度。数审的代码和防火墙的代码基本已经拆分开,如果想要添加一个防火墙的功能,只需要在防火墙相关的文件夹内新增对应功能模块的文件即可。
  5. 业务逻辑清晰,与后端通信使用的是不同的接口,公共模块使用的接口按原来的不变,数审独有的接口在 url 前面增加了 audit 前缀,防火墙独有的接口在 url 前面增加了 firewall 前缀。

关键代码



//...省略的代码...
// 路由拦截,使用全局导航守卫beforeEach
router.beforeEach(async (to, from, next) => {
 // 如果没有产品模式,先获取产品模式
 if (!store.state.productMode.productMode) {
 await store.dispatch('productMode/SET_PRODUCT_MODE');
 }
//...省略的代码...


import Vue from 'vue';
import portService from '@/assets/js/service/http/http'; // axios请求
import router from '@/router/index'; // 默认路由配置,动态路由配置
import httpAAS from '@/assets/js/service/http/http-aas'; // 数审独有的 http 请求
import httpFW from '@/assets/js/service/http/http-fw'; // 防火墙独有的 http 请求
import globalConstant from '@/assets/js/const/global-constant'; // 项目全局常量
export default {
 namespaced: true,
 state: {
 productMode: '', // 产品模式,进入系统或刷新页面时获取
 },
 mutations: {
 // 修改产品模式
 changeProductMode: function (state, value) {
  state.productMode = value;
 },
 },
 actions: {
 async SET_PRODUCT_MODE({ commit, state }) {
  let res = await portService.getProductMode();
  if (res.data.code === 0) {
  commit('changeProductMode', res.data.data.productMode);
  }
  // 如果是数审产品
  if (state.productMode === globalConstant.COMMON.AAS) {
  // 设置产品登录页
  router.addRoutes([
   {
   path: '/login',
   name: 'login',
   component: resolve => {
    require(['@/views/login.vue'], resolve);
   },
   }
  ]);

  // 合并 http 请求,挂载到 Vue 原型上
  Vue.prototype.portService = Object.assign(portService, httpAAS);
  }
  // 如果是防火墙产品
  else if (state.productMode === globalConstant.COMMON.DBSG) {
  // 设置产品登录页
  router.addRoutes([
   {
   path: '/login',
   name: 'login',
   component: resolve => {
    require(['@/views/views-fw/login.vue'], resolve);
   },
   }
  ]);

  // 合并 http 请求,挂载到 Vue 原型上
  Vue.prototype.portService = Object.assign(portService, httpFW);
  }
 }
 }
};

总结

经过拆分,数审和防火墙的代码目录已经算是基本分开了,这个过程花费的力气也很大,也引发了我的一些思考,一套代码多个项目的这种方案是否算好的方案,还有没有其他更好的方案。如果项目一开始,就按照一套代码多个项目的设计来开发,会不会后期的维护成本会低一些?这些问题我也没有答案,希望后来者能够继承历史经验,更好地开发出优秀的项目。

其他实现方式

起初设计拆分方案的时候,有两种方案,一种是通过获取产品模式动态改变当前产品功能,一种是在打包时通过打包参数打包指定产品包。最终的方案是选择第一种。但是,在这个过程中也参考了一些网上的实现方案,这里列出来方便以后需要用到进行参考。

//www.jb51.net/article/188869.htm

//www.jb51.net/article/207835.htm

以上就是vue 项目代码拆分的方案的详细内容,更多关于vue 项目代码拆分的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

vue 项目代码拆分的方案

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Vue项目代码之路由拆分、Vuex模块拆分、element按需加载详解

这篇文章主要介绍了Vue项目代码之路由拆分、Vuex模块拆分、element按需加载,项目较大路由较多时,路由拆分是一个不错的代码优化方案,按不同业务分为多个模块,结构清晰便于统一管理,本文通过示例给大家详细讲解,需要的朋友可以参考下
2022-11-13

React代码拆分的方法有哪些

本篇内容介绍了“React代码拆分的方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!动态加载(import)es6提供import(
2023-07-05

flask和vue前后端分离项目部署的代码怎么写

本篇文章为大家展示了flask和vue前后端分离项目部署的代码怎么写,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。前段时间开发了一个项目, 我后端用的是flask框架写接口,前端用的是vue框架,项
2023-06-25

SpringBoot项目解决跨域的四种方案分享

在用SpringBoot开发后端服务时,我们一般是提供接口给前端使用,但前端通过浏览器调我们接口时,浏览器会有个同源策略的限制,即协议,域名,端口任一不一样时都会导致跨域,这篇文章主要介绍跨域的几种常用解决方案,希望对大家有所帮助
2023-05-18

Vue/React项目中不可忽视的自动化部署方案

本文主要介绍shell脚本的一些基本用法以及在前端项目中的应用Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。

vue-element-admin+flask实现数据查询项目的实例代码

这篇文章主要介绍了vue-element-admin+flask实现数据查询项目,填写数据库连接信息和查询语句,即可展示查询到的数据,需要的朋友可以参考下
2022-11-13

编程热搜

目录