iis服务器助手广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >浅谈Vue灰度发布新功能的使用
  • 681
分享到

浅谈Vue灰度发布新功能的使用

2024-04-02 19:04:59 681人浏览 安东尼
摘要

目录概述组件级别页面级别方案一 新增入口页面分发方案二 高阶组件方案方案三 动态Router.js引入总结参考什么是灰度发布?百度百科的解释如下。 灰度发布是指在黑与白之间,能够平滑

什么是灰度发布?百度百科的解释如下。

灰度发布是指在黑与白之间,能够平滑过渡的一种发布方式。AB test就是一种灰度发布方式,让一部分用户继续用A,一部分用户开始用B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面来。灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度。

从上可以看出,灰度发布的主要作用有以下几点:

  • 降低直接全量发布带来的影响,让少部分用户先使用新版本,如发现问题则及时做好修复,验证无重大问题则全量发布新功能
  • 通过新老版本的数据对比,决定新版本是否需要全量发布

概述

灰度发布的方式有很多,按端可以区分服务端,客户端,web前端都可以做,没有最好,只有更适合自己的业务场景。

如上可以看到常见的几种灰度发布的方式,都有各自的优缺点,由于我们公司有完善的大数据AB test方案,所以前端只需关注接口返回的字段标识,来做具体的页面加载逻辑,今天重点讲述在前端中使用Vue框架中如何做灰度发布。在Vue中主要可以分为以下两种情况:

组件级别:

  • 组件级别动态控制只需后端回传对应方案标识即可。

页面级别:

  • 前端页面访问地址不变,同后端人员约定好AB test 标记字段,前端根据字段返回不同的内容加载对应的页面。
  • 新旧功能区分两个页面地址,跳转页面地址由后端控制,此方案前端不需要太多改动,此文就不多说明。

先来看看日常处理的方式,一个页面可能会存在多个地方判断AB test 逻辑,或者是更多的AB test同时进行,这样的页面代码逻辑复杂度相对比较高,也不够整洁易懂,当有新的AB test加入或者有AB test需要决策的时候,修改代码的成本较高,降低了代码维护的效率。

<template>
    ...
    <test-a v-if="testA" />
    <test-b v-else-if="testB" />
    ...
    <div v-if="testA">
        ...
    </div>
    <div v-else-if="testB">
        ...
    </div>
    ...
</template>
<script>
    ...
    if (testA) {
        ...   
    } else if (testB) {
        ...
    }
</script>

接下来就开始我们今天文章的正题,看看有哪些方式可以解决以上的问题。

组件级别

如只是简单的两个小组件功能的灰度则可以直接用 v-if 处理

<testA v-if="testA" />
<testB v-else />

如有多个功能同时测试,可以通过 Vue 的元素加一个特殊的 isattribute 来实现,currentTabComponent 可基于接口获取或其他前端计算得出。

<component :is="currentTabComponent"></component>

页面级别

方案一 新增入口页面分发

新增入口页面,将新旧版本页面升级为组件的方式引入,入口页面增加接口查询,通过 v-if 或通过 Vue 的<component> 元素加一个特殊的 is 属性来加载页面组件。如下是通过接口查询代码示例,通过接口前置查询会带来一定的界面延迟加载,取决于接口的响应速度,我们也可以通过在URL增加参数获取,这时的URL由后端拼接好参数再返回,这样就可以避免一次接口查询。

<template>
   <component :is="testId"></component>
</template>
<script>
  import IndexA from './index-a'
  import IndexB from './index-b'
  import {
    getTestID
  } from '@/api/getTestID'

  export default {
    name: 'index',
    components: {
      'index-a': IndexA,
      'index-b': IndexB
    },
    data() {
      return {
        testId: ''
      }
    },
    created() {
      this.getTestID()
    },
    methods: {
      async getTestID() {
        const { testId } = await getTestID({
          xxx: xxx
        })
        this.testId = testId
      }
    }
  }
</script>

这里直接这样加载页面级组件会导致此文件体积加大,可以将页面组件的加载方式改为异步组件,提升页面加载速度。

components: {
	'index-a': () => import( './index-a'),
	'index-b': () => import( './index-b')
}

方案二 高阶组件方案

在路由配置中从接口获取灰度标识数据,进行路由分发。如果不想额外增加接口查询的开销,也可以将标识数据从URL参数返回,此方式需要提前拼接好参数。

高阶组件的好处是所有需要灰度的加载逻辑都在路由配置文件中,统一维护,组件也可复用,不需要每个需要灰度的页面都增加一个入口文件。

组件代码

<template>
  <component :is="com" />
</template>
<script>
export default {
  name: 'DynamicLoadComponent',
  props: {
    renderComponent: {
      type: Promise
    }
  },
  data() {
    return {
      com: () => this.renderComponent
    }
  }
};
</script>

router.js 配置

