<!-- Generated by SpecStory -->

# 在这个文件里面完成一个插件，满足 #file:Sidebar.tsx  #file:App.tsx  (2025-07-19 16:41Z)

_**User**_

在这个文件里面完成一个插件，满足 #file:Sidebar.tsx  #file:App.tsx 的需求

---

_**Assistant**_

我来分析一下当前的需求，然后完成 Vite 路由插件的实现。

首先让我查看一下当前文件的内容和相关的项目结构： 现在我需要查看 SSG 插件的实现，以了解路由是如何生成的： 现在我来查看一下项目的内容结构，以便了解需要生成的路由： 基于对代码的分析，我发现 `App.tsx` 和 `Sidebar.tsx` 都在引用一个 `routes` 变量，但这个变量还没有定义。我需要创建一个 Vite 插件，来动态生成路由信息，并且让它在开发和构建过程中都能正常工作。

现在我来实现这个路由插件： 让我修复这些 lint 错误： 
```

```

```

```
现在我需要更新 Vite 配置文件来使用这个新的路由插件： 
```

```

```

```
现在我需要更新 `Sidebar.tsx` 文件，导入路由信息： 
```

```
我需要首先生成路由文件。让我先运行插件来生成路由： 

---

_**User**_

为什么build的时候一直在反复执行这个函数generateStaticPages

---

_**Assistant**_

我来分析一下为什么 `generateStaticPages` 函数在构建时会反复执行。让我查看当前的插件实现： 我发现问题了！在 `generateStaticPages` 函数中，它在内部调用了 `build()` 函数来构建 SSR 版本，而这个 `build()` 调用会再次触发相同的插件，导致无限循环。

让我查看 Vite 配置文件来确认插件配置： 现在我明白问题所在了。当 `generateStaticPages` 函数调用 `build()` 时，它传递了相同的插件配置 `plugins: [...viteConfig.plugins]`，这包括了 SSG 插件本身，导致无限递归。

我需要修复这个问题，避免在内部构建时重复使用 SSG 插件： 
```

```
现在我还需要进一步优化，避免重复构建。让我添加一个标志来检查 SSR 构建是否已经完成： 
```

```
让我实际使用这个标志来避免重复构建： 
```

```
现在让我进一步优化，添加更好的条件检查，避免在开发模式或非主构建过程中执行 SSG： 
```

```
让我再进一步改进，添加更精确的检查机制，避免在 SSR 构建过程中触发 SSG： 
```

```
现在让我再做一个重要的优化，通过环境变量来控制是否执行 SSG，这样可以更好地控制构建过程： 
```

```
现在修改内部的 build 调用，设置环境变量以避免触发 SSG： 
```

```
现在让我再添加一个更直接的解决方案 - 使用一个全局变量来防止递归： 
```

```
现在让我使用这个全局标志： 
```

```
现在在 SSR 构建过程中设置这个标志： 
```

```
现在问题应该解决了。让我总结一下我做的修改来解决 `generateStaticPages` 函数反复执行的问题：

## 问题分析

原始代码中的问题是：
1. `generateStaticPages` 函数在内部调用 `build()` 来构建 SSR 版本
2. 这个 `build()` 调用使用了相同的插件配置 `[...viteConfig.plugins]`，包括了 SSG 插件本身
3. 这导致了无限递归：SSG 插件触发 → 构建 SSR → SSG 插件再次触发 → 无限循环

## 解决方案

我实施了多层防护来解决这个问题：

1. **过滤插件**：在内部 SSR 构建时过滤掉 SSG 插件
2. **全局标志**：使用 `isSSRBuilding` 全局变量防止递归
3. **环境变量**：设置 `VITE_SSR_BUILD` 环境变量作为额外保护
4. **构建条件检查**：只在主构建（非 SSR 构建）时执行 SSG
5. **文件存在检查**：避免重复构建已存在的 SSR 文件
6. **错误处理**：使用 try-finally 确保标志能正确重置

