Files
XCDesktop/docs/vercel/VERCEL_GUIDE.md

2115 lines
40 KiB
Markdown
Raw Normal View History

# Vercel 完整指南
> 本文档基于 Vercel 官方文档整理,涵盖 Vercel 平台的所有核心功能和使用方法。
---
## 目录
1. [平台概述](#一平台概述)
2. [快速入门](#二快速入门)
3. [模板市场](#三模板市场)
4. [项目与部署](#四项目与部署)
5. [Git 集成](#五git-集成)
6. [Vercel Functions](#六vercel-functions)
7. [路由中间件](#七路由中间件)
8. [环境变量](#八环境变量)
9. [域名管理](#九域名管理)
10. [存储服务](#十存储服务)
11. [AI SDK](#十一ai-sdk)
12. [分析与监控](#十二分析与监控)
13. [安全功能](#十三安全功能)
14. [图片优化](#十四图片优化)
15. [定时任务](#十五定时任务)
16. [CLI 命令行工具](#十六cli-命令行工具)
17. [REST API](#十七rest-api)
18. [框架支持](#十八框架支持)
19. [部署保护](#十九部署保护)
20. [计费与限制](#二十计费与限制)
21. [最佳实践](#二十一最佳实践)
---
## 一、平台概述
### 什么是 Vercel
Vercel 是 AI 云平台,为开发者提供构建、部署和扩展 AI 驱动应用的统一平台。支持部署 Web 应用、代理工作负载以及介于两者之间的所有内容。
### 核心特性
- **零配置部署**:支持主流框架的零配置部署
- **全球 CDN**:内容分发至全球数据中心
- **自动 HTTPS**:免费 SSL 证书
- **预览环境**:每次 Git 推送自动生成预览 URL
- **Serverless Functions**:无需管理服务器的后端函数
- **边缘网络**:全球低延迟执行
### 订阅计划
| 计划 | 适用场景 | 价格 |
|------|----------|------|
| **Hobby** | 个人项目、学习 | 免费 |
| **Pro** | 专业开发者、团队 | $20/用户/月 |
| **Enterprise** | 大型企业 | 定制 |
---
## 二、快速入门
### 创建账户
1. 访问 [vercel.com/signup](https://vercel.com/signup)
2. 选择 Git 提供商登录或使用邮箱
3. 完成邮箱和手机验证
### 安装 CLI
```bash
# npm
npm i -g vercel
# pnpm
pnpm i -g vercel
# yarn
yarn global add vercel
# bun
bun i -g vercel
```
### 首次部署
```bash
# 进入项目目录
cd your-project
# 部署到生产环境
vercel --prod
```
### 部署流程
```
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 本地开发 │ ──▶ │ Git 推送 │ ──▶ │ 自动构建 │
└─────────────┘ └─────────────┘ └─────────────┘
┌─────────────┐ ┌─────────────┐
│ 生成 URL │ ◀── │ 部署成功 │
└─────────────┘ └─────────────┘
```
---
## 三、模板市场
### 概述
Vercel Templates 是官方提供的模板市场,包含大量预构建的项目模板,帮助开发者快速启动项目开发。所有模板都是**免费**使用的。
**访问地址**[vercel.com/templates](https://vercel.com/templates)
### 模板分类
#### 按用途分类
| 类别 | 说明 | 适用场景 |
|------|------|----------|
| **AI** | AI 应用模板 | 聊天机器人、AI Agent、语音接口 |
| **Starter** | 入门模板 | 快速启动新项目 |
| **E-commerce** | 电商模板 | 在线商店、商品展示 |
| **SaaS** | SaaS 应用模板 | 多租户平台、企业应用 |
| **Blog** | 博客模板 | 个人博客、技术文章 |
| **Portfolio** | 作品集模板 | 个人简历、作品展示 |
| **Documentation** | 文档模板 | 技术文档、API 文档 |
| **Backend** | 后端模板 | API 服务、微服务 |
| **CMS** | 内容管理模板 | 内容网站、新闻站点 |
| **Marketing Sites** | 营销网站模板 | 产品官网、落地页 |
| **Authentication** | 认证模板 | 登录系统、用户管理 |
| **Admin Dashboard** | 管理后台模板 | 数据管理、控制面板 |
| **Web3** | 区块链模板 | DApp、NFT 市场 |
| **Monorepos** | 单体仓库模板 | 多包项目管理 |
#### 按技术栈分类
| 类别 | 说明 |
|------|------|
| **Framework** | Next.js、Nuxt、SvelteKit、Astro、Remix 等 |
| **CSS** | Tailwind CSS、CSS Modules、Styled Components 等 |
| **Database** | PostgreSQL、MongoDB、Redis、PlanetScale 等 |
| **CMS** | Contentful、Sanity、Prismic、Strapi 等 |
| **Authentication** | NextAuth.js、Auth0、Clerk、Supabase Auth 等 |
### 热门模板详解
#### 1. Next.js Boilerplate
最基础的 Next.js 起手架模板。
```
技术栈:
- Next.js 14+ (App Router)
- TypeScript
- ESLint + Prettier
- Tailwind CSS
适用场景:
- 快速启动新项目
- 学习 Next.js
- 自定义项目基础
```
**使用方式**
```bash
# CLI 方式
vercel init nextjs-boilerplate
# 或访问 Dashboard
# vercel.com/templates/next.js/nextjs-boilerplate
```
#### 2. AI Chatbot
Vercel 官方出品的完整 AI 聊天机器人模板。
```
技术栈:
- Next.js App Router
- Vercel AI SDK
- OpenAI / Anthropic / 其他 LLM
- Tailwind CSS
- Supabase可选用于数据持久化
功能特性:
- 流式响应
- 多模型支持
- 聊天历史
- 代码高亮
- Markdown 渲染
```
**使用方式**
```bash
vercel init ai-chatbot
```
**配置环境变量**
```bash
# OpenAI
OPENAI_API_KEY=sk-xxx
# 或 Anthropic
ANTHROPIC_API_KEY=sk-xxx
```
#### 3. Next.js Commerce
高性能电商网站模板,支持多种电商平台集成。
```
技术栈:
- Next.js 14
- Shopify Storefront API
- Tailwind CSS
- Framer Motion
功能特性:
- 商品列表与详情
- 购物车
- 结账流程
- 商品搜索
- 响应式设计
- SEO 优化
```
**支持的电商平台**
- Shopify
- BigCommerce
- Saleor
- Swell
- Vendure
**使用方式**
```bash
vercel init nextjs-commerce
```
**配置 Shopify**
```bash
SHOPIFY_STORE_DOMAIN=your-store.myshopify.com
SHOPIFY_STOREFRONT_ACCESS_TOKEN=xxx
```
#### 4. Platforms Starter Kit
多租户 SaaS 平台模板,用于构建类似 Vercel 的平台。
```
技术栈:
- Next.js App Router
- Redis (Upstash)
- Tailwind CSS
- Prisma
功能特性:
- 多租户架构
- 自定义域名
- 子域名路由
- 用户认证
- 计费集成
- Dashboard 管理
```
**使用场景**
- 博客平台(类似 Medium
- 电商托管平台
- CMS 托管服务
- 任何需要多租户的 SaaS
**使用方式**
```bash
vercel init platforms-starter-kit
```
#### 5. Nextra: Docs Starter Kit
Markdown 驱动的文档站点模板。
```
技术栈:
- Next.js
- Nextra
- MDX
- Tailwind CSS
功能特性:
- Markdown/MDX 支持
- 自动侧边栏
- 全文搜索
- 深色模式
- 代码高亮
- 版本管理
```
**使用场景**
- 技术文档
- API 文档
- 知识库
- 教程网站
**使用方式**
```bash
vercel init documentation-starter-kit
```
#### 6. Blog Starter Kit
静态博客模板,支持 Markdown 写作。
```
技术栈:
- Next.js
- TypeScript
- Tailwind CSS
- Markdown
功能特性:
- Markdown 写作
- 标签分类
- RSS 订阅
- SEO 优化
- 深色模式
```
**使用方式**
```bash
vercel init blog-starter-kit
```
#### 7. Next.js Enterprise Boilerplate
企业级 Next.js 模板,包含完整的工程化配置。
```
技术栈:
- Next.js
- TypeScript
- Tailwind CSS
- Radix UI
- ESLint + Prettier
- Jest + Playwright
- Storybook
- GitHub Actions
功能特性:
- 企业级代码规范
- 完整的测试配置
- CI/CD 流程
- 组件文档
- 性能监控
```
**适用场景**
- 企业项目
- 大型团队协作
- 需要完整工程化的项目
#### 8. Portfolio Starter Kit
个人作品集模板。
```
技术栈:
- Next.js
- TypeScript
- Tailwind CSS
- MDX
功能特性:
- Markdown 管理内容
- 响应式设计
- 深色模式
- SEO 优化
- 项目展示
```
#### 9. Express on Bun / Hono on Bun
后端服务模板,使用 Bun 运行时。
```
Express on Bun:
- Express.js
- Bun 运行时
- TypeScript
Hono on Bun:
- Hono 框架
- Bun 运行时
- TypeScript
- Edge-ready
```
**使用方式**
```bash
vercel init express-on-bun
vercel init hono-on-bun
```
#### 10. Nuxt AI Chatbot
Nuxt.js 版本的 AI 聊天机器人。
```
技术栈:
- Nuxt 3
- Vercel AI SDK
- Nuxt MDC
- Tailwind CSS
```
### 使用模板的方式
#### 方式一:通过 Dashboard推荐
```
1. 访问 vercel.com/templates
2. 浏览或搜索模板
3. 点击模板查看详情
4. 点击 "Deploy" 按钮
5. 系统自动 Fork 到你的 GitHub
6. 自动部署到 Vercel
```
#### 方式二:通过 CLI
```bash
# 列出可用模板
vercel init
# 初始化特定模板
vercel init nextjs-boilerplate
vercel init ai-chatbot
vercel init nextjs-commerce
# 查看模板帮助
vercel init --help
```
#### 方式三:克隆 GitHub 仓库
```bash
# 直接克隆模板仓库
git clone https://github.com/vercel/next.js/tree/canary/packages/create-next-app
# 或从模板创建新仓库
# GitHub → Use this template → Create a new repository
```
### 模板筛选
在模板市场可以使用多种条件筛选:
```
按用途筛选:
- AI
- Starter
- Ecommerce
- SaaS
- Blog
- Portfolio
- CMS
- Backend
- ...
按框架筛选:
- Next.js
- Nuxt
- SvelteKit
- Astro
- Remix
- Vue
- React
- ...
按数据库筛选:
- PostgreSQL
- MongoDB
- MySQL
- Redis
- PlanetScale
- Supabase
- Neon
- ...
按 CMS 筛选:
- Contentful
- Sanity
- Prismic
- Strapi
- WordPress
- ...
```
### 创建自定义模板
你可以将自己的项目变成模板供他人使用:
1. **创建示例仓库**
```bash
# 项目结构清晰
# 包含 README.md
# 配置好所有必要文件
```
2. **添加模板元数据**
```json
// vercel.json
{
"name": "My Template",
"description": "A custom template",
"public": true
}
```
3. **提交到 Vercel 模板库**
- 发送 PR 到 [vercel/templates](https://github.com/vercel/templates)
- 或在 Vercel Dashboard 标记项目为模板
### 模板最佳实践
#### 选择模板时的考虑
```
1. 技术栈匹配
- 团队熟悉的框架
- 项目需求的技术支持
2. 功能完整性
- 是否包含所需功能
- 是否需要大量修改
3. 维护状态
- 最近更新时间
- 社区活跃度
- Issue 处理情况
4. 文档质量
- README 是否清晰
- 配置说明是否完整
```
#### 使用模板后的步骤
```
1. 阅读模板文档
- README.md
- 配置要求
- 环境变量
2. 安装依赖
npm install
# 或
pnpm install
3. 配置环境变量
cp .env.example .env.local
# 编辑 .env.local 填入实际值
4. 本地开发
npm run dev
5. 自定义修改
- 修改品牌信息
- 调整样式
- 添加功能
6. 部署上线
git push
# 或
vercel --prod
```
### 官方模板仓库
Vercel 官方维护的模板仓库:
| 仓库 | 说明 |
|------|------|
| [vercel/next.js](https://github.com/vercel/next.js) | Next.js 官方示例 |
| [vercel/templates](https://github.com/vercel/templates) | Vercel 模板集合 |
| [vercel/examples](https://github.com/vercel/examples) | 示例项目集合 |
### 模板 vs 从零开始
| 对比项 | 使用模板 | 从零开始 |
|--------|----------|----------|
| 启动速度 | ⚡ 分钟级 | 🐢 小时级 |
| 最佳实践 | ✅ 已内置 | ❌ 需自行配置 |
| 学习成本 | 低 | 高 |
| 自由度 | 中等 | 完全自由 |
| 代码质量 | 取决于模板 | 取决于自己 |
**建议**
- 快速原型 / 学习 / 中小型项目 → 使用模板
- 特殊需求 / 大型定制项目 → 从零开始
---
## 四、项目与部署
### 项目概念
项目是部署到 Vercel 的应用程序,来自单个 Git 仓库。每个项目可以有多个部署:
- 一个生产部署
- 多个预生产部署
### 创建项目
1. **通过 Dashboard**:点击 "New Project" 按钮
2. **通过 CLI**`vercel project add`
3. **通过 API**POST 请求到 `/v9/projects`
### 部署方法
#### 1. Git 部署(推荐)
```bash
# 连接 Git 仓库后,每次推送自动部署
git push origin main
```
#### 2. CLI 部署
```bash
# 预览部署
vercel
# 生产部署
vercel --prod
```
#### 3. Deploy Hooks
用于触发部署的唯一 URL
```bash
# 创建 Deploy Hook 后
curl -X POST https://api.vercel.com/v1/integrations/deploy/xxx
```
#### 4. REST API 部署
```typescript
const response = await fetch('https://api.vercel.com/v13/deployments', {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
name: 'my-project',
files: [...],
projectSettings: {...}
})
});
```
### 部署环境
| 环境 | 说明 | URL 格式 |
|------|------|----------|
| **Local** | 本地开发 | `localhost:3000` |
| **Preview** | 预览环境 | `project-branch-hash.vercel.app` |
| **Production** | 生产环境 | `your-domain.com` |
### 管理部署
```bash
# 查看部署列表
vercel list
# 查看部署详情
vercel inspect [deployment-url]
# 重新部署
vercel redeploy [deployment-id]
# 回滚生产部署
vercel rollback [deployment-id]
# 删除部署
vercel remove [deployment-url]
```
---
## 五、Git 集成
### 支持的 Git 提供商
- GitHub免费/团队/企业云)
- GitLab免费/Premium/Ultimate/企业)
- Bitbucket免费/标准/高级)
- Azure DevOps Pipelines
### 连接 Git 仓库
1. 在 Dashboard 点击 "New Project"
2. 选择 Git 仓库
3. 配置项目设置
4. 点击 "Deploy"
### 生产分支
默认规则(优先级从高到低):
1. `main` 分支
2. `master` 分支
3. Git 仓库的默认分支
**自定义生产分支**
1. 进入项目 Settings → Environments
2. 选择 Production 环境
3. 修改 Branch Tracking
### 预览分支
所有非生产分支自动创建预览部署:
```
main (生产) → https://your-domain.com
feature/a (预览) → https://project-feature-a-hash.vercel.app
develop (预览) → https://project-develop-hash.vercel.app
```
### 私有仓库部署
**Pro 团队**
- 提交作者必须是团队成员
- 非成员提交需要申请加入
**Hobby 团队**
- 无法从组织私有仓库部署
- 需要升级到 Pro 或公开仓库
---
## 六、Vercel Functions
### 概述
Vercel Functions 允许运行服务器端代码,无需管理服务器。自动扩展、处理 API 和数据库连接。
### 创建函数
#### 标准方式(推荐)
```typescript
// api/hello.ts
export default {
fetch(request: Request) {
return new Response('Hello from Vercel!');
},
};
```
#### HTTP 方法
```typescript
// api/user.ts
export function GET(request: Request) {
return new Response(JSON.stringify({ name: 'User' }), {
headers: { 'Content-Type': 'application/json' }
});
}
export function POST(request: Request) {
return new Response('Created', { status: 201 });
}
```
#### Next.js App Router
```typescript
// app/api/hello/route.ts
export function GET(request: Request) {
return new Response('Hello from Vercel!');
}
```
### 函数配置
```typescript
// api/configured.ts
export const config = {
runtime: 'nodejs', // 'nodejs' | 'edge' | 'python' | 'go' | 'ruby'
regions: ['iad1', 'sfo1'], // 部署区域
maxDuration: 60, // 最大执行时间(秒)
memory: 1024, // 内存MB
};
export default function handler(request: Request) {
return new Response('Configured function');
}
```
### 运行时支持
| 运行时 | 说明 |
|--------|------|
| **Node.js** | 默认运行时,完整 Node.js API |
| **Edge** | 全球边缘执行,低延迟 |
| **Python** | 支持 Python 函数 |
| **Go** | 支持 Go 函数 |
| **Ruby** | 支持 Ruby 函数 |
| **Bun** | Bun 运行时 |
### 流式响应
```typescript
// api/stream.ts
import { streamText } from 'ai';
export default async function handler(request: Request) {
const result = await streamText({
model: 'openai/gpt-4',
prompt: 'Hello',
});
return result.toDataStreamResponse();
}
```
### 函数限制
| 限制 | Hobby | Pro | Enterprise |
|------|-------|-----|------------|
| 最大执行时间 | 10秒 | 60秒 | 900秒 |
| 内存 | 1024 MB | 3008 MB | 自定义 |
| 包大小 | 50 MB | 50 MB | 自定义 |
### 定价
基于以下因素计费:
- **Active CPU**CPU 使用时间
- **Provisioned Memory**:内存分配
- **Invocations**:调用次数
---
## 七、路由中间件
### 概述
路由中间件在请求被处理之前执行代码,用于:
- 重定向
- 重写 URL
- 添加头部
- 认证检查
- A/B 测试
### 创建中间件
```typescript
// middleware.ts
export default function middleware(request: Request) {
const url = new URL(request.url);
// 重定向旧路径
if (url.pathname === '/old-page') {
return new Response(null, {
status: 302,
headers: { Location: '/new-page' },
});
}
// 添加自定义头部
const response = new Response('Hello');
response.headers.set('X-Custom-Header', 'value');
return response;
}
```
### 配置匹配路径
```typescript
// middleware.ts
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';
export function middleware(request: NextRequest) {
return NextResponse.next();
}
// 配置匹配规则
export const config = {
matcher: [
'/api/:path*', // 匹配 /api/* 路径
'/admin/:path*', // 匹配 /admin/* 路径
],
runtime: 'edge', // 或 'nodejs'
};
```
### 使用 Edge Config
```typescript
// middleware.ts
import { get } from '@vercel/edge-config';
export default async function middleware(request: Request) {
// 从 Edge Config 读取功能开关
const featureEnabled = await get('feature-flag');
if (featureEnabled) {
return new Response('Feature enabled');
}
return new Response('Feature disabled');
}
```
### 请求限制
| 限制 | 值 |
|------|-----|
| 最大 URL 长度 | 14 KB |
| 最大请求体长度 | 4 MB |
| 最大请求头数量 | 64 |
| 最大请求头长度 | 16 KB |
---
## 八、环境变量
### 创建环境变量
**通过 Dashboard**
1. 进入项目 Settings → Environment Variables
2. 添加键值对
3. 选择适用的环境
**通过 CLI**
```bash
# 添加环境变量
vercel env add DATABASE_URL
# 拉取环境变量到本地
vercel env pull .env.local
# 列出所有环境变量
vercel env ls
# 删除环境变量
vercel env rm DATABASE_URL production
```
### 环境类型
| 环境 | 说明 |
|------|------|
| **Production** | 生产部署时使用 |
| **Preview** | 预览部署时使用 |
| **Development** | 本地开发时使用(`vercel dev` |
### 代码中使用
```typescript
// 服务端
const dbUrl = process.env.DATABASE_URL;
// 客户端(需要 NEXT_PUBLIC_ 前缀)
const apiKey = process.env.NEXT_PUBLIC_API_KEY;
```
### 预览分支特定变量
可以为特定分支设置不同的变量值:
```bash
# 为 feature 分支设置特定变量
vercel env add API_URL preview --branch feature
```
### 系统环境变量
Vercel 自动注入以下变量:
```bash
VERCEL=1
VERCEL_ENV=production|preview|development
VERCEL_URL=project-hash.vercel.app
VERCEL_REGION=iad1
VERCEL_GIT_PROVIDER=github
VERCEL_GIT_REPO_SLUG=my-repo
VERCEL_GIT_COMMIT_SHA=abc123
VERCEL_GIT_COMMIT_MESSAGE="Initial commit"
```
### 限制
- 每个环境最多 **1000** 个变量
- 总大小限制 **64 KB**
- Edge Function 单个变量限制 **5 KB**
---
## 九、域名管理
### 添加域名
**通过 Dashboard**
1. 进入项目 Settings → Domains
2. 输入域名
3. 选择验证方式
**通过 CLI**
```bash
# 添加域名
vercel domains add example.com
# 验证域名
vercel domains inspect example.com
```
### DNS 配置
#### A 记录
```
类型: A
名称: @
值: 76.76.21.21
```
#### CNAME 记录
```
类型: CNAME
名称: www
值: cname.vercel-dns.com
```
### 域名类型
| 类型 | 说明 | 示例 |
|------|------|------|
| **根域名** | 主域名 | `example.com` |
| **子域名** | 域名的子集 | `blog.example.com` |
| **通配符** | 匹配所有子域名 | `*.example.com` |
### 分配域名到分支
```bash
# 将域名分配给特定分支
# staging.example.com → staging 分支
```
1. 进入 Domains 设置
2. 添加域名
3. 选择 Git Branch
### SSL 证书
Vercel 自动为所有域名生成 SSL 证书:
- 自动续期
- 免费
- 支持 Let's Encrypt
```bash
# 查看证书
vercel certs ls
# 手动颁发证书
vercel certs issue example.com
```
---
## 十、存储服务
### 存储产品概览
| 产品 | 用途 | 读取速度 | 写入速度 |
|------|------|----------|----------|
| **Vercel Blob** | 大文件存储 | 快 | 毫秒级 |
| **Edge Config** | 全局配置 | 超快(<1ms | 秒级 |
| **Marketplace** | 数据库Postgres/Redis/Mongo | 取决于提供商 | 取决于提供商 |
### Vercel Blob
用于存储图片、视频等大文件。
```typescript
import { put } from '@vercel/blob';
// 上传文件
const blob = await put('profile.jpg', file, {
access: 'public',
});
console.log(blob.url); // https://xxx.public.blob.vercel-storage.com/profile.jpg
```
```typescript
import { list, del } from '@vercel/blob';
// 列出文件
const { blobs } = await list();
// 删除文件
await del(blob.url);
```
### Edge Config
用于存储频繁读取、很少更改的数据。
```typescript
import { get } from '@vercel/edge-config';
// 读取值
const featureFlag = await get('new-feature');
// 读取多个值
const values = await get(['feature-a', 'feature-b']);
```
**使用场景**
- 功能开关
- A/B 测试配置
- 关键重定向
- IP 黑名单
### Marketplace 数据库
通过 Vercel Marketplace 直接配置数据库:
| 类型 | 提供商 |
|------|--------|
| **PostgreSQL** | Neon, Supabase, PlanetScale |
| **Redis/KV** | Upstash, Redis |
| **NoSQL** | MongoDB, DynamoDB |
| **Vector** | Pinecone, Weaviate |
---
## 十一、AI SDK
### 概述
Vercel AI SDK 是构建 AI 应用的 TypeScript 工具包,支持:
- React / Next.js
- Vue / Nuxt
- Svelte / SvelteKit
- Node.js
### 安装
```bash
# 安装 AI SDK
npm install ai
# 安装模型提供商
npm install @ai-sdk/openai
# 或
npm install @ai-sdk/anthropic
```
### 文本生成
```typescript
import { generateText } from 'ai';
import { openai } from '@ai-sdk/openai';
const { text } = await generateText({
model: openai('gpt-4'),
prompt: '解释量子纠缠的概念。',
});
console.log(text);
```
### 流式文本生成
```typescript
import { streamText } from 'ai';
import { openai } from '@ai-sdk/openai';
const result = await streamText({
model: openai('gpt-4'),
prompt: '写一首关于春天的诗。',
});
// 流式输出
for await (const textPart of result.textStream) {
process.stdout.write(textPart);
}
```
### 结构化输出
```typescript
import { generateObject } from 'ai';
import { openai } from '@ai-sdk/openai';
import { z } from 'zod';
const { object } = await generateObject({
model: openai('gpt-4'),
schema: z.object({
name: z.string(),
ingredients: z.array(z.string()),
steps: z.array(z.string()),
}),
prompt: '生成一个意大利面食谱。',
});
```
### 工具调用
```typescript
import { generateText, tool } from 'ai';
import { openai } from '@ai-sdk/openai';
import { z } from 'zod';
const { text } = await generateText({
model: openai('gpt-4'),
prompt: '旧金山今天的天气如何?',
tools: {
getWeather: tool({
description: '获取指定位置的天气',
parameters: z.object({
location: z.string().describe('位置'),
}),
execute: async ({ location }) => ({
location,
temperature: 22,
condition: '晴天',
}),
}),
},
});
```
### 聊天界面React
```tsx
'use client';
import { useChat } from 'ai/react';
export default function Chat() {
const { messages, input, handleInputChange, handleSubmit } = useChat();
return (
<div>
{messages.map(m => (
<div key={m.id}>
{m.role}: {m.content}
</div>
))}
<form onSubmit={handleSubmit}>
<input value={input} onChange={handleInputChange} />
</form>
</div>
);
}
```
---
## 十二、分析与监控
### Web Analytics
**功能**
- 访客统计
- 页面浏览量
- 跳出率
- 流量来源
- 用户地理分布
**启用方式**
```typescript
// app/layout.tsx
import { Analytics } from '@vercel/analytics/react';
export default function RootLayout({ children }) {
return (
<html>
<body>
{children}
<Analytics />
</body>
</html>
);
```
**隐私特性**
- 不使用 Cookie
- 匿名化数据
- 不跟踪跨站用户
### Speed Insights
监控 Core Web Vitals 性能指标。
```typescript
// app/layout.tsx
import { SpeedInsights } from '@vercel/speed-insights/next';
export default function RootLayout({ children }) {
return (
<html>
<body>
{children}
<SpeedInsights />
</body>
</html>
);
}
```
### Observability
**可观测性仪表板**提供:
- Vercel Functions 性能
- 外部 API 调用
- Edge Requests
- 中间件执行
- ISR 缓存状态
**查看方式**
1. 进入项目 Dashboard
2. 点击 Observability 标签
### 日志
**构建日志**:永久保存
**运行时日志**
| 计划 | 保留时间 |
|------|----------|
| Hobby | 1 小时 |
| Pro | 1 天 |
| Enterprise | 3 天 |
```bash
# 查看日志
vercel logs [deployment-url]
# 实时日志
vercel logs [deployment-url] --follow
```
---
## 十三、安全功能
### 安全层
```
┌─────────────────────────────────────────┐
│ 用户请求 │
└─────────────────────────────────────────┘
┌─────────────────────────────────────────┐
│ DDoS 防护(自动) │
└─────────────────────────────────────────┘
┌─────────────────────────────────────────┐
│ WAF可配置
└─────────────────────────────────────────┘
┌─────────────────────────────────────────┐
│ Bot 管理 │
└─────────────────────────────────────────┘
┌─────────────────────────────────────────┐
│ 部署保护 │
└─────────────────────────────────────────┘
┌─────────────────────────────────────────┐
│ 应用 │
└─────────────────────────────────────────┘
```
### DDoS 防护
- 自动启用
- 全平台防护
- 无需配置
### Web Application Firewall (WAF)
**功能**
- 自定义规则
- 托管规则集
- 速率限制
- AI Bot 过滤
**配置规则**
```json
// vercel.json
{
"firewall": {
"rules": [
{
"path": "/api/*",
"rateLimit": {
"requests": 100,
"window": "1m"
}
}
]
}
}
```
### Bot 管理
- 自动识别恶意 Bot
- 可配置 Bot 白名单/黑名单
- AI Bot 过滤规则
### 加密
- 所有部署自动 HTTPS
- 自动 SSL 证书
- 端到端加密
---
## 十四、图片优化
### 概述
Vercel 自动优化图片:
- 自动格式转换WebP、AVIF
- 响应式尺寸
- 智能压缩
- CDN 缓存
### 使用方式
#### Next.js
```tsx
import Image from 'next/image';
// 本地图片
import hero from './hero.png';
export default function Page() {
return (
<Image
src={hero}
alt="Hero"
width={1200}
height={600}
/>
);
}
```
```tsx
// 远程图片
export default function Page() {
return (
<Image
src="https://example.com/image.jpg"
alt="Remote"
width={800}
height={400}
/>
);
}
```
### 配置远程图片
```typescript
// next.config.ts
import type { NextConfig } from 'next';
const nextConfig: NextConfig = {
images: {
remotePatterns: [
{
protocol: 'https',
hostname: 'example.com',
pathname: '/images/**',
},
],
},
};
export default nextConfig;
```
### 图片 URL 格式
```
/_next/image?url=/image.jpg&w=3840&q=75
参数:
- url: 图片地址
- w: 宽度(像素)
- q: 质量1-100
```
### 缓存行为
| 状态 | 说明 |
|------|------|
| HIT | 从缓存返回 |
| MISS | 转换后缓存再返回 |
| STALE | 返回缓存同时后台更新 |
### 最佳实践
- 使用响应式尺寸
- 配置正确的 remotePatterns
- 对于小图标(<10KB使用 `unoptimized`
- SVG 和 GIF 不需要优化
---
## 十五、定时任务
### 概述
Cron Jobs 用于定时执行任务,如:
- 数据备份
- 发送通知
- 更新订阅
### 配置方式
```json
// vercel.json
{
"crons": [
{
"path": "/api/cron/daily-report",
"schedule": "0 0 * * *"
},
{
"path": "/api/cron/hourly-check",
"schedule": "0 * * * *"
}
]
}
```
### Cron 表达式
```
┌───────────── 分钟 (0-59)
│ ┌───────────── 小时 (0-23)
│ │ ┌───────────── 日期 (1-31)
│ │ │ ┌───────────── 月份 (1-12)
│ │ │ │ ┌───────────── 星期 (0-6, 0=周日)
│ │ │ │ │
* * * * *
示例:
0 0 * * * → 每天午夜
0 */2 * * * → 每2小时
30 9 * * 1-5 → 工作日早上9:30
```
### 创建 Cron 端点
```typescript
// api/cron/daily.ts
export default async function handler(request: Request) {
// 验证请求来自 Vercel Cron
const authHeader = request.headers.get('authorization');
if (authHeader !== `Bearer ${process.env.CRON_SECRET}`) {
return new Response('Unauthorized', { status: 401 });
}
// 执行任务
await sendDailyReport();
return new Response('OK');
}
```
### 限制
| 计划 | 每项目限制 |
|------|------------|
| Hobby | 2 个 Cron |
| Pro | 100 个 Cron |
| Enterprise | 100 个 Cron |
---
## 十六、CLI 命令行工具
### 常用命令
#### 部署相关
```bash
# 部署
vercel # 预览部署
vercel --prod # 生产部署
# 查看部署列表
vercel list
vercel list [project-name]
# 查看部署详情
vercel inspect [deployment-url]
# 重新部署
vercel redeploy [deployment-id]
# 回滚
vercel rollback [deployment-id]
# 删除部署
vercel remove [deployment-url]
```
#### 项目管理
```bash
# 列出项目
vercel project ls
# 创建项目
vercel project add
# 查看项目详情
vercel project inspect [project-name]
# 删除项目
vercel project rm [project-name]
# 链接本地目录到项目
vercel link
```
#### 环境变量
```bash
# 列出环境变量
vercel env ls
# 添加环境变量
vercel env add [name]
# 更新环境变量
vercel env update [name] [environment]
# 删除环境变量
vercel env rm [name] [environment]
# 拉取环境变量到本地
vercel env pull
```
#### 域名管理
```bash
# 列出域名
vercel domains ls
# 添加域名
vercel domains add [domain]
# 查看域名详情
vercel domains inspect [domain]
# 购买域名
vercel domains buy [domain]
# 删除域名
vercel domains rm [domain]
```
#### DNS 管理
```bash
# 列出 DNS 记录
vercel dns ls [domain]
# 添加 DNS 记录
vercel dns add [domain] [name] [type] [value]
# 删除 DNS 记录
vercel dns rm [record-id]
```
#### 其他命令
```bash
# 本地开发
vercel dev
vercel dev --port 3000
# 查看日志
vercel logs [deployment-url]
vercel logs [deployment-url] --follow
# 登录
vercel login
vercel login [email]
# 登出
vercel logout
# 查看当前用户
vercel whoami
# 切换团队
vercel switch [team-name]
# 打开项目 Dashboard
vercel open
```
### 全局选项
```bash
--token <token> # 使用令牌认证
--scope <team> # 指定团队范围
--yes # 跳过确认
--version # 显示版本
--help # 显示帮助
```
---
## 十七、REST API
### 认证
```bash
# 创建访问令牌
# Dashboard → Settings → Tokens
# 使用令牌
curl -H "Authorization: Bearer YOUR_TOKEN" https://api.vercel.com/v9/projects
```
### 常用端点
#### 项目
```bash
# 列出项目
GET /v9/projects
# 获取项目
GET /v9/projects/{id}
# 创建项目
POST /v9/projects
# 更新项目
PATCH /v9/projects/{id}
# 删除项目
DELETE /v9/projects/{id}
```
#### 部署
```bash
# 列出部署
GET /v13/deployments
# 获取部署
GET /v13/deployments/{id}
# 创建部署
POST /v13/deployments
# 删除部署
DELETE /v13/deployments/{id}
```
#### 环境变量
```bash
# 列出环境变量
GET /v9/projects/{id}/env
# 创建环境变量
POST /v9/projects/{id}/env
# 更新环境变量
PATCH /v9/projects/{id}/env/{key}
# 删除环境变量
DELETE /v9/projects/{id}/env/{key}
```
#### 域名
```bash
# 列出域名
GET /v6/domains
# 添加域名
POST /v6/domains
# 验证域名
POST /v6/domains/{domain}/verify
# 删除域名
DELETE /v6/domains/{domain}
```
### 示例代码
```typescript
// 创建部署
const response = await fetch('https://api.vercel.com/v13/deployments', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.VERCEL_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
name: 'my-project',
files: [
{
file: 'index.html',
data: '<html><body>Hello</body></html>',
},
],
projectSettings: {
framework: null,
},
}),
});
const deployment = await response.json();
console.log(deployment.url);
```
---
## 十八、框架支持
### 支持的框架
| 框架 | 静态资源 | SSR | ISR | 中间件 | 图片优化 |
|------|:--------:|:---:|:---:|:------:|:--------:|
| **Next.js** | ✓ | ✓ | ✓ | ✓ | ✓ |
| **SvelteKit** | ✓ | ✓ | ✓ | ✓ | ✓ |
| **Nuxt** | ✓ | ✓ | ✓ | ✓ | ✓ |
| **Astro** | ✓ | ✓ | ✓ | ✓ | ✓ |
| **Remix** | ✓ | ✓ | ✗ | ✓ | ✗ |
| **Vite** | ✓ | ✗ | ✗ | ✓ | ✗ |
| **TanStack** | ✓ | ✓ | ✗ | ✓ | ✗ |
| **Create React App** | ✓ | ✗ | ✗ | ✓ | ✗ |
### 功能支持矩阵
**✓ 支持 | ✗ 不支持 | N/A 不适用**
### Build Output API
用于自定义框架集成:
```
.vercel/output/
├── config.json
├── static/
│ └── index.html
├── functions/
│ └── api/
│ └── hello.func/
│ └── index.js
└── prerendered-files/
└── blog/
└── post.html
```
---
## 十九、部署保护
### 保护方法
| 方法 | 说明 | 计划可用性 |
|------|------|------------|
| **Vercel Authentication** | 限制 Vercel 用户访问 | 所有计划 |
| **Password Protection** | 密码保护 | Pro + $150/月 或 Enterprise |
| **Trusted IPs** | IP 白名单 | Enterprise |
### 保护范围
| 范围 | 说明 | 保护内容 |
|------|------|----------|
| **Standard Protection** | 标准保护 | 所有部署(生产域名除外) |
| **All Deployments** | 全部保护 | 所有 URL包括生产域名 |
| **Only Production** | 仅生产 | 仅生产部署 |
| **Only Preview** | 仅预览 | 仅预览部署 |
### 配置保护
1. 进入项目 Settings → Deployment Protection
2. 选择保护方法
3. 选择保护范围
4. 保存设置
### 绕过保护
**Protection Bypass for Automation**
```bash
# 添加绕过密钥
# Settings → Deployment Protection → Bypass for Automation
# 使用密钥访问
curl -H "x-vercel-protection-bypass: YOUR_SECRET" https://preview.example.com
```
---
## 二十、计费与限制
### 计划限制
#### 通用限制
| 限制 | Hobby | Pro | Enterprise |
|------|-------|-----|------------|
| 项目数量 | 200 | 无限 | 无限 |
| 每日部署次数 | 100 | 6000 | 自定义 |
| 每次部署文件数 | 15000 | 15000 | 自定义 |
| 并发构建 | 1 | 12 | 自定义 |
| 构建时间限制 | 45分钟 | 45分钟 | 45分钟 |
| 磁盘空间 | 23 GB | 23-64 GB | 23-64 GB |
| Cron Jobs/项目 | 2 | 100 | 100 |
#### 包含资源Pro
| 资源 | 包含量 |
|------|--------|
| Fast Data Transfer | 1 TB |
| Function Invocations | 1,000,000 |
| Edge Requests | 10,000,000 |
| Edge Config Reads | 1,000,000 |
| Image Optimizations | 10,000/月 |
| Blob Storage | 5 GB |
| Web Analytics Events | 100,000 |
### 按需付费Pro
| 资源 | 价格 |
|------|------|
| Fast Data Transfer | 按区域定价 |
| Function Invocations | $0.60/百万次 |
| Edge Requests | 按区域定价 |
| Image Cache Reads | 按区域定价 |
| Blob Simple Operations | 按区域定价 |
| Monitoring Events | $1.20/百万次 |
### 环境变量限制
- 每个环境最多 1000 个变量
- 总大小限制 64 KB
- Edge Function 单变量限制 5 KB
### 域名限制
| 计划 | 域名/项目 |
|------|-----------|
| Hobby | 50 |
| Pro | 无限* |
| Enterprise | 无限* |
*软限制Pro 100,000Enterprise 1,000,000
### 日志保留
| 计划 | 构建日志 | 运行时日志 |
|------|----------|------------|
| Hobby | 永久 | 1 小时 |
| Pro | 永久 | 1 天 |
| Enterprise | 永久 | 3 天 |
---
## 二十一、最佳实践
### 性能优化
#### 1. 使用 ISR
```typescript
// app/blog/[slug]/page.tsx
export const revalidate = 60; // 每60秒重新生成
export default async function BlogPost({ params }) {
const post = await fetchBlogPost(params.slug);
return <div>{post.content}</div>;
}
```
#### 2. 图片优化
```tsx
// 使用响应式图片
<Image
src={hero}
alt="Hero"
sizes="100vw"
fill
priority
/>
```
#### 3. 字体优化
```tsx
// 使用 next/font
import { Inter } from 'next/font/google';
const inter = Inter({ subsets: ['latin'] });
export default function RootLayout({ children }) {
return (
<html lang="en" className={inter.className}>
<body>{children}</body>
</html>
);
}
```
### SEO 优化
#### 1. Metadata API
```typescript
// app/layout.tsx
export const metadata = {
title: {
default: 'My Website',
template: '%s | My Website',
},
description: 'Description of my website',
openGraph: {
title: 'My Website',
description: 'Description',
images: ['/og-image.jpg'],
},
};
```
#### 2. Sitemap
```typescript
// app/sitemap.ts
import { MetadataRoute from 'next';
export default function sitemap(): MetadataRoute.Sitemap {
return [
{
url: 'https://example.com',
lastModified: new Date(),
},
{
url: 'https://example.com/about',
lastModified: new Date(),
},
];
}
```
### 开发工作流
```
1. 本地开发
npm run dev
2. 创建分支
git checkout -b feature/new-feature
3. 提交并推送
git add . && git commit -m "Add new feature"
git push origin feature/new-feature
4. Vercel 自动创建预览部署
5. 合并到 main 后自动生产部署
```
### 监控与调试
```bash
# 查看生产日志
vercel logs your-domain.com
# 查看函数日志
vercel logs your-domain.com --output raw | grep "api/"
# 使用 Speed Insights
// 添加组件到 layout.tsx
import { SpeedInsights } from '@vercel/speed-insights/next';
```
---
**文档结束**