chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

大型前端應用如何做系統融合?

京東云 ? 來源:jf_75140285 ? 作者:jf_75140285 ? 2025-05-20 14:41 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1. 背景介紹

1.1. 業(yè)務介紹

A平臺與B平臺同屬于同一系統鏈路上,前者主要致力于為用戶提供注冊入駐服務,后者則專注于提供具體業(yè)務操作服務。兩者皆為運營人員所依賴的在線管理工具。

1.2. 現狀分析

目前這兩個平臺服務于同一業(yè)務方,且B應用的頁面已經100%嵌入到了A應用的平臺上,除此以外目前存在系統上及體驗上的痛點如下:

wKgZPGgsI_eAL9VYAAG_Dc7ZB2E353.png

所以當時我們考慮既然服務于同一業(yè)務方是否能在代碼層面上將兩個平臺進行融合,通過系統的融合來達到優(yōu)化用戶體驗以及降本增效的效果呢?

2. 成果展示

平臺融合后,主要的優(yōu)化點體現在以下四方面:

wKgZO2gsI_eAO4VrAAHFkyrClSo691.png

優(yōu)化前(跳轉單個頁面白屏時間達2998ms左右):

wKgZPGgsI_iAAIzVAADAlnYJ_Rs572.png

優(yōu)化后(跳轉單個頁面白屏時間800ms左右):

wKgZPGgsI_mAKmQVAAB3HCHy4GI075.png

3. 具體措施

3.1. 方案調研

3.1.1. 部署方式

?部署優(yōu)化:A應用前后端合部署,現計劃分離前端獨立部署;

?資源節(jié)約:經行云部署平臺調研,擬采用混合部署策略,將A應用與B應用前端靜態(tài)資源集中部署于一組容器,以優(yōu)化資源利用;

wKgZO2gsI_mAUOXpAACV8IHm4ZY876.png

3.1.2. 代碼倉庫整合

?A應用的三個項目與后端共享一個代碼倉庫,采用統一的編碼標準;而B應用則使用獨立的代碼倉庫,需從中分離出前端代碼,并確保分離過程不影響現有配置;

3.1.3. 項目框架

?4個項目的技術選型框架都為vue2,依賴項略有不同;

3.1.3. 系統權限

?A應用和B應用為erp登錄;

3.2. 架構設計

為了讓用戶融合無體驗差別,兩個平臺的用戶繼續(xù)使用各自的域名進行訪問,融合后的項目可以自動識別當前環(huán)境,加載對應的內容;保證融合前后用戶查看的內容是一致的;

wKgZPGgsI_qAQCSmAAG86K54r6A716.png

3.3. 具體方案

3.3.1. 目錄結構設計

針對融合,我們首先考慮的是融合后如何防止文件沖突,減少融合的復雜度,降低出問題的概率。保證兩個系統能正常運行;拆分邏輯分以下三個方面:

1.文件拆分與分類

兩個系統涉及到幾十個文件,經過分析,我們將其拆分成以下幾部分內容:【頁面文件、公共組件文件、mock文件、AxPI接口文件、基礎請求封裝文件、路由組件文件、Store文件、公共樣式文件、公共方法組件、mainjs文件、index.html文件】

2. 結構整合與差異化處理

由于兩個項目的結構相似,我們可以針對各個部分進行整合。整體的思路是,對于差異比較大的文件,建立兩個獨立的文件夾,分別包含系統A和系統B的內容;然后通過一個index文件,識別到當前的運行環(huán)境是系統A還是系統B,再分別加載對應的內容;

3. 內容融合與沖突解決

針對差異比較小或者無差異的文件,我們將文件內容進行融合。對于沖突的內容,我們進行了手動修改,并對全局引用部分進行同步修改;

