05/28/2026

Vercel 部署架构规:AI Prompt Web应用

yvonne
05/28/2026 · 2 min read

请做一个vercel 部署的应用架构的规划

1、业务应用:作为AI 生图的Prompt web应用,方便用户快速索引找到自己需要的的提示词
2、代码文件我们计划放在GitHub上
3、无数据库的设计,资源读取,我们采用文件夹的形式,一个文件夹代表一个分类,里面包含json、图片目录

以上,是否有补充的,评估下,然后给出最终执行方案

这是一个非常经典、轻量且高效的 JAMstack(JavaScript, APIs, and Markup) 架构。针对你的业务场景(AI生图提示词索引),“无数据库+纯文件驱动” 的设计非常适合前期的快速交付和零成本维护。Vercel 配合 GitHub 可以天然地将这些静态资源转化为全球加速的 API 或网页。

在给出最终执行方案前,我先为你做个架构评估,并补充几个在实际开发中你一定会遇到的隐性坑点优化建议

一、 架构评估与关键补充

1. 资源读取的性能瓶颈(核心补充)

  • 痛点:如果直接让前端(如 Next.js 客户端)去 GitHub 仓库里一层层读取文件夹和 JSON,会触发 GitHub API 的频率限制(Rate Limit),且速度极慢。
  • 解决方案:在构建时(Build Time)处理。利用 Next.js 的 getStaticProps(Pages 路由)或 GenerateStaticParams(App 路由)。在 Vercel 部署编译的那一刻,用 Node.js 的 fs(文件系统)读取本地文件夹,直接生成静态 HTML 和 JSON 缓存。这样用户访问时就是秒开,且不依赖任何外部请求。

2. 图片资源的托管优化

  • 痛点:GitHub 单个仓库有 1GB–5GB 的推荐上限,且单个文件超过 50MB 无法提交。如果你的 AI 生图提示词包含大量高分辨率效果图,仓库会迅速膨胀,且 Vercel 的图片优化额度(Image Optimization)在免费版是有上限的。
  • 解决方案
    • 前期/轻量:图片直接放 GitHub 对应文件夹,前端利用 Vercel 自带的 next/image 进行 WebP 格式化(注意控制免费额度)。
    • 进阶/多图:如果后续有几千张图,建议将图片放到 CloudinaryVercel Blob / Cloudflare R2 等 Object Storage 中,GitHub 的 JSON 里只存图片的 URL 字符串。这样代码仓库会极其轻量。

3. 全局搜索与索引

  • 痛点:没有数据库,怎么做多维度搜索(按关键词、标签、模型检索)?
  • 解决方案:在构建时,顺便生成一个总的 search-index.json。前端加载页面时异步下载这个几十 KB 的索引文件,利用 FlexSearchFuse.js 在浏览器本地(Local)做纯前端的模糊搜索,体验会极度丝滑。

二、 最终执行方案

基于你的需求与上述优化,推荐采用 Next.js (App Router) + Tailwind CSS + GitHub + Vercel 的全栈静态化方案。

1. 目录结构设计 (Repository Structure)

在 GitHub 仓库中,将数据源与业务代码分离,规范化文件夹命名:Plaintext

my-prompt-app/
├── src/                    # Next.js 业务代码
│   ├── app/                # 页面路由 (首页、分类页、详情页)
│   └── components/         # UI 组件 (卡片、搜索框、复制按钮)
├── public/                 # 静态资源 (Logo 等)
└── data/                   # 💾 你的提示词数据库 (纯文件)
    ├── midjourney/         # 分类文件夹 A
    │   ├── index.json      # 该分类下的提示词列表与元数据
    │   └── images/         # 该分类下的效果图目录
    │       ├── cyberpunk-city.jpg
    │       └── anime-girl.jpg
    └── stable-diffusion/   # 分类文件夹 B
        ├── index.json
        └── images/

📄 data/midjourney/index.json 结构示例:JSON

[
  {
    "id": "mj-001",
    "title": "赛博朋克霓虹街道",
    "prompt": "Cyberpunk city street, neon lights, rainy night, unreal engine 5 render, 8k --ar 16:9",
    "tags": ["Sci-Fi", "City", "Night"],
    "image": "/data/midjourney/images/cyberpunk-city.jpg"
  }
]

