Skip to content

Commit f3c8add

Browse files
committed
build: mfe config
1 parent ef68d7d commit f3c8add

7 files changed

Lines changed: 3033 additions & 894 deletions

File tree

docs/MFE_DEPLOYMENT.md

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,123 @@ jobs:
343343
REMOTE_USER: ${{ secrets.REMOTE_USER }}
344344
```
345345
346+
### 5. Vercel 部署(推荐方案:独立项目)
347+
348+
#### 为什么推荐独立项目?
349+
350+
将多个 MFE 放在同一 Vercel 项目 + 子路径下,使用 `publicPath: 'auto'` 经常出问题:
351+
- 刷新页面或深层路由时 `document.currentScript.src` 推断错误
352+
- Vercel rewrites 与 Module Federation chunk 加载互相干扰
353+
- 调试困难,排错成本高
354+
355+
**推荐方案**:每个 MFE 独立 Vercel 项目,Host 用完整 URL 引用 Remote。
356+
357+
#### 部署架构
358+
359+
```
360+
┌─────────────────────────────────────────────────────────────────┐
361+
│ 独立 Vercel 项目 │
362+
├─────────────────────────────────────────────────────────────────┤
363+
│ pro-react-admin-shell.vercel.app ← Host (主应用) │
364+
│ pro-react-admin-projecta.vercel.app ← Remote A │
365+
│ pro-react-admin-projectb.vercel.app ← Remote B │
366+
└─────────────────────────────────────────────────────────────────┘
367+
```
368+
369+
#### 步骤 1: 创建三个 Vercel 项目
370+
371+
在 Vercel Dashboard 中创建三个独立项目,连接同一个 Git 仓库:
372+
373+
| 项目名 | 配置文件 | 用途 |
374+
|--------|----------|------|
375+
| `pro-react-admin-shell` | `vercel.shell.json` | Host 主应用 |
376+
| `pro-react-admin-projecta` | `vercel.projectA.json` | Remote A |
377+
| `pro-react-admin-projectb` | `vercel.projectB.json` | Remote B |
378+
379+
#### 步骤 2: 配置各项目
380+
381+
**Shell (Host) 项目设置:**
382+
- Framework Preset: `Other`
383+
- Build Command: `npm run build:mf:shell`
384+
- Output Directory: `dist-shell`
385+
- 环境变量:
386+
```
387+
MFE_PROJECTA_URL=https://pro-react-admin-projecta.vercel.app/remoteEntry.js
388+
MFE_PROJECTB_URL=https://pro-react-admin-projectb.vercel.app/remoteEntry.js
389+
```
390+
391+
**ProjectA (Remote) 项目设置:**
392+
- Framework Preset: `Other`
393+
- Build Command: `cross-env PROJECT=projectA MFE_ROLE=remote npm run build:mf`
394+
- Output Directory: `dist-projectA`
395+
396+
**ProjectB (Remote) 项目设置:**
397+
- Framework Preset: `Other`
398+
- Build Command: `cross-env PROJECT=projectB MFE_ROLE=remote npm run build:mf`
399+
- Output Directory: `dist-projectB`
400+
401+
#### 步骤 3: 使用 Vercel CLI 部署(可选)
402+
403+
```bash
404+
# 部署 Shell
405+
vercel --prod --local-config vercel.shell.json
406+
407+
# 部署 ProjectA
408+
vercel --prod --local-config vercel.projectA.json
409+
410+
# 部署 ProjectB
411+
vercel --prod --local-config vercel.projectB.json
412+
```
413+
414+
#### 步骤 4: 配置自定义域名(推荐)
415+
416+
为了更好的用户体验和品牌一致性:
417+
418+
```
419+
app.yourdomain.com → Shell (Host)
420+
projecta.yourdomain.com → ProjectA (Remote)
421+
projectb.yourdomain.com → ProjectB (Remote)
422+
```
423+
424+
然后更新 Shell 的环境变量:
425+
```
426+
MFE_PROJECTA_URL=https://projecta.yourdomain.com/remoteEntry.js
427+
MFE_PROJECTB_URL=https://projectb.yourdomain.com/remoteEntry.js
428+
```
429+
430+
#### 配置文件说明
431+
432+
项目根目录包含三个 Vercel 配置文件:
433+
434+
- `vercel.shell.json` - Shell (Host) 配置
435+
- `vercel.projectA.json` - ProjectA (Remote) 配置
436+
- `vercel.projectB.json` - ProjectB (Remote) 配置
437+
438+
每个配置文件都包含:
439+
- `buildCommand`: 构建命令
440+
- `outputDirectory`: 输出目录
441+
- `rewrites`: SPA 路由支持
442+
- `headers`: CORS 和缓存配置(Remote 需要跨域头)
443+
444+
#### 单项目部署(备选方案)
445+
446+
如果坚持使用单项目 + 子路径方案,参考 `vercel.json`
447+
448+
```json
449+
{
450+
"version": 2,
451+
"buildCommand": "npm run build:mf:vercel",
452+
"outputDirectory": "dist-vercel",
453+
"rewrites": [
454+
{ "source": "/projectA/((?!.*\\.[a-z0-9]+$).*)", "destination": "/projectA/index.html" },
455+
{ "source": "/projectB/((?!.*\\.[a-z0-9]+$).*)", "destination": "/projectB/index.html" },
456+
{ "source": "/((?!projectA|projectB)(?!.*\\.[a-z0-9]+$).*)", "destination": "/index.html" }
457+
]
458+
}
459+
```
460+
461+
⚠️ **注意**:此方案需要精确配置 rewrites 正则表达式,且 `publicPath: 'auto'` 在某些边缘情况下可能失效。
462+
346463
## 环境变量配置
347464

348465
### .env.production 示例

0 commit comments

Comments
 (0)