{
  path: 'originPath',
  component: () => import('@/views/components/DynamicLoadComponent'),
  name: 'originPath',
  props: (route) => ({
    renderComponent: new Promise((resolve, reject) => {
      // 根据 route 拼接参数获取加载页面
      if (route.query.testA) {
          resolve(import('@/views/testA'));
      } else {
          resolve(import('@/views/testB'));
      }
      // OR 根据接口返回标识动态加载页面
      getAPIData()
        .then((response) => {
          if (response.testA) {
            resolve(import('@/views/testA'));
          } else {
            resolve(import('@/views/testB'));
          }
        })
        .catch(reject);
    }),
  })
}

方案三 动态Router.js引入

如果是有大面积的页面替换,可采用这种方式。例如,后端开发语言更换导致接口地址及返回的字段内容都发生变化,这样会有一段时间的过渡使用,开发完一个页面上线一个页面,就可能会有5个页面使用新的方案,5个页面还是保留原始方案的情况。

改造router.js,将原始路由配置抽离到default.js中,再新建java.js将新方案路由配置写入,基于前端计算或接口返回标识动态加载路由配置文件。

import Vue from 'vue'
import Router from 'vue-router'
import { isHitJavaAPI } from '@/config'

Vue.use(Router)

const router = new Router({
  mode: 'history'
})

const computedRouterDirectory = (routeFile) => {
   let routerConfig;
   const requireRouter = require.context('.', false, /\.js$/);
   routerConfig = requireRouter.keys().filter(file => file === `./${routeFile}.js`)[0];
   if (routerConfig) {
     routerConfig = requireRouter(routerConfig)
     routerConfig.default && router.addRoutes(routerConfig.default);
  }
}

if (isHitJavaAPI()) {
   computedRouterDirectory('java')
 } else {
   computedRouterDirectory('default')
}

isHitJavaAPI方法中是命中灰度的逻辑,如果这里是前端做灰度,可基于deviceID或UA等计算。如果这里是调用接口获取方案则需改为同步调用。

总结

本文主要介绍了页面级别的几个灰度方案,每个方案的试用场景都有各自的优缺点,如新增入口文件,主要是针对页面变动较大且当前项目只会有一个在进行中的灰度测试;高阶组件适用于当前项目有多个进行中的灰度测试,则可复用组件;动态加载路由配置文件主要针对于当前项目有大规模的页面UI或逻辑更换灰度测试;通过以上几种方案都可极大的提升代码的可维护性以及解耦灰度逻辑和业务代码逻辑,当灰度测试没有问题需全量上线时,我们只需修改入口逻辑即可,无需在业务代码中去逐个修改灰度逻辑。

除开本文所介绍的几种方式,也还有其他的加载方式,如路由钩子函数拦截后做动态跳转,或者请求到后端,后端做重定向处理等。每个方式都有各自的优缺点,就看是不是你当前场景最合适的方案。如果你有其他的方案,欢迎留言和我们交流~

参考

Vue Router根据后台数据加载不同的组件:https://www.cnblogs.com/zhea55/p/15115555.html

components-dynamic-async:Https://cn.vuejs.org/v2/guide/components-dynamic-async.html

到此这篇关于浅谈Vue灰度发布新功能的使用的文章就介绍到这了,更多相关Vue灰度发布内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 浅谈Vue灰度发布新功能的使用

