# 自动生成 Module Federation Exposes 配置

## 功能说明

这个插件会根据 Vue Router 的路由配置自动生成 Module Federation 的 `exposes` 配置。

### 主要特性

- ✅ 自动从路由配置中提取所有组件
- ✅ 支持嵌套路由（子路由会生成对应的路径）
- ✅ 保留路由的 meta 信息（可用于生成文档）
- ✅ 无需手动维护 exposes 配置

## 生成的规则

1. **顶层路由**：`/home` → `'./home': './src/views/HomeView.vue'`
2. **嵌套路由**：`/home/dashboard` → `'./home/dashboard': './src/views/DashboardView.vue'`
3. **路径规范**：自动去掉开头的 `/`，生成规范的模块路径

## 使用示例

### 1. 路由配置

```typescript
// src/router/routes.ts
export const routes: RouteRecordRaw[] = [
  {
    path: '/home',
    name: 'Home',
    component: () => import('../views/HomeView.vue'),
    meta: {
      title: '首页视图',
      description: '应用首页，展示主要内容和导航',
      category: 'Page',
      icon: 'home',
      tags: ['首页', '主页面'],
    },
    children: [
      {
        path: 'dashboard',
        name: 'Dashboard',
        component: () => import('../views/DashboardView.vue'),
        meta: {
          title: '仪表盘',
          description: '展示应用的主要数据和统计信息',
          category: 'Page',
          icon: 'dashboard',
          tags: ['仪表盘', '数据展示'],
        },
      },
    ],
  },
  {
    path: '/about',
    name: 'About',
    component: () => import('../views/AboutView.vue'),
    meta: {
      title: '顶部导航栏',
      description: '全局头部导航组件，包含Logo和菜单',
      category: 'Layout',
      icon: 'header',
      tags: ['导航', '布局'],
    },
  },
]
```

### 2. Rsbuild 配置

```typescript
// rsbuild.config.ts
import { routes } from './src/router/routes';
import { generateExposesFromRoutes } from './plugins/generateExposesPlugin';

export default defineConfig({
  plugins: [
    pluginModuleFederation({
      name: 'remote1',
      // 🚀 根据路由自动生成 exposes 配置
      exposes: generateExposesFromRoutes(routes).exposes,
      // ... 其他配置
    }),
  ],
});
```

### 3. 生成的配置

```typescript
exposes: {
  './home': './src/views/HomeView.vue',
  './home/dashboard': './src/views/DashboardView.vue',
  './about': './src/views/AboutView.vue',
}
```

## 测试生成的配置

运行测试脚本查看生成的配置：

```bash
npx tsx scripts/test-exposes.ts
```

输出示例：
```
📋 Detailed expose items:
┌─────────┬────────────────────┬─────────────────────────────────┬──────────────┐
│ (index) │ Expose Key         │ Component Path                  │ Title        │
├─────────┼────────────────────┼─────────────────────────────────┼──────────────┤
│ 0       │ './home'           │ './src/views/HomeView.vue'      │ '首页视图'   │
│ 1       │ './home/dashboard' │ './src/views/DashboardView.vue' │ '仪表盘'     │
│ 2       │ './about'          │ './src/views/AboutView.vue'     │ '顶部导航栏' │
└─────────┴────────────────────┴─────────────────────────────────┴──────────────┘
```

## 在其他应用中使用暴露的模块

### Host 应用配置

```typescript
// host 应用 rsbuild.config.ts
export default defineConfig({
  plugins: [
    pluginModuleFederation({
      name: 'host',
      remotes: {
        remote1: 'remote1@http://localhost:3000/mf-manifest.json',
      },
    }),
  ],
});
```

### 使用远程模块

```typescript
// 在 Vue 组件中使用
const HomeView = defineAsyncComponent(() =>
  import('remote1/home')
)

const DashboardView = defineAsyncComponent(() =>
  import('remote1/home/dashboard')
)
```

## 高级用法

### 获取详细的 expose 信息

```typescript
const { exposes, exposeItems } = generateExposesFromRoutes(routes);

// exposeItems 包含详细的 meta 信息
console.log(exposeItems);
/*
[
  {
    key: './home',
    value: './src/views/HomeView.vue',
    meta: {
      title: '首页视图',
      description: '应用首页，展示主要内容和导航',
      category: 'Page',
      icon: 'home',
      tags: ['首页', '主页面'],
    }
  },
  // ... more items
]
*/
```

### 生成模块文档

利用 `exposeItems` 中的 meta 信息，你可以自动生成模块使用文档。

## 注意事项

1. **路由配置分离**：路由配置必须放在单独的 `routes.ts` 文件中，以便在构建环境中也能使用
2. **组件路径**：确保组件使用动态导入 `() => import(...)`
3. **路径规范**：插件会自动处理相对路径，确保生成的路径正确

## 文件结构

```
project/
├── src/
│   └── router/
│       ├── routes.ts          # 路由配置（新增）
│       └── index.ts           # Router 实例
├── plugins/
│   └── generateExposesPlugin.ts  # 自动生成插件
├── scripts/
│   └── test-exposes.ts        # 测试脚本
└── rsbuild.config.ts          # Rsbuild 配置
```
