天天看點

背景tab頁接入微應用的問題

記錄在舊背景系統中嵌入微應用時,遇到的關于 tab 标簽頁及元件緩存的問題

頁面結構

背景tab頁接入微應用的問題
背景tab頁接入微應用的問題
這裡主要功能頁都将通過 main.vue 元件渲染到右側容器中, 左側為主菜單。每一子頁被激活後,将新增tab标簽。tab 标簽之間切換将不更新元件内容。

原來元件渲染結構

背景tab頁接入微應用的問題

這裡iframe未被使用,是以關注點在兩個路由的渲染入口, 1. tab頁内容入口 2. 其他子頁内容入口.

多 keep-alive 與 router-view

我們知道 keep-alive 用于維持元件狀态,router-view 将作為路由比對後的元件渲染出口.

這裡将 keep-alive 和 router-view 嵌套在 tab中,将生成多組渲染出口.

如果隻是從單純渲染的角度,單一的出口既可以滿足。 但單一出口的問題在于, keep-alive 對于元件緩存的處理。

實際測試會發現,單一出口時,路由切換, tab标簽關閉後新增,都将維持元件的狀态。 這就和我們的預期有出入了, 我們期望關閉tab标簽關閉後,元件狀态也被重置。這裡就和keep-alive的緩存機制有關,keep-alive 将緩存包裹内的元件執行個體,當下次渲染時,重複使用該執行個體。是以keep-alive 内的元件重複渲染時,不會觸發元件内的created鈎子。

而多 keep-alive , router-view 為每一tab标簽獨立配置設定元件緩存, 當該标簽移除時,keep-alive也将被移除,是以元件緩存也将清除。 下次新增标簽将為全新元件。

微應用引入

問題1: 原 main.vue 主容器與 mou路由 '/' 綁定,如何觸發微應用加載 ?

為了盡量相容原元件加載方式,這裡微應用的加載觸發,選擇沿用原觸發方式,隻在配置已經渲染出口時做差異化處理. 這裡隻做簡單流程梳理

路由注冊以及觸發流程

背景tab頁接入微應用的問題

菜單UI加載及觸發.png

背景tab頁接入微應用的問題

微應用渲染入口

這裡微應用的加載,都通過手動控制,将周期鈎子與微應用容器元件關聯在一起

主容器入口

背景tab頁接入微應用的問題

微應用容器

背景tab頁接入微應用的問題
背景tab頁接入微應用的問題

問題2: 如何渲染微應用且保持微應用狀态 ?

微應用狀态保持,需要基座與微應配合。

保證微應用容器在使用中不會被登出, 這裡利用與原路由出口一緻的設定方式

背景tab頁接入微應用的問題

微應用内配置keep-alive

背景tab頁接入微應用的問題
這裡子應用作為微應用時将設定統一的路由字首,類似主應用的嵌套路由元件

總結

對于這類tab标簽頁引入微應用的情況,

主要的問題是:

主次應用路由嵌套關系

子應用指定渲染容器

子應用的生命周期控制

子應用與原元件的相容協同

一個簡單直接的辦法,可以将子應用看作一類線上動态路由元件。 而這類元件的聲明周期是關注的重點.