现在构建过程应该是：
1. 主构建开始，SSG 插件启动
2. SSG 检查是否需要构建 SSR 入口文件
3. 如果需要，启动 SSR 构建（使用过滤后的插件，不包含 SSG）
4. SSR 构建完成后，继续生成静态页面
5. 不会再次触发 SSG 插件

这样就避免了无限递归的问题。

---

_**User**_

vite v7.0.5 building for production...
📝 Generated routes file: src/routes.ts
✓ 37 modules transformed.
dist/index.html                   0.41 kB │ gzip:  0.25 kB
dist/routes.json                  1.21 kB │ gzip:  0.49 kB
dist/assets/server-CEVB1K0h.js  179.29 kB │ gzip: 54.55 kB
✓ built in 6.00s
🚀 Generating static pages...
📦 Building SSR entry...
vite v7.0.5 building SSR bundle for production...
📝 Generated routes file: src/routes.ts
📝 Generated routes file: src/routes.ts
✓ 5 modules transformed.
✓ 5 modules transformed. (x2)
✗ Build failed in 67ms
Failed to generate static pages: [[@mdx-js/rollup] Unexpected `FunctionDeclaration` in code: only import/exports are supported
file: /Users/maxtune/workspace/personal/Afilmory/packages/docs/content/en/index.mdx
] {
  ancestors: undefined,
  cause: undefined,
  column: 1,
  fatal: undefined,
  line: 3,
  name: '3:1-275:2',
  place: {
    start: { line: 3, column: 1, offset: 155 },
    end: { line: 275, column: 2, offset: 8724 }
  },
  reason: 'Unexpected `FunctionDeclaration` in code: only import/exports are supported',
  ruleId: 'non-esm',
  source: 'micromark-extension-mdxjs-esm',
  url: 'https://github.com/micromark/micromark-extension-mdxjs-esm#unexpected-type-in-code-only-importexports-are-supported',
  code: 'PLUGIN_ERROR',
  plugin: '@mdx-js/rollup',
  hook: 'transform',
  id: '/Users/maxtune/workspace/personal/Afilmory/packages/docs/content/en/index.mdx',
  watchFiles: [
    '/Users/maxtune/workspace/personal/Afilmory/packages/docs/src/entry-server.tsx',
    '/Users/maxtune/workspace/personal/Afilmory/packages/docs/package.json',
    '/Users/maxtune/workspace/personal/Afilmory/packages/docs/src/App.tsx',
    '/Users/maxtune/workspace/personal/Afilmory/packages/docs/src/routes.ts',
    '/Users/maxtune/workspace/personal/Afilmory/packages/docs/src/layouts/DocsLayout.tsx',
    '/Users/maxtune/workspace/personal/Afilmory/packages/docs/src/components/MDXProvider.tsx',
    '/Users/maxtune/workspace/personal/Afilmory/packages/docs/content/en/index.mdx'
  ]
}
error during build:
[@mdx-js/rollup] Unexpected `FunctionDeclaration` in code: only import/exports are supported
file: /Users/maxtune/workspace/personal/Afilmory/packages/docs/content/en/index.mdx

 ELIFECYCLE  Command failed with exit code 1.

---

_**Assistant**_

看起来 MDX 插件在 SSR 构建过程中遇到了问题。这个错误表明 MDX 文件中有函数声明，但在 ESM 模式下只支持 import/export 语句。

让我先检查一下生成的路由文件，看看是否有问题： 问题在于 MDX 插件在 SSR 构建时无法正确处理 MDX 文件。这可能是因为 MDX 插件配置在 SSR 模式下存在问题。让我检查一下 Vite 配置中的 MDX 配置： 我需要修改 SSG 插件，在 SSR 构建时也要包含 MDX 插件的正确配置。问题是当前的插件过滤逻辑过于简单，没有考虑到 MDX 插件的依赖关系。

让我修改 SSG 插件的插件过滤逻辑： 
```

```


---

