跳至主要内容

2 篇文章 含有標籤「npm」

檢視所有標籤

微前端(Micro-Frontend)介紹與入門教學筆記 | 學習筆記

· 閱讀時間約 4 分鐘
kdchang

前言

隨著前端應用日益複雜、團隊規模擴大,「前端單體應用」(Monolithic Frontend)逐漸面臨維護困難、部署不靈活、開發效率低落等問題。微前端(Micro-Frontend)是一種將大型前端應用拆解為數個獨立子應用的架構設計理念,靈感來自後端的微服務(Microservices)架構。每個子應用可以由不同的團隊獨立開發、部署、維護,並共同組成一個整體的產品。

微前端不是某個框架,而是一種架構模式。它的目標是促進前端大型專案的模組化、團隊分工清晰、技術選型彈性,進而提升整體開發與交付效率。


重點摘要

微前端的常見做法

  1. Module Federation(Webpack 5 原生支援,超常見)
  • 各子應用直接共享模組,不用重複打包
  • Webpack 官方強項,Vite 沒有原生支援
  1. iframe / Web Component(框架無關,通用做法)
  • 每個子應用獨立部署,用 iframe 或 custom elements 包裝
  • Vite/React/Vue/Angular 都可以做
  1. 乾淨的 build output + 部署整合
  • 子應用都 build 出靜態資源,整合到主應用路由

  • 跟工具無關,Vite 也能勝任

  • 定義:微前端是一種將前端應用拆解為多個獨立子應用的架構設計模式。

  • 目的

    • 支援大型團隊並行開發
    • 提高部署彈性(單一子應用可獨立上線)
    • 增加技術選擇自由度(不同子應用可使用不同框架)
  • 核心概念

    • 子應用獨立開發、測試與部署
    • 主應用統一載入與整合子應用
    • 子應用可共享部分資源(如登入狀態、UI 元件)
  • 常見實作方式

    • iframe(早期簡單做法,但 UX 不佳)
    • Web Component(標準化但整合與溝通略複雜)
    • JavaScript 插入與渲染(如 single-spa、Module Federation)
  • 適用時機

    • 專案規模大、開發團隊超過 2 組以上
    • 需要支援異步部署與灰階上線
    • 跨框架共存需求(如同時有 React 與 Vue)

微前端實作方式簡介

1. iframe(不推薦)

將子應用放入 iframe 中載入,雖然簡單,但隔離性太強(無法共用狀態、樣式),SEO 和體驗差,不推薦用於現代 Web 專案。

2. Web Components(中立)

透過瀏覽器原生的 Custom Elements 技術(如 my-app-widget),讓子應用變成一個可重用的 HTML 元件,框架中立,但整合難度高。

3. JavaScript 插入與路由分流(主流)

由主應用動態載入子應用(HTML、JS、CSS),並透過路由或 DOM 控制子應用顯示。可使用像是:

其中 qiankun 是阿里開源的基於 single-spa 的微前端框架,中文文件齊全且上手容易。


實際範例:使用 qiankun 快速建立微前端架構

範例說明

目標:建立一個主應用(main-app),載入兩個子應用(react-app、vue-app)

1. 安裝 qiankun(主應用)

npm install qiankun

2. 主應用主體程式碼(main-app/src/main.ts)

import { registerMicroApps, start } from 'qiankun';

registerMicroApps([
{
name: 'react-app',
entry: '//localhost:3001',
container: '#subapp-container',
activeRule: '/react',
},
{
name: 'vue-app',
entry: '//localhost:3002',
container: '#subapp-container',
activeRule: '/vue',
},
]);

start();

3. 主應用 HTML 模板

<div id="subapp-container"></div>

4. 子應用需支援 qiankun 的生命週期函式(以 React 為例)

export async function bootstrap() {
console.log('React app bootstraped');
}
export async function mount(props) {
ReactDOM.render(<App />, document.getElementById('root'));
}
export async function unmount() {
ReactDOM.unmountComponentAtNode(document.getElementById('root'));
}

5. 子應用 Webpack 設定(publicPath)

output: {
publicPath: 'http://localhost:3001/',
},

微前端的挑戰與注意事項

  • 樣式隔離:CSS 必須避免衝突,可搭配 CSS Modules、Scoped CSS。
  • 狀態共享:登入資訊、使用者資料等需透過 global event 或共享 storage 處理。
  • 路由協調:子應用與主應用須協調 route 設計,避免相互干擾。
  • 部署整合:CI/CD pipeline 需考慮子應用與主應用的獨立部署與測試。

總結

微前端是一種極具彈性的架構設計理念,適合中大型團隊協作、複雜前端系統的模組化開發。不過它也帶來額外的技術成本與整合挑戰。在決定導入微前端前,應評估專案規模、開發團隊結構與維運資源是否適合。

實作上,建議可從單一框架開始(如 React + qiankun),逐步拆分模組與部署機制,再逐步進化為多框架混合的微前端架構,避免過早複雜化系統。

Monorepo 入門教學筆記:使用 npm Workspaces 管理多專案 | 學習筆記

· 閱讀時間約 4 分鐘
kdchang

