Appearance
微前端与 Monorepo
架构设计 · Qiankun/Micro App · pnpm workspace · 构建脚本 · CI/CD
一、微前端 + Monorepo 架构设计
适用场景:多团队协作的后台管理系统、电商/金融等多子系统项目
Monorepo 技术选型:
| 类型 | 方案 | 特点 |
|---|---|---|
| 构建型 | Turborepo / Rush / Nx | 极致构建性能优化,适合大型项目 |
| 轻量型 | pnpm / Lerna / Yarn | 渐进式,解决依赖管理和版本管理 |
微前端技术选型:
| 框架 | 特点 |
|---|---|
| Qiankun | 基于 single-spa,主流方案,完善沙箱/通信 |
| Micro App | 基于 WebComponent,接入成本极低 |
| 无界 | WebComponent + iframe 沙箱 |
| EMP | Webpack5 Module Federation,共享粒度自由 |
pnpm monorepo + Micro App 架构
├── packages/
| ├── base/ # 基座应用(Vite + Vue3)
| ├── child-app1/ # 子应用(vue-cli + Vue2)
| ├── child-app2/ # 子应用
| └── share/ # 共享模块(request/类型定义/工具函数)
├── config.json # 统一应用配置(name/port/auth)
├── pnpm-workspace.yaml核心实践
- 自动生成路由:基座读取 config.json,遍历子应用配置自动生成路由 +
<micro-app>页面组件 - 应用间通信:
- 基座 → 子应用:
microApp.setData(name, data) - 子应用 → 基座:
window.microApp.dispatch(data) - 全局通信:
microApp.getGlobalData()/addGlobalDataListener() - 本地存储:同域下共享 localStorage(注意加密敏感数据)
- 基座 → 子应用:
- 跨应用跳转:
getActiveApps()判断子应用是否已运行 → 已运行则setData通知跳转,否则router.push - 共享模块:子应用通过
"@package/share": "workspace:*"引用,rollup 打包为 ESM - 样式隔离:Micro App 自带 scopeCSS,但建议关闭后使用原子化 CSS(Tailwind/UnoCSS)避免基座样式影响
Nginx 部署配置
nginx
# 子应用统一匹配(新增子应用无需改配置)
location ^~ /child {
root /usr/share/nginx/html;
add_header Access-Control-Allow-Origin *;
try_files $uri $uri/ index.html;
}二、pnpm workspace 依赖管理
bash
pnpm add typescript -D -w # 全局安装(-w 表示 workspace-root)
pnpm add typescript -D --filter pkg-a # 局部安装到指定包
pnpm add pkg-a -D --workspace --filter pkg-b # 包之间互相引用
pnpm -r --filter=./packages/* run build # 批量构建所有子包三、npm 包发布流程(bumpp + GitHub Actions)
yaml
# .github/workflows/release.yml
on:
push:
tags: ['v*']
jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: pnpm/action-setup@v2
- run: pnpm i
- run: pnpm run build
- run: pnpm publish -r --access public --no-git-checks
env:
NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}
- run: npx changelogithub # 自动生成 CHANGELOG四、Monorepo 构建脚本优化
问题:多应用时 npm script 膨胀,新增应用需手动维护
方案:基于 config.json 自动生成 dev/build 脚本
dev.js:检测端口占用 → inquirer 选择子应用 → execa 启动build.js:inquirer 多选 → Promise.all 并行打包- 依赖:inquirer(交互)、execa(子进程)、detect-port(端口检测)
相关
- Webpack 原理与优化 — 构建配置与优化
- 组件库与 npm 包 — 组件库搭建与发布