Vercel 部署架构规:AI Prompt Web应用
请做一个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 格式化(注意控制免费额度)。 - 进阶/多图:如果后续有几千张图,建议将图片放到 Cloudinary 或 Vercel Blob / Cloudflare R2 等 Object Storage 中,GitHub 的 JSON 里只存图片的 URL 字符串。这样代码仓库会极其轻量。
- 前期/轻量:图片直接放 GitHub 对应文件夹,前端利用 Vercel 自带的
3. 全局搜索与索引
- 痛点:没有数据库,怎么做多维度搜索(按关键词、标签、模型检索)?
- 解决方案:在构建时,顺便生成一个总的
search-index.json。前端加载页面时异步下载这个几十 KB 的索引文件,利用 FlexSearch 或 Fuse.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)
- 初始化:在本地初始化 Next.js 项目,按照上述结构放入第一批测试文件夹、JSON 和图片。
- 托管:将代码推送到 GitHub 私有或公开仓库。
- 部署:
- 登录 Vercel,点击 Import Project,选择该 GitHub 仓库。
- Framework Preset 选择 Next.js。
- 点击 Deploy。
- 日常更新工作流(重点):
- 当你需要上新提示词时,不需要动代码。
- 直接在本地(或通过 GitHub 网页端)在
data/下新建一个文件夹,丢入图片,改好index.json。 git commit -m "feat: add new cyberpunk prompts"并git push。- Vercel 会自动捕获这次 push,触发自动构建(Webhook),在 1 分钟内将新提示词编译并发布上线。整个过程实现自动化,GitHub 此时既是你的“代码库”,也是你的“CMS(内容管理系统)”。
这个方案完全在 Vercel 的免费额度(Hobby Plan)内即可完美运行,访问速度极快,且具备极强的可扩展性。你觉得这个执行方案是否符合预期?如果有需要调整的细节(例如界面风格偏好或特定功能),我们可以进一步细化。