本文链接: https://www.lsjlt.com/news/147586.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • 浅谈Vue灰度发布新功能的使用
    目录概述组件级别页面级别方案一 新增入口页面分发方案二 高阶组件方案方案三 动态Router.js引入总结参考什么是灰度发布?百度百科的解释如下。 灰度发布是指在黑与白之间,能够平滑...
    99+
    2024-04-02
  • 用小程序灰度发布,整点新鲜的!
    “不就是提个小需求么?你们怎么反应那么慢?”“你们这个需求排不到App里面,不予立项”“你们产品写的需求文档不是我们要的效果啊,我们看重的是……”“排队排队排队,研发人不够,排期已经到下个月中了。”“功能测试已经通过了,但是App近期没有上...
    99+
    2023-06-05
  • 使用Docker Compose、Nginx和MariaDB实现PHP应用程序的灰度发布
    灰度发布是一种软件发布的策略,通过在生产环境中逐步引入新版本,来缓解发布带来的风险。在实际应用中,我们可以通过使用Docker Compose来管理容器化的应用程序,结合Nginx负载均衡和MariaDB来实现灰度发布。Docker Com...
    99+
    2023-10-21
    Docker nginx mariadb
  • 浅谈Vue中插槽slot的使用方法
    如何定义和使用: 在组件的template中使用slot标签定义,slot标签中间可以定义默认显示值,如果slot标签没有声明name属性值,在使用插槽时将默认从第一个插槽依次往下...
    99+
    2024-04-02
  • GNOME 2.30发布的新功能是什么
    GNOME 2.30发布的新功能是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。GNOME 开发团队已发布 GNOME 2.30 正式版本。GNOME 2....
    99+
    2023-06-16
  • 浅谈Android开发Webview的Loading使用效果
    目录前言1. loading的选择2. loading显示时机的问题3. 体验优化4. loading最终设计效果总结前言 在开发webview的loading效果的时候会有一些问...
    99+
    2023-02-02
    Android Webview Loading Android Webview
  • 如何使用Redis和PowerShell开发分布式任务调度功能
    如何使用Redis和PowerShell开发分布式任务调度功能现如今,随着云计算和大数据技术的发展,分布式系统已经成为日常开发中不可或缺的一部分。在分布式系统中,一项常见的需求是实现任务的分发和调度。本文将介绍如何使用Redis和Power...
    99+
    2023-10-22
    - Redis - PowerShell - 分布式任务调度
  • 浅谈MySQL触发器的原理以及使用
    目录mysql 触发器触发程序的优点如下:MySQL 触发器 MySQL 数据库中触发器是一个特殊的存储过程,不同的是执行存储过程要使用 CALL 语句来调用,而触发器的执行不需要使用 CALL 语句来调用,也不需要手工...
    99+
    2023-05-20
    MySQL 触发器 MySQL触发器原理
  • 如何使用Redis和Lua开发分布式缓存更新功能
    如何使用Redis和Lua开发分布式缓存更新功能在分布式系统中,缓存的更新是一项非常重要的任务。而Redis作为一种高性能的键值存储系统,与其强大的支持分布式缓存的能力,结合Lua脚本的灵活性,可以有效地实现分布式缓存的更新功能。为了演示如...
    99+
    2023-10-22
    redis lua 分布式缓存更新
  • 一文浅析vue中消息订阅与发布的使用方法
    什么是消息订阅与发布?怎么使用?下面本篇文章给大家介绍一下vue中消息订阅与发布的使用方法,希望对大家有所帮助!1.什么是消息订阅与发布消息订阅与发布是一种组件间通信的方式,适用于任意组件间通信。能更好的实现组件间通信(消息订阅与发布就像是...
    99+
    2023-05-14
    Vue
  • 使用uniapp实现发布朋友圈功能
    效果图如下图,样式可根据需求自行调整 template部分 <view class="flex flex-wrap"> <view v-for="(item...
    99+
    2024-04-02
  • Groovy 1.7.3发布值得关注的新功能有哪些
    小编给大家分享一下Groovy 1.7.3发布值得关注的新功能有哪些,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!基于JVM的新型编程语言Groovy近日发布了1.7.3版本,在Groovy的一系列版本一直都被51CTO所...
    99+
    2023-06-17
  • 代号为Naruto的Vue 2.7正式发布功能详解
    目录引言向后移植的功能注意事项与 Vue 3 的行为差异升级指南Vue CLI / webpackViteVolar 兼容性Devtools 支持2.7 版本的影响额外细节引言 Vu...
    99+
    2024-04-02
  • 浅谈分布式锁的几种使用方式(redis、zookeeper、数据库)
    Q:一个业务服务器,一个数据库,操作:查询用户当前余额,扣除当前余额的3%作为手续费 synchronized lock dblock Q:两个业务服务器,一个数据库,操作:查询用户当前余额...
    99+
    2024-04-02
  • 商业PHP开发工具PhpStorm 2.0发布的新功能有哪些
    本篇文章为大家展示了商业PHP开发工具PhpStorm 2.0发布的新功能有哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。PhpStorm 是 JetBrain...
    99+
    2024-04-02
  • Apache最新发布的日志IDE,有哪些适用于Java开发者的功能?
    随着互联网的发展,日志分析成为了一个非常重要的领域。而作为日志分析的入口,日志IDE也变得越来越重要。Apache最新发布的日志IDE,是一款全新的工具,它提供了很多适用于Java开发者的功能,下面我们就来详细了解一下。 支持多种日志格...
    99+
    2023-08-09
    日志 ide apache
  • 基于PHP和MySQL的新闻发布系统——【功能优化】
    前言 2023年第一篇文章,祝大家在新的一年里“卯”足干劲,在技术上 “兔”飞猛进! 上一篇文章 基于PHP和MySQL的新闻发布系统 给大家介绍了制作一个新闻发布系统的主要功能的实现,在文章的末尾...
    99+
    2023-09-01
    php mysql 数据库 开发语言
  • 浅谈Android Studio 3.0 工具新特性的使用 Android Profiler 、Device File Explorer
    前言:其实 studio3.0的工具大家也已经使用过一段时间了,自己呢,就是从bate版开始使用的,我觉得比较好用的几个地方。就几个,可能还没用到其他的精髓。但我觉的这个两个功能对我是比较实用的。好那么下面就给大家介绍一下吧。正文:话不多说...
    99+
    2023-05-30
    android studio3.0 roi
  • TypeScript4.0的新功能怎么使用
    这篇文章主要介绍“TypeScript4.0的新功能怎么使用”,在日常操作中,相信很多人在TypeScript4.0的新功能怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”TypeScript4.0的新...
    99+
    2023-06-27
  • 浅谈Pytorch 定义的网络结构层能否重复使用
    前言:最近在构建网络的时候,有一些层参数一样,于是就没有定义新的层,直接重复使用了原来已经有的层,发现效果和模型大小都没有什么变化,心中产生了疑问:定义的网络结构层能否重复使用?因此...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作