欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談Vue灰度發(fā)布新功能的使用

 更新時間:2022年04月28日 09:12:10   作者:大轉(zhuǎn)轉(zhuǎn)FE  
本文主要介紹了淺談Vue灰度發(fā)布新功能的使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

什么是灰度發(fā)布?百度百科的解釋如下。

灰度發(fā)布是指在黑與白之間,能夠平滑過渡的一種發(fā)布方式。AB test就是一種灰度發(fā)布方式,讓一部分用戶繼續(xù)用A,一部分用戶開始用B,如果用戶對B沒有什么反對意見,那么逐步擴(kuò)大范圍,把所有用戶都遷移到B上面來?;叶劝l(fā)布可以保證整體系統(tǒng)的穩(wěn)定,在初始灰度的時候就可以發(fā)現(xiàn)、調(diào)整問題,以保證其影響度。

從上可以看出,灰度發(fā)布的主要作用有以下幾點:

  • 降低直接全量發(fā)布帶來的影響,讓少部分用戶先使用新版本,如發(fā)現(xiàn)問題則及時做好修復(fù),驗證無重大問題則全量發(fā)布新功能
  • 通過新老版本的數(shù)據(jù)對比,決定新版本是否需要全量發(fā)布

概述

灰度發(fā)布的方式有很多,按端可以區(qū)分服務(wù)端,客戶端,Web前端都可以做,沒有最好,只有更適合自己的業(yè)務(wù)場景。

如上可以看到常見的幾種灰度發(fā)布的方式,都有各自的優(yōu)缺點,由于我們公司有完善的大數(shù)據(jù)AB test方案,所以前端只需關(guān)注接口返回的字段標(biāo)識,來做具體的頁面加載邏輯,今天重點講述在前端中使用Vue框架中如何做灰度發(fā)布。在Vue中主要可以分為以下兩種情況:

組件級別:

  • 組件級別動態(tài)控制只需后端回傳對應(yīng)方案標(biāo)識即可。

頁面級別:

  • 前端頁面訪問地址不變,同后端人員約定好AB test 標(biāo)記字段,前端根據(jù)字段返回不同的內(nèi)容加載對應(yīng)的頁面。
  • 新舊功能區(qū)分兩個頁面地址,跳轉(zhuǎn)頁面地址由后端控制,此方案前端不需要太多改動,此文就不多說明。

先來看看日常處理的方式,一個頁面可能會存在多個地方判斷AB test 邏輯,或者是更多的AB test同時進(jìn)行,這樣的頁面代碼邏輯復(fù)雜度相對比較高,也不夠整潔易懂,當(dāng)有新的AB test加入或者有AB test需要決策的時候,修改代碼的成本較高,降低了代碼維護(hù)的效率。

<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 來實現(xiàn),currentTabComponent 可基于接口獲取或其他前端計算得出。

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

頁面級別

方案一 新增入口頁面分發(fā)

新增入口頁面,將新舊版本頁面升級為組件的方式引入,入口頁面增加接口查詢,通過 v-if 或通過 Vue 的<component> 元素加一個特殊的 is 屬性來加載頁面組件。如下是通過接口查詢代碼示例,通過接口前置查詢會帶來一定的界面延遲加載,取決于接口的響應(yīng)速度,我們也可以通過在URL增加參數(shù)獲取,這時的URL由后端拼接好參數(shù)再返回,這樣就可以避免一次接口查詢。

<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>

這里直接這樣加載頁面級組件會導(dǎo)致此文件體積加大,可以將頁面組件的加載方式改為異步組件,提升頁面加載速度。

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

方案二 高階組件方案

在路由配置中從接口獲取灰度標(biāo)識數(shù)據(jù),進(jìn)行路由分發(fā)。如果不想額外增加接口查詢的開銷,也可以將標(biāo)識數(shù)據(jù)從URL參數(shù)返回,此方式需要提前拼接好參數(shù)。

高階組件的好處是所有需要灰度的加載邏輯都在路由配置文件中,統(tǒng)一維護(hù),組件也可復(fù)用,不需要每個需要灰度的頁面都增加一個入口文件。

組件代碼

<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) => {
      // 根據(jù) route 拼接參數(shù)獲取加載頁面
      if (route.query.testA) {
          resolve(import('@/views/testA'));
      } else {
          resolve(import('@/views/testB'));
      }
      // OR 根據(jù)接口返回標(biāo)識動態(tài)加載頁面
      getAPIData()
        .then((response) => {
          if (response.testA) {
            resolve(import('@/views/testA'));
          } else {
            resolve(import('@/views/testB'));
          }
        })
        .catch(reject);
    }),
  })
}

方案三 動態(tài)Router.js引入

