前端不再是一整包:微前端初體驗實戰心得

前言

在我還沒入職前,公司原本以 React 作為主要的前端開發框架。隨著專案的需求變化與團隊技術方向的調整,後續新功能與模組都開始改以 Vue 進行開發,因此我踏上了微前端之旅。

由於已經使用 React 開發一段時間了,人力與時程上的限制,React 專案無法立即淘汰,Vue 新功能也需要儘早上線,感覺是公司為了解決這樣的耦合與協作問題,導入了 微前端架構,讓各子系統能夠獨立開發與部署,並實現在單一系統中共存 React 與 Vue 的彈性架構。

這篇文章是我作為使用微前端在開發過程中的觀察與心得整理,若有錯誤之處,還請見諒,畢竟我並未全程參與前期的微前端架構的規劃與建置。

架構分層設計

在微前端架構中,前端應用通常可以分為四層,分層這部分的命名看團隊怎麼去規範,大致分別為:

分類 說明
Host
系統入口/容器
整個應用的入口,負責統整各子系統(System),載入 remote 模組。在 Module Federation 中稱為 ConsumerHost
System
獨立子系統
具備完整功能的子系統,獨立部署,擁有自己的 router、狀態,透過 Module Federation 作為 Remote 提供給 Host 使用。
Module
功能模組
具備邏輯與副作用的功能單元,可能操作 store、呼叫 API,常被多個 System 重複使用。
Component
UI 元件
最基礎的 UI 單元,純呈現與樣式,不應有副作用或外部依賴,通常集中在共用 UI Library 中。

Host:系統入口點

  • 負責整體 layout、登入流程、統一樣式與外框。
  • 為微前端架構的容器,初始化 Module Federation。
  • 載入各個子系統(System)並整合畫面。

System:獨立子系統

  • 各自為一個完整的功能系統,如會員系統、訂單系統。
  • 可獨立開發、獨立部署,擁有自己的 router 與狀態管理。
  • exposes remote 的形式被 Host 載入。

Module:功能模組

  • 可被多個 System 共用,具備一定的邏輯與副作用(如打 API、處理資料、操作 store)。
  • 從外部看起來像 UI component,但職責更重,因此獨立命名為 Module
  • System 而言,Module 就像 SDK,直接使用即可,無需關注其內部實作。

Component:純 UI 元件

  • 僅處理 UI 呈現與樣式,無副作用、不涉及業務邏輯。
  • 如 Button、Input、Modal 等。
  • 集中於共用 UI Library 中,提供給 ModuleSystem 使用。

這樣的分層設計可以強化職責分離,提高維護與擴充性以及降低模組之間的耦合。

技術選擇

使用了以下技術組合來實現微前端:

  • module-federation
    作為模組間的共享與動態載入機制,讓應用之間能彼此引入模組、共用資源。

  • @module-federation/bridge-vue3@module-federation/bridge-react19
    解決 Vue 與 React 間的相容問題,讓兩者的元件能夠互相嵌套與溝通,實現跨框架整合。

  • 多應用獨立管理(獨立 repo / CI / 部署)
    每個子系統或是模組(System / Module)都是獨立的 Git 倉庫與部署,能根據需求調整技術、建置流程與版本管理,保持彈性。

微前端的好處

  • System / Module 獨立部署,錯誤不影響整體系統
    每個 System 或 Module 都有自己的版本、自己的 CI/CD 流程,彼此之間不會互相干擾,所以當某個 System / Module 掛掉,並不會去影響整體系統的運作,提高容錯能力。

  • 多框架共存
    Vue 與 React 可同時並行開發,讓舊有 React 專案持續維護的同時,能用 Vue 推進新需求,降低重構風險與人力成本。

  • 漸進式重構
    無需一次性大規模替換 React,能逐步將舊系統拆解成 Vue 子系統,實現逐步將 React 專案轉換成 Vue。

  • 共用模組,提升效率與一致性
    將常用邏輯(如:API 操作、表單驗證、圖表呈現)抽離成獨立 Module,可被多個 System 重複使用減少重複實作,提升開發效率與一致性。

微前端的壞處

  • 初始載入較慢
    各子系統會載入自己的 JavaScript 與 CSS 資源,初次載入時可能會感受到延遲,尤其是首次切換至尚未使用過的模組時。

  • 多開專案,開發成本上升
    在日常開發中,通常需要同時開啟 Host、System,甚至是 Module 等多個專案環境。開發者需理解與跳轉多個專案架構,思緒容易中斷,開發與除錯過程相對繁瑣。

  • 狀態管理難以整合
    React 與 Vue 各自有不同的狀態管理方案(Redux、Zustand、Pinia、Vuex 等),若沒有統一標準,容易產生混亂。實務上,通常需要選擇一套作為全局狀態的主導工具。

  • Bridge 解決跨框架問題,但寫法冗長
    使用 bridge 將 React 元件包裝成 Vue(或反之)時,需要額外寫 wrapper、props、事件轉換等邏輯,造成開發流程變得繁瑣,尤其在處理雙向綁定或事件回傳時。

  • 模組生命週期難以控管
    不同框架有各自的生命週期,像是 Vue 在 setup 階段時 React 模組還沒掛載完成,會導致取不到內容或執行順序錯亂。

  • 使用者體驗狀態無法統一控制
    若模組未提供如 disabledloadingerror 等狀態對外暴露,主應用將無法統一處理使用者體驗,容易出現畫面不一致或互動邏輯衝突的情況。

結語

微前端確實在架構轉換的過渡期間,為我們提供了一個務實且彈性的解法,讓團隊能夠在不中斷既有開發的情況下,逐步導入其他技術,降低一次性重構的風險與成本。對於開發者而言也有不少挑戰需要面對,包括跨框架整合的技術複雜度、模組生命週期的不同步,以及多專案開發所帶來的體驗上的落差。

對我個人來說,這是一段非常有價值的學習與實戰經驗。它讓我更清楚認識到,微前端不是萬用解法,而是一種階段性的選擇。是否適合導入到專案裡面是看團隊的目標、規模與共識。技術最終是服務於需求,好的架構不是最先進的,而是最貼合當下狀況的。