2. 技术栈选型 (Tech Stack)

模块选型理由
前端框架Next.js 14+ (App Router)Vercel 的亲儿子,对静态文件读取(SSG)和图片优化支持完美。
样式框架Tailwind CSS现代、极简、高效率,便于快速构建现代社论感(Modern Editorial)或瑞士主义(Swiss Style)的极简网格布局。
本地搜索Fuse.js纯前端轻量级模糊搜索,无需后端支持。
UI 组件库Shadcn UI / Radix UI保持界面的高级感与原子化控制。

3. 核心开发逻辑 (Data Fetching)

利用 Next.js 的文件系统读取能力,在服务端(构建时)把文件夹转化为页面。

路径:src/app/page.tsx(首页:读取所有分类和提示词)TypeScript

import fs from 'fs';
import path from 'path';

// 定义数据结构
interface PromptItem {
  id: string;
  title: string;
  prompt: string;
  image: string;
}

async function getPromptsData() {
  const dataDirectory = path.join(process.cwd(), 'data');
  const folders = fs.readdirSync(dataDirectory);
  
  let allPrompts: PromptItem[] = [];

  folders.forEach((folder) => {
    const jsonPath = path.join(dataDirectory, folder, 'index.json');
    if (fs.existsSync(jsonPath)) {
      const fileContents = fs.readFileSync(jsonPath, 'utf8');
      const jsonData = JSON.parse(fileContents);
      allPrompts = [...allPrompts, ...jsonData];
    }
  });

  return allPrompts;
}

export default async function HomePage() {
  const prompts = await getPromptsData();
  
  return (
    <main className="p-8 max-w-7xl mx-auto">
      <h1 className="text-3xl font-bold mb-8">AI Prompt HUB</h1>
      {/* 提示词网格布局 */}
      <div className="grid grid-cols-1 md:grid-cols-3 gap-6">
        {prompts.map((item) => (
          <div key={item.id} className="border rounded-lg overflow-hidden bg-card">
            <img src={item.image} alt={item.title} className="w-full h-48 object-cover" />
            <div className="p-4">
              <h3 className="font-semibold text-lg">{item.title}</h3>
              <p className="text-sm text-muted-foreground mt-2 line-clamp-2">{item.prompt}</p>
              {/* 一键复制按钮组件 */}
            </div>
          </div>
        ))}
      </div>
    </main>
  );
}

4. 部署与工作流 (Deployment Workflow)

  1. 初始化:在本地初始化 Next.js 项目,按照上述结构放入第一批测试文件夹、JSON 和图片。
  2. 托管:将代码推送到 GitHub 私有或公开仓库。
  3. 部署
    • 登录 Vercel,点击 Import Project,选择该 GitHub 仓库。
    • Framework Preset 选择 Next.js
    • 点击 Deploy
  4. 日常更新工作流(重点)
    • 当你需要上新提示词时,不需要动代码
    • 直接在本地(或通过 GitHub 网页端)在 data/新建一个文件夹,丢入图片,改好 index.json
    • git commit -m "feat: add new cyberpunk prompts"git push
    • Vercel 会自动捕获这次 push,触发自动构建(Webhook),在 1 分钟内将新提示词编译并发布上线。整个过程实现自动化,GitHub 此时既是你的“代码库”,也是你的“CMS(内容管理系统)”。

这个方案完全在 Vercel 的免费额度(Hobby Plan)内即可完美运行,访问速度极快,且具备极强的可扩展性。你觉得这个执行方案是否符合预期?如果有需要调整的细节(例如界面风格偏好或特定功能),我们可以进一步细化。

Leave a Comment

您的邮箱地址不会被公开。 必填项已用 * 标注

WhatsApp Us

Product Inquiry

ID: #

We usually respond within 24 hours.

Message Sent!

Our team will contact you shortly.

TiHUBB WeChat

添加专属架构师微信

我们通常会在 24 小时内回复。

信息已发送!

我们的团队会尽快与您联系。