如果是有大面積的頁面替換,可采用這種方式。例如,后端開發(fā)語言更換導(dǎo)致接口地址及返回的字段內(nèi)容都發(fā)生變化,這樣會有一段時間的過渡使用,開發(fā)完一個頁面上線一個頁面,就可能會有5個頁面使用新的方案,5個頁面還是保留原始方案的情況。

改造router.js,將原始路由配置抽離到default.js中,再新建java.js將新方案路由配置寫入,基于前端計算或接口返回標(biāo)識動態(tài)加載路由配置文件。

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等計算。如果這里是調(diào)用接口獲取方案則需改為同步調(diào)用。

總結(jié)

本文主要介紹了頁面級別的幾個灰度方案,每個方案的試用場景都有各自的優(yōu)缺點,如新增入口文件,主要是針對頁面變動較大且當(dāng)前項目只會有一個在進(jìn)行中的灰度測試;高階組件適用于當(dāng)前項目有多個進(jìn)行中的灰度測試,則可復(fù)用組件;動態(tài)加載路由配置文件主要針對于當(dāng)前項目有大規(guī)模的頁面UI或邏輯更換灰度測試;通過以上幾種方案都可極大的提升代碼的可維護(hù)性以及解耦灰度邏輯和業(yè)務(wù)代碼邏輯,當(dāng)灰度測試沒有問題需全量上線時,我們只需修改入口邏輯即可,無需在業(yè)務(wù)代碼中去逐個修改灰度邏輯。

除開本文所介紹的幾種方式,也還有其他的加載方式,如路由鉤子函數(shù)攔截后做動態(tài)跳轉(zhuǎn),或者請求到后端,后端做重定向處理等。每個方式都有各自的優(yōu)缺點,就看是不是你當(dāng)前場景最合適的方案。如果你有其他的方案,歡迎留言和我們交流~

參考

Vue Router根據(jù)后臺數(shù)據(jù)加載不同的組件:https://www.cnblogs.com/zhea55/p/15115555.html

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

到此這篇關(guān)于淺談Vue灰度發(fā)布新功能的使用的文章就介紹到這了,更多相關(guān)Vue灰度發(fā)布內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue語法之拼接字符串的示例代碼

    vue語法之拼接字符串的示例代碼

    本篇文章主要介紹了vue語法之拼接字符串的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • 關(guān)于單文件組件.vue的使用

    關(guān)于單文件組件.vue的使用

    這篇文章主要介紹了關(guān)于單文件組件.vue的使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09
  • 如何在vue項目中使用百度地圖API

    如何在vue項目中使用百度地圖API

    這篇文章主要介紹了如何在vue項目中使用百度地圖API,幫助大家更好的理解和學(xué)習(xí)使用vue框架,感興趣的朋友可以了解下
    2021-04-04
  • 代碼分析vue中如何配置less

    代碼分析vue中如何配置less

    在本篇文章中,我們給大家詳細(xì)講述了vue中如何配置less的詳細(xì)代碼和步驟,有需要的朋友跟著學(xué)習(xí)下。
    2018-09-09
  • vue3解決跨域問題詳細(xì)代碼親測有效

    vue3解決跨域問題詳細(xì)代碼親測有效

    跨域,跨的是不同域,也就是協(xié)議或主機(jī)或或端口號不同造成的現(xiàn)象,本文給大家分享vue3解決跨域問題詳細(xì)代碼親測有效,感興趣的朋友跟隨小編一起看看吧
    2022-11-11
  • Vue.js 2.0 和 React、Augular等其他前端框架大比拼

    Vue.js 2.0 和 React、Augular等其他前端框架大比拼

    這篇文章主要介紹了Vue.js 2.0 和 React、Augular等其他前端框架大比拼的相關(guān)資料,React 和 Vue 有許多相似之處,本文給大家提到,需要的朋友可以參考下
    2016-10-10
  • 使用Vue實現(xiàn)瀑布流的示例代碼

    使用Vue實現(xiàn)瀑布流的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何使用Vue實現(xiàn)瀑布流,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-02-02
  • vue 遞歸組件的簡單使用示例

    vue 遞歸組件的簡單使用示例

    這篇文章主要介紹了vue 遞歸組件的簡單使用示例,幫助大家更好的理解和使用vue框架,感興趣的朋友可以了解下
    2021-01-01
  • Vue?Router4路由導(dǎo)航守衛(wèi)實例全面解析

    Vue?Router4路由導(dǎo)航守衛(wèi)實例全面解析

    這篇文章主要為大家介紹了Vue?Router4路由導(dǎo)航守衛(wèi)實例全面解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • Vue唯一可以更改vuex實例中state數(shù)據(jù)狀態(tài)的屬性對象Mutation的講解

    Vue唯一可以更改vuex實例中state數(shù)據(jù)狀態(tài)的屬性對象Mutation的講解

    今天小編就為大家分享一篇關(guān)于Vue唯一可以更改vuex實例中state數(shù)據(jù)狀態(tài)的屬性對象,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01

最新評論