├── root
│   ├── mocks
│   ├── public
│   ├── src
│   │   ├── api
│   │   │   ├── apiA      // 存儲 A 業(yè)務請求接口
│   │   │   ├── apiB       // 存儲 B 業(yè)務請求接口
│   │   │   ├── apiC         // 存儲 C 業(yè)務請求接口
│   │   │   ├── baseHttp.js   // 封裝基礎請求
│   │   │   ├── ARequest.js   // A業(yè)務的公共處理,請求header和響應code碼等處理
│   │   │   ├── BRequest.js  //  B業(yè)務的公共處理,請求header和響應code碼等處理
│   │   │   ├── CRequest.js   // C業(yè)務的公共處理,請求header和響應code碼等處理
│   │   │   ├── DRequest.js  //  D業(yè)務的公共處理,請求header和響應code碼等處理
│   │   ├── assets
│   │   │   ├── icons     // icon內容
│   │   ├── common
│   │   │   ├── config
│   │   │   ├── styles      // 一些公共的樣式
│   │   ├── components      // 公共組件
│   │   ├── directive       // 自定義指令
│   │   ├── layout        //公共布局
│   │   ├── router
│   │   │   ├── a.js   // 對應a應用
│   │   │   ├── b.js   // 對應b應用
│   │   │   ├── c.js   // 對應c應用
│   │   │   ├── index.js
│   │   ├── store
│   │   │   ├── modules
│   │   │   ├── getters.js
│   │   │   ├── index.js
│   │   ├── utils   
│   │   ├── views
│   │   │   ├── a    // a 業(yè)務文件
│   │   │   ├── b    // b 業(yè)務文件
│   │   │   ├── c    // c 業(yè)務文件
│   │   ├── main.js
│   │   └── App.vue
│   ├── env
│   ├── package.json

3.3.2. 應用類型判斷

應用類型判斷是我們重要的一環(huán),是我們識別環(huán)境的基礎,當用戶通過不同的域名訪問到應用的時候,前端維護一個映射表,不同的域名代表不同的應用;在main.js文件中會在第一時間執(zhí)行判斷識別;

let APPLICATION_TYPE = 'a'
let host = window.location.host;

// 維護域名列表,包含測試和線上環(huán)境
const A_HOST = ['a.com','a_pre.com']
const B_HOST = [] 
const C_HOST = []
const D_HOST = []

if(A_HOST.includes(host)){
    APPLICATION_TYPE = 'a'
}else if(B_HOST.includes(host)){
    APPLICATION_TYPE = 'b'
}else if(C_HOST.includes(host)){
    APPLICATION_TYPE = 'c'
}else if(D_HOST.includes(host)){
    APPLICATION_TYPE = 'd'
}
// 掛載全局
window._APPLICATION_TYPE = APPLICATION_TYPE

3.3.3. 路由設計

根據不同的域名獲取路由配置,根據路由配置生成路由;系統A和系統B各自維護一個路由列表;當從后端請求回來路由結構之后,根據不同的應用映射不同的文件內容;其中路由path保持不變,compoent增加前綴(應用類別)找到對應的應用下的組件;

?第一步:前端獲取當前域名,確認當前應用

根據全局的 APPLICATION_TYPE 字段識別

?第二步:前端維護一個路由列表

let router=[
{
    path: '/home',
    component: Layout,
    meta: {  title: '首頁', icon: 'el-icon-s-grid', alwaysShow: true },
    redirect: '/home',
    children: [
      {
        path: '/home',
        component: () => import('@/views/home/index'),
        name: 'home',
        meta: { title: '首頁', icon: ''}
      }
    ]
  }
]

?第三步:根據當前應用請求后端接口,獲取路由配置信息(component的路徑前拼接各個應用的文件名)

let RouterApi={'a':'/api1','b':'/api2','c':'api3'}
api.get(RouterApi[APPLICATION_TYPE])
component='各個應用文件名'+接口返回路徑

?第四步:針對在路由信息放置在前端的應用,前端維護一個路由的配置信息表

import dRouter from './d.json'
if(APPLICATION_TYPE==='d'){
   router=dRouter
}

?第五步:根據路由配置信息,生成路由結構

?第六步:實例化Vue對象

3.3.4. 環(huán)境變量設計

環(huán)境主要分為以下幾種:mock環(huán)境、本地開發(fā)環(huán)境、測試環(huán)境、線上環(huán)境

不同的環(huán)境對應不同的變量文件,在變量文件中設置每個端需要用到的參數,結合 APPLICATION_TYPE 和變量文件的配置,獲取到對應的參數

示例:

# .env.pruduction

# a 業(yè)務
VUE_APP_A_BASEURL = ''   
# b 業(yè)務
VUE_APP_B_BASEURL = ''
# c 業(yè)務
VUE_APP_C_BASEURL = ''
# d業(yè)務
VUE_APP_D_BASEURL = ''

