@@ -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