Yasin

Yasin

AgentVerse重写方案

Next.js 重写:重点与难点全面梳理


一、整体架构对照

当前 AgentVerse                      →    Next.js 版本
─────────────────────────────────         ─────────────────────────
Vite + React + React Router              Next.js App Router
Cloudflare Functions (后端)              Next.js API Routes
Cloudflare D1 (数据库)                  Prisma + PostgreSQL (Supabase)
localStorage (数据持久化)               服务端数据库
HashRouter (客户端路由)                 文件系统路由
Extension 动态注册                      静态页面 + 条件渲染
OpenAI SDK (浏览器直调)                 API Route 代理调用
Zustand + RxJS (状态管理)              Zustand (保留) + Server State (React Query)

二、需要重写的模块(按优先级排序)

P0:必须重写(核心骨架)

模块 当前实现 Next.js 实现 工作量
路由系统 HashRouter + Extension 动态注册 + PluginRouter app/ 文件系统路由 2-3 天
后端 API functions/api/auth/*(8 个 Cloudflare Functions) app/api/auth/*(Next.js API Routes) 2 天
数据库 Cloudflare D1 + 原始 SQL Prisma ORM + PostgreSQL 1-2 天
数据持久化 LocalStorageProvider(agents/discussions/messages) 数据库 CRUD API + 前端 React Query 3-4 天
AI 调用 浏览器直调 OpenAI(暴露 API Key) app/api/ai/chat/route.ts 服务端代理 2 天

P1:需要适配(中等改动)

模块 改动点 工作量
认证系统 Session Cookie → NextAuth.js 或保留自实现 1-2 天
Provider 嵌套(main.tsx) 移到 app/layout.tsx 半天
响应式分端 isMobile ? <MobileApp/> : <DesktopApp/> → 保留但用 'use client' 半天
主题系统 ThemeProvider → 保留,标记 'use client' 半天
i18n i18next → 可保留,或换 next-intl 1 天

P2:可平移(少量改动)

模块 说明
UI 组件common/components/ui/ Radix UI + Tailwind,直接复制
Zustand Stores 保留,加 'use client'
Presenter + Manager 层 纯 TS 逻辑,直接复制
MCP 客户端 标记 'use client',不变

三、六大技术难点详解

难点 1:路由架构重设计 ⭐⭐⭐⭐⭐

当前的 Extension 动态路由是这个项目最精巧的设计,也是最难迁移的部分:

当前:Extension.activate() → addRoute('/chat', ChatPage) → 运行时生效
Next.js:app/chat/page.tsx → 编译时确定

建议方案

app/
  layout.tsx              ← 全局 Provider(Theme/Breakpoint/Presenter)
  page.tsx                ← 首页 / 重定向
  (desktop)/              ← Route Group(桌面端布局)
    layout.tsx            ← 桌面端 Layout(ActivityBar + 侧边栏)
    chat/
      [id]/page.tsx       ← 聊天页
    agents/
      page.tsx            ← Agent 列表
      create/page.tsx     ← 创建 Agent
  (mobile)/               ← Route Group(移动端布局)
    layout.tsx
    chat/
      [id]/page.tsx

难点在于:功能开关不能再通过"注释 Extension"实现,需要改成环境变量或 Feature Flag:

// 之前
extensions: [
  desktopChatExtension,
  // desktopFileManagerExtension, ← 注释掉就禁用
];

// 之后
// app/(desktop)/file-manager/page.tsx
if (!featureFlags.fileManager) redirect("/chat");

难点 2:数据层从客户端迁移到服务端 ⭐⭐⭐⭐

当前所有业务数据在 localStorage,迁移到服务端涉及整条数据流改造

当前:
  Component → useMessages() → Manager → Repository → LocalStorageProvider
                                                     localStorage

改造后:
  Server Component 直接获取数据(无需 Hook)
  Client Component → React Query → fetch('/api/messages') → API Route → Prisma → DB

关键决策:哪些页面用 Server Component,哪些用 Client Component?

页面 推荐渲染方式 原因
Agent 列表 Server Component 数据简单,无交互状态
聊天页面 Client Component 大量实时交互、流式消息、WebSocket
首页/引导页 Server Component 静态内容为主
设置页 Client Component 表单交互

难在聊天页:消息流式推送 + 实时交互 + 多 Agent 对话编排,这些必须在客户端,无法利用 Server Component 优势。


难点 3:AI 流式调用链路重构 ⭐⭐⭐⭐

当前是浏览器直接调 OpenAI API(API Key 在前端,不安全):

浏览器 → OpenAI API(流式 SSE)→ StreamDeltaNormalizer → UI 渲染

Next.js 中应该通过 API Route 代理:

浏览器 → /api/ai/chat(Next.js API Route)→ OpenAI API
                ↓ 流式转发 SSE
         浏览器接收 → UI 渲染

难在流式转发

// app/api/ai/chat/route.ts
export async function POST(req: Request) {
  const { messages, model } = await req.json();

  const stream = await openai.chat.completions.create({
    model,
    messages,
    stream: true,
  });

  // 需要把 OpenAI 的流式响应转发给浏览器
  return new Response(stream.toReadableStream(), {
    headers: { "Content-Type": "text/event-stream" },
  });
}

同时项目里的 StreamDeltaNormalizer(处理 full/delta 两种模式)和 ToolCallCollector(合并工具调用增量)需要决定放在服务端还是客户端


难点 4:Presenter/Manager 架构与 Server Component 的融合 ⭐⭐⭐

当前 Presenter 是客户端单例,在 Next.js 中:

Server Component:不能用 Presenter(Presenter 依赖浏览器 API)
Client Component:可以继续用 Presenter

建议分两层

Server Component 层:
  直接用 Prisma 查数据库 → 传 props 给 Client Component

Client Component 层:
  保留 Presenter/Manager 用于实时交互状态
  (聊天消息流、ActivityBar 展开/收起等)

难点 5:认证系统迁移 ⭐⭐⭐

当前自实现了完整的认证流程(注册/登录/密码重置/邮箱验证/Session Cookie)。

两种选择

方案 说明 推荐度
NextAuth.js (Auth.js) 成熟方案,支持多种登录方式,自动管理 Session ⭐⭐⭐⭐⭐
自实现迁移 把 Functions 里的逻辑搬到 API Routes ⭐⭐⭐

推荐 NextAuth.js,可以少写很多代码,而且自带 Credentials Provider(邮箱密码登录)。


难点 6:MCP + service-bus-portal 跨上下文通信 ⭐⭐

这部分完全是浏览器端逻辑(iframe/Worker/PostMessage),在 Next.js 中:

全部标记 'use client'
把 public/iframe-portal.html 和 worker-portal.js 放到 public/ 目录
其他不变

改动量小,但要注意 Next.js 的 SSR 预渲染阶段不能访问 window/Worker,需要用 dynamic importuseEffect 延迟加载。


四、推荐的重写路线图

第 1 周:基础骨架
  ├── 创建 Next.js 项目 + Tailwind + Radix UI
  ├── 搭建 app/ 文件路由结构
  ├── 迁移 UI 组件(components/ui/ 直接复制)
  └── 配置 Prisma + Supabase 数据库

第 2 周:认证 + 数据层
  ├── NextAuth.js 实现登录/注册
  ├── 设计数据库 Schema(users/agents/discussions/messages)
  ├── 实现 CRUD API Routes
  └── 前端用 React Query 接入

第 3 周:核心功能
  ├── 聊天页面(Client Component)
  ├── AI 流式调用(API Route 代理 + SSE 转发)
  ├── 多 Agent 对话编排逻辑
  └── Agent 管理页面

第 4 周:完善 + 特色功能
  ├── MCP 工具集成('use client')
  ├── 响应式适配(桌面/移动端)
  ├── 主题系统 + i18n
  └── 部署到 Vercel

五、学习收获最大化的建议

顺序 学到什么
搭骨架阶段 App Router、文件路由、layout 嵌套、Server vs Client Component
数据层阶段 Prisma ORM、API Routes、React Query、数据库设计
聊天功能阶段 流式 SSE、AI SDK、实时交互、状态管理
完善阶段 中间件、认证、部署、性能优化

这个项目用 Next.js 重写的过程,本身就是一个完整的全栈 + AI 应用开发教程。重点享受过程,不必追求和原项目 100% 功能对齐。