3.3.5. 請求設計

1.公共請求的封裝

封裝基礎的公共請求createHttp.js,各業(yè)務基于公共的請求和各自的code碼,請求參數等信息進行再次封裝,然后可以按照業(yè)務需求調用;

?基礎請求:createHttp.js

?業(yè)務公共封裝:

a. ARequest.js(A業(yè)務公共參數和code碼處理)

b. BRequest.js (B業(yè)務公共參數和code碼處理)

c. CRequest.js(C業(yè)務公共參數和code碼處理)

d. DRequest.js(D業(yè)務公共參數和code碼處理)

?業(yè)務層調用:

a. api/apiA A業(yè)務接口

b. api/apiB B業(yè)務接口

c. api/apiC C業(yè)務接口

// 公共請求封裝  baseHttp.js
export const createHttp = (baseUrl, successFun = () => {}, errorFun = () => {}, requestInterceptor = () => {}) => {
  const http = axios.create({
    baseURL: baseUrl,
    timeout: 5 * 60 * 1000,
    withCredentials: true
  })
  // http request 攔截器
  http.interceptors.request.use(
    async config => {
      await requestInterceptor(config)
      return config
    },
    err => {
      return Promise.reject(err)
    }
  )
  // http response 攔截器
  http.interceptors.response.use(successFun, errorFun)
  return http
}

2. 直接調用后端服務請求封裝

//A業(yè)務基礎請求 
function requestInterceptor(){
    // A系統公共請求參數處理... 
}
function successFn(){
    // A系統公共響應結果處理 統一新增
}
function errorFn(){
    // A共異常處理 包括code碼等情況
}
export default createHttp(baseUrl,successFn,errorFn,requestinterceptor)

3. 業(yè)務接口使用,根據不同的業(yè)務劃分不同的目錄分支

// A業(yè)務請求調用
ARequest.get(url,{params:data})
//B業(yè)務請求調用
BRequest.post(url,{params:data})

3.3.6. 權限和登錄

根據應用類型字段APPLICATION_TYPE,識別不同的環(huán)境,請求不同的服務端接口;不同的服務端代表了不同的應用;

針對不同的應用的未登錄情況,前端維護多套登錄處理邏輯,根據應用類型進行不同的處理邏輯;

3.3.7. 公共函數設計

創(chuàng)建一個公共的utils文件夾,針對兩個項目中的公共函數進行合并,針對有沖突的函數,進行命名修改,全局引入的部分進行路徑和函數的同步修改;

3.3.8. 腳手架配置設計

梳理了兩個項目的腳手架配置差異項及各個配置的作用,對配置作了部分的修改和優(yōu)化,在滿足原有的功能情況下不影響正常的項目運行;

3.3.9. Vuex store設計

store的整體結構保持不變,在項目引用的地址也保持不變,由于項目中使用store的地方較多,保持結構不變能保證改動成本最小,針對兩個項目中模塊名重復的情況,手動把模塊里的內容進行合并;

wKgZO2gsI_uARTlSAAAgkLZkEvM987.png

針對現有的名稱重復內容不一樣的函數,根據應用類型字段 APPLICATION_TYPE 把兩個函數進行融合進行分別處理;

3.3.10. 頁面引用設計

?引用方式變更

由于業(yè)務需求,應用A中嵌套了應用B的頁面,之前通過iframe引用。融合后,頁面文件和組件不再隔離,可以直接引入應用B的文件和組件;

?后端數據打通

應用A的后端服務器上有一些功能,如下載列表,應用B項目需要使用時因數據不通難以直接引用。前端融合后,可以在應用B中直接引用應用A的頁面組件,實現業(yè)務的順暢使用。效果如下:

wKgZPGgsI_yANPAdAAF2j6SPo_8876.png

4. 總結

在經歷了為期兩個月的緊張工作后,我們成功地將兩個大型項目進行了深度整合,取得了顯著的階段性成果。通過這一融合過程,我們不僅統一了項目的代碼規(guī)范和架構,還顯著提升了組件的復用率。盡管在這個過程中我們遇到了諸多挑戰(zhàn)和曲折,但最終的成果——用戶體驗的顯著提升——使一切努力都顯得彌足珍貴。