一、什麼是 Monorepo?

Monorepo(Monolithic Repository) 是一種將多個相互關聯的專案(如前端、後端、共用函式庫等)統一放在同一個 Git 倉庫中進行版本管理的架構策略。這種做法可提升跨專案開發效率、共用程式碼的一致性,並簡化 CI/CD 流程。

相較於 Multi-repo(每個專案獨立倉庫),Monorepo 具有以下幾項優勢:

優點

  • 統一依賴管理:使用者可於 root 層集中管理所有套件與版本。
  • 共用程式碼方便:子專案間可以引用彼此模組,而不需額外發佈。
  • 版本一致性高:統一管理 Node.js 與 TypeScript 設定,避免各專案設定不一致。
  • 原子性變更:可一次提交多個模組的改動,有利於大型重構與追蹤問題。

缺點

  • 權限與管理更複雜:團隊需要良好的規範以避免耦合過深。
  • 初期學習門檻略高:需要理解 workspace 機制與設定方式。
  • 大型 repo 操作效能問題:隨專案規模增長,Git 操作與工具效能需特別注意。

二、何謂 npm Workspaces?

npm 7 開始,Node.js 官方就原生支援 Workspaces。它允許開發者在單一專案下,透過一個 package.json 管理多個子專案(workspace packages)。這讓 npm 也能像 Yarn 或 pnpm 一樣支援 monorepo。

特點:

  • 原生支援,不需額外工具
  • 使用方式簡單直觀
  • 適合小型與中型 monorepo 專案

三、建立 Monorepo 專案實例(使用 npm workspaces)

1. 初始化根目錄

mkdir my-monorepo
cd my-monorepo
npm init -y

修改根目錄下的 package.json 加入 workspaces 設定:

{
"name": "my-monorepo",
"version": "1.0.0",
"private": true,
"workspaces": ["packages/*"]
}

這表示所有子專案會放在 packages/ 目錄中,支援通配符 *


2. 建立三個子專案

  • packages/utils:共用函式庫
  • packages/backend:Node.js API
  • packages/frontend:前端應用(可用 React/Vite)
mkdir -p packages/utils
mkdir -p packages/backend
mkdir -p packages/frontend

初始化子專案:

cd packages/utils
npm init -y

cd ../backend
npm init -y

cd ../frontend
npm init -y

3. 撰寫共用模組(utils)

packages/utils/index.js

function greet(name) {
return `Hello, ${name}`;
}

module.exports = { greet };

packages/utils/package.json

{
"name": "@my/utils",
"version": "1.0.0",
"main": "index.js"
}

4. 使用共用模組於 backend

packages/backend/index.js

const { greet } = require("@my/utils");

console.log(greet("Backend"));

packages/backend/package.json 加入依賴:

{
"name": "@my/backend",
"version": "1.0.0",
"main": "index.js",
"dependencies": {
"@my/utils": "1.0.0"
}
}

當你在 monorepo 根目錄執行:

npm install

npm 會自動建立 workspace 之間的 symbolic link,將 @my/utils 套件安裝給 @my/backend,無需手動 npm publish

執行 backend:

node packages/backend/index.js

輸出結果為:

Hello, Backend

5. 多專案腳本管理

在 root 的 package.json 中可設定統一指令:

{
"scripts": {
"start:backend": "npm --workspace @my/backend start",
"start:frontend": "npm --workspace @my/frontend start"
}
}

若在 @my/backendpackage.json 中定義了:

{
"scripts": {
"start": "node index.js"
}
}

則可於根目錄執行:

npm run start:backend

四、進階使用技巧

1. 同時執行所有 workspace 指令

npm run build --workspaces

這會同時執行所有子專案中名為 build 的 script。

2. 安裝依賴給特定子專案

npm install lodash --workspace @my/backend

等同於進到 packages/backend 下執行 npm install lodash

3. 使用 TypeScript 建構共用型別

若你使用 TypeScript,可將 packages/utils 改為 index.ts 並加上 types 欄位:

{
"name": "@my/utils",
"version": "1.0.0",
"main": "dist/index.js",
"types": "dist/index.d.ts"
}

建議搭配 tsc -b 支援 project references,以改善大型專案建置效能。


五、適合使用 Monorepo 的情境

  • 前後端一體化開發(Fullstack)
  • 套件開發與組合應用(如微前端架構)
  • 共用型別與邏輯模組(utility / types / domain model)
  • 多人協作、模組劃分清晰的大型產品

六、總結

Monorepo 是一種有效提升多專案整合效率的開發模式。透過 npm Workspaces,你可以不用額外安裝任何工具,即可快速建立一個結構清晰的 monorepo。這種架構不僅適合大型產品團隊,也非常適合個人或小型團隊開發多模組系統時採用。

建議開發者從簡單的 monorepo 起步,並根據團隊需求逐步導入版本控制策略、模組邊界規範與自動化部署流程,以發揮 Monorepo 架構的最大價值。


若你有意將這份架構應用到 React、Next.js、NestJS、TypeScript、Lerna 等進階框架或部署情境,歡迎告訴我,我可以提供進一步的範例與最佳實踐建議。