萬象,一個與技術棧無關的微前端方案

演示地址

https://chjtx.com/wanxiang/app1

倉庫地址

https://gitee.com/chenjianlong/wanxiang

前言

  • 如何理解微前端?獨立部署,無感加載,環境隔離?

  • 微前端能解決什麼問題?不影響老系統前提下開發新業務享受新技術帶來的便利?拆分系統分散到各開發小組方便維護?

  • 目前主流微前端框架 qiankun 是否滿足上述所有訴求?

在嘗試過用 vite 搭建 qiankun 項目後,我發現幾個問題:

  • 1、開發環境下主應用訪問不到子應用,即使網上有很多方案,但始終還是做不到 js 沙箱和 css 樣式絕對隔離

  • 2、微應用切換時依然是加載所有資源,並不會比刷新頁面加載的資源少

既然加載的資源不會比刷新頁面少,那麼我們可不可以直接刷新頁面呢?只要首屏資源足夠輕量,響應速度足夠快,同樣可以達到無感切換。我參與過不少用 webpack 搭建的 qiankun 項目,幾乎所有項目都是主應用加載菜單,子應用業務內容在右側主體區域顯示的模式。那麼換個思路,所以業務應用都優先加載菜單,通過本地緩存記錄菜單數據、狀態甚至滾動位置,是否就可以達到無感刷新切換應用的效果?而用這種傳統的刷新頁面方式根本不用考慮 js 、css 被其它應用污染的問題。

對比

方案 乾坤 萬象
運行方式 攔截子應用代碼,經過轉換再掛載到主應用 沒有主子應用之分,只有簡單的加載公共菜單
沙箱隔離 支持 js、css 沙隔離,但 js 通過 with 限制作用域,css 通過自動添加前綴,轉換過程中有性能損耗 天然隔離,無須各種轉換,切換應用直接刷新頁面,不存在性能損耗
子應用 支持 不支持
更新部署 只有主應用更新時,無須更新子應用 公共菜單更新時,需要更新所有應用
複雜度 主子應用使用相同技術棧比較容易上手,使用不同技術棧樣式隔離比較頭疼 爲了保障菜單加載速度,達到無感刷新效果,使用純原生技術開發,對維護菜單的開發者技術要求較高
掌控度 遇到bug需要向社區反饋,等待解決方案,自行修改源碼難度較高 整體就一個菜單組件的代碼量,完全可以自行修改源碼
成熟度 螞蟻內部服務了超過 2000+ 線上應用 新鮮出爐,還沒遇到什麼坑,理論上應該沒什麼坑

目錄結構

--/
  |-- common/  # 公共組件模塊
    |-- wanxiang/
  |-- app1/    # 應用1,獨立倉庫
    |-- package.json
  |-- app2/    # 應用2,獨立倉庫
    |-- package.json
  |-- package.json
  |-- .gitignore  # 忽略掉 app1 和 app2

如上圖目錄結構,有3個git倉庫,一個公共的,一個 app1,一個 app2

app1 和 app2 都可以通過配置依賴路徑別名加載 common 的資源,樸素無華,沒有花裏胡哨的模塊聯邦。

多倉庫模式能有效解決開發團隊的權限問題,同時避免了 git 歷史記錄洪流。

開始

<!-- index.html -->
<head></head>
<body>
  <div id="app"></div>
  <!-- 將 main.js 替換爲 entry.js -->
  <script src="entry.js"></script>
</body>
// enrty.js
import { start, setMenus } from 'common/wanxiang/index.js'

start(`#app`, () => {
  // 關鍵點,顯示完主體菜單再加載業務代碼
  import('./main.js')

  // 加載菜單數據
  fetch('/menu').then(res => res.json()).then(res => {
    setMenus(res.data)
  })
})

後語

萬象不是框架也不是插件,是一種方案,一種管理大規模前端應用的方案,沒有具體的標準,根據各自項目需求對公共菜單進行調整,因此每個項目都會有不同的表象,遂取名爲“萬象”。

轉載請註明出處:https://my.oschina.net/cjlice/blog/11047785

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章