我們深知,每一個成功的項目背后都有無數次的嘗試和優(yōu)化。在這個過程中,我們不斷學習、適應和完善,最終實現了項目的無縫融合。我們相信,這段經歷和我們所取得的成果,不僅為我們團隊帶來了寶貴的經驗和教訓,也可能為那些正在經歷類似挑戰(zhàn)的同學提供了一些啟示和幫助。

?審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • 前端
    +關注

    關注

    1

    文章

    214

    瀏覽量

    18289
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    變壓器沒有抽頭如何做正負壓?

    變壓器沒有抽頭如何做正負壓?
    的頭像 發(fā)表于 01-20 10:28 ?3069次閱讀
    變壓器沒有抽頭<b class='flag-5'>如何做</b>正負壓?

    如何做labview串口

    如何做labview串口
    發(fā)表于 08-24 14:59

    請教如何做時序分析

    請教如何做時序分析
    發(fā)表于 06-01 22:45

    如何做穩(wěn)定的單片機程序

    如何做穩(wěn)定的單片機程序?如何做穩(wěn)定的上位機程序?
    發(fā)表于 09-30 06:59

    如何做grub啟動盤

    如何做grub啟動盤 有時候我們的電腦可能出現系統無法引導的情況,比如說你重裝了windows,把MBR給重寫了,又比如像我今天這樣,把裝了grub的系統給格了
    發(fā)表于 01-18 12:58 ?2175次閱讀

    如何做一塊好的PCB板

    如何做一塊好的PCB板    大家都知道理PCB板就是把設計好的原理圖變成一塊實實在在的PCB電路板,請別小看這一
    發(fā)表于 01-18 13:16 ?2612次閱讀

    手機企業(yè)如何做項目管理

    手機企業(yè)如何做項目管理 項目管理科學是一門關于項目資金、時間、人力、產品等資源控制的管
    發(fā)表于 07-15 07:51 ?1719次閱讀

    半導體廠商如何做芯片的出廠測試

    半導體廠商如何做芯片的出廠測試呢,這對芯片來說,是流片后或者上市前的必須環(huán)節(jié)。
    發(fā)表于 06-18 15:56 ?1.6w次閱讀

    半導體廠商如何做芯片的出廠測試

    半導體廠商如何做芯片的出廠測試,感興趣的小伙伴們可以瞧一瞧。
    發(fā)表于 10-26 15:55 ?0次下載

    接口測試與前端測試的區(qū)別與聯系

    主要從問題出發(fā),引入接口測試的相關內容并與前端測試進行簡單對比,總結兩者之前的區(qū)別與聯系。但該部分只交代了怎么如何做?并沒有解釋為什么要做?
    發(fā)表于 05-26 09:44 ?4738次閱讀
    接口測試與<b class='flag-5'>前端</b>測試的區(qū)別與聯系

    Win10系統如何做虛擬機構建局域網使和利時軟件可以單機仿真

    Win10系統如何做虛擬機構建局域網,使和利時軟件可以單機仿真。
    發(fā)表于 11-12 08:00 ?4次下載
    Win10<b class='flag-5'>系統</b>下<b class='flag-5'>如何做</b>虛擬機構建局域網使和利時軟件可以單機仿真

    博圖WINCC如何做畫面模板

    博圖WINCC 如何做畫面模板
    的頭像 發(fā)表于 10-10 09:10 ?3.3w次閱讀
    博圖WINCC<b class='flag-5'>如何做</b>畫面模板

    2021 OPPO開發(fā)者大會主會場:OPPO 如何做健康

    2021 OPPO開發(fā)者大會主會場:OPPO 如何做健康?
    的頭像 發(fā)表于 10-27 11:42 ?1528次閱讀
    2021 OPPO開發(fā)者大會主會場:OPPO <b class='flag-5'>如何做</b>健康

    涂鴉IoT平臺如何做智能家居項目

    電子發(fā)燒友網站提供《涂鴉IoT平臺如何做智能家居項目.zip》資料免費下載
    發(fā)表于 11-08 10:40 ?7次下載
    涂鴉IoT平臺<b class='flag-5'>如何做</b>智能家居項目

    安信可AiPi-Eyes-R2如何做86智能盒?

    安信可AiPi-Eyes-R2如何做86智能盒?
    的頭像 發(fā)表于 11-29 16:05 ?959次閱讀
    安信可AiPi-Eyes-R2<b class='flag-5'>如何做</b>86智能盒?