乐闻世界logo
搜索文章和话题

Vercel

Vercel是一个基于云的静态网站托管和部署平台,旨在帮助开发者快速、安全地将静态网站部署到全球各地。Vercel提供了一组易于使用的CLI工具和API,可以支持从GitHub、GitLab、Bitbucket等代码托管服务中自动构建和部署静态网站。Vercel的托管服务基于CDN和HTTP/2技术,可以为全球用户提供快速和可靠的访问体验,并且支持自定义域名、SSL证书等高级特性。Vercel还提供了实时协作、预览、分支部署等功能,以帮助开发者更有效地管理和部署静态网站。由于Vercel的易用性、高性能和可扩展性,它已经成为一个备受欢迎的静态网站托管和部署平台,并被许多企业和开发者使用。
Vercel
查看更多相关内容
Vercel 的 Serverless Functions 有哪些特点和限制?## Vercel 的 Serverless Functions 有哪些特点和限制? Vercel 的 Serverless Functions 是一个强大的功能,允许开发者在 Vercel 平台上部署和运行后端逻辑,而无需管理服务器。这些函数具有许多独特的特点,同时也存在一些限制需要了解。 ### Serverless Functions 的特点 #### 1. 自动扩展 **按需扩展**: - 函数根据请求量自动扩展 - 从零到无限并发 - 无需手动配置服务器容量 - 自动处理流量峰值 **弹性伸缩**: - 低流量时自动缩减到零 - 高流量时快速扩展 - 基于实际使用量计费 - 无需预付资源 #### 2. 全球边缘网络 **边缘部署**: - 函数部署在全球边缘节点 - 请求路由到最近的节点 - 降低延迟,提升响应速度 - 更好的用户体验 **地理分布**: - 50+ 全球边缘位置 - 自动地理位置路由 - 支持自定义区域配置 - 智能负载均衡 #### 3. 冷启动优化 **快速启动**: - 优化的冷启动时间 - 保持函数热状态 - 预热机制 - 智能资源分配 **持续运行**: - 活跃函数保持运行状态 - 减少冷启动频率 - 更快的响应时间 - 更好的性能 #### 4. 多种运行时支持 **支持的运行时**: - Node.js(推荐) - Python - Go - Ruby - 其他(通过自定义配置) **Node.js 版本**: - 支持 Node.js 14.x、16.x、18.x、20.x - 自动检测项目使用的 Node.js 版本 - 可在 `vercel.json` 中指定版本 - 支持最新的 Node.js 特性 #### 5. 简单的 API 设计 **导出默认函数**: ```javascript // pages/api/hello.js export default function handler(req, res) { res.status(200).json({ message: 'Hello World' }); } ``` **支持多种 HTTP 方法**: ```javascript export default function handler(req, res) { if (req.method === 'GET') { // 处理 GET 请求 } else if (req.method === 'POST') { // 处理 POST 请求 } } ``` **Edge Runtime**: ```javascript export const runtime = 'edge'; export default function handler(request) { return new Response('Hello from Edge!'); } ``` #### 6. 环境变量支持 **安全的环境变量**: - 在 Dashboard 中配置 - 支持不同环境(Production、Preview、Development) - 自动注入到函数运行环境 - 不暴露在客户端代码中 **访问环境变量**: ```javascript const apiKey = process.env.API_KEY; ``` #### 7. 内置中间件支持 **Next.js Middleware**: ```javascript import { NextResponse } from 'next/server'; import type { NextRequest } from 'next/server'; export function middleware(request: NextRequest) { return NextResponse.next(); } ``` **自定义中间件**: - 请求预处理 - 响应后处理 - 认证和授权 - 日志记录 ### Serverless Functions 的限制 #### 1. 执行时间限制 **免费计划**: - 最大执行时间:10 秒(Hobby 计划) - Pro 计划:60 秒 - Enterprise 计划:可协商 **超时处理**: ```javascript // 设置合理的超时时间 export const config = { maxDuration: 30, // 30 秒 }; ``` **最佳实践**: - 避免长时间运行的任务 - 使用异步处理模式 - 将长任务拆分为多个函数 - 使用队列处理后台任务 #### 2. 内存限制 **内存配额**: - 免费计划:1024 MB - Pro 计划:最高 3008 MB - Enterprise 计划:可协商 **内存配置**: ```javascript // 在 vercel.json 中配置 { "functions": { "api/**/*.js": { "memory": 2048 } } } ``` **内存优化**: - 避免加载大型数据集 - 使用流式处理 - 及时释放不再使用的资源 - 监控内存使用情况 #### 3. 请求体大小限制 **限制**: - 最大请求体大小:4.5 MB - 包括文件上传、JSON 数据等 **处理大文件**: ```javascript // 使用流式处理 export default async function handler(req, res) { const chunks = []; for await (const chunk of req) { chunks.push(chunk); } const buffer = Buffer.concat(chunks); // 处理数据 } ``` **替代方案**: - 使用对象存储(如 Vercel Blob) - 使用第三方存储服务 - 实现分片上传 - 使用直接上传到云存储 #### 4. 并发限制 **免费计划**: - 每个函数的并发请求数有限制 - 超过限制的请求会被排队或拒绝 **Pro 计划**: - 更高的并发限制 - 更好的性能保证 - 优先处理 **优化策略**: - 使用缓存减少函数调用 - 实现请求去重 - 使用 CDN 缓存静态响应 - 优化函数性能 #### 5. 冷启动延迟 **冷启动时间**: - 首次请求可能需要额外时间 - 通常在几百毫秒到几秒之间 - 取决于函数复杂度和运行时 **减少冷启动**: - 保持函数轻量 - 避免不必要的依赖 - 使用 Edge Runtime(更快的冷启动) - 实现预热机制 #### 6. 文件系统限制 **只读文件系统**: - 函数运行在只读环境中 - 不能写入本地文件系统 - 临时文件在函数结束后被删除 **解决方案**: ```javascript // 使用外部存储 import { put } from '@vercel/blob'; export default async function handler(req, res) { const { url } = await put('file.txt', 'Hello World', { access: 'public', }); res.json({ url }); } ``` **推荐存储方案**: - Vercel Blob - AWS S3 - Cloudflare R2 - 其他对象存储服务 #### 7. 网络限制 **出站网络**: - 支持所有出站网络请求 - 可以调用外部 API - 可以连接数据库 **入站网络**: - 只能通过 HTTP/HTTPS 访问 - 不支持原始 TCP/UDP 连接 - 不支持 WebSocket(除非使用 Edge Runtime) **数据库连接**: ```javascript import { MongoClient } from 'mongodb'; let client; export default async function handler(req, res) { if (!client) { client = new MongoClient(process.env.MONGODB_URI); await client.connect(); } const db = client.db('mydb'); const data = await db.collection('users').find({}).toArray(); res.json(data); } ``` ### 最佳实践 #### 1. 函数设计 **单一职责**: - 每个函数只做一件事 - 保持函数简单和专注 - 便于测试和维护 **轻量级**: - 最小化依赖 - 优化代码大小 - 避免不必要的库 **异步处理**: - 使用 async/await - 避免阻塞操作 - 使用 Promise 处理异步任务 #### 2. 性能优化 **缓存策略**: ```javascript // 使用 Vercel KV 缓存 import { kv } from '@vercel/kv'; export default async function handler(req, res) { const cached = await kv.get('data'); if (cached) { return res.json(cached); } const data = await fetchData(); await kv.set('data', data, { ex: 3600 }); res.json(data); } ``` **数据库连接池**: - 重用数据库连接 - 使用连接池 - 避免每次请求都创建新连接 **响应压缩**: - 启用 gzip 压缩 - 减小响应体大小 - 提升传输速度 #### 3. 错误处理 **完善的错误处理**: ```javascript export default async function handler(req, res) { try { const data = await fetchData(); res.status(200).json(data); } catch (error) { console.error('Error:', error); res.status(500).json({ error: 'Internal Server Error', message: error.message }); } } ``` **日志记录**: - 记录重要事件 - 使用结构化日志 - 监控错误率 #### 4. 安全性 **输入验证**: ```javascript import { z } from 'zod'; const schema = z.object({ email: z.string().email(), name: z.string().min(1), }); export default async function handler(req, res) { try { const data = schema.parse(req.body); // 处理数据 res.status(200).json({ success: true }); } catch (error) { res.status(400).json({ error: 'Invalid input' }); } } ``` **认证和授权**: - 实现适当的认证机制 - 使用 JWT 或 session - 验证用户权限 - 保护敏感端点 **环境变量安全**: - 不要在代码中硬编码密钥 - 使用环境变量存储敏感信息 - 定期轮换密钥 #### 5. 监控和调试 **实时日志**: - 查看 Vercel Dashboard 中的日志 - 使用 `console.log` 调试 - 监控函数执行时间 **性能监控**: ```javascript export default async function handler(req, res) { const start = Date.now(); try { const data = await fetchData(); const duration = Date.now() - start; console.log(`Function executed in ${duration}ms`); res.status(200).json(data); } catch (error) { console.error('Error:', error); res.status(500).json({ error: 'Internal Server Error' }); } } ``` **错误追踪**: - 使用 Sentry 等错误追踪服务 - 设置错误告警 - 分析错误模式 ### 使用场景 #### 1. API 端点 **RESTful API**: ```javascript // pages/api/users/[id].js export default async function handler(req, res) { const { id } = req.query; if (req.method === 'GET') { const user = await getUser(id); res.status(200).json(user); } } ``` **GraphQL API**: - 使用 Apollo Server - 集成 GraphQL - 类型安全的 API #### 2. Webhook 处理 **GitHub Webhook**: ```javascript export default async function handler(req, res) { if (req.method === 'POST') { const event = req.headers['x-github-event']; // 处理 webhook 事件 res.status(200).json({ received: true }); } } ``` **第三方 Webhook**: - Stripe Webhook - Slack Webhook - 自定义 Webhook #### 3. 表单处理 **表单提交**: ```javascript export default async function handler(req, res) { if (req.method === 'POST') { const { name, email } = req.body; // 处理表单数据 res.status(200).json({ success: true }); } } ``` **文件上传**: - 使用 Vercel Blob - 实现分片上传 - 处理大文件 #### 4. 数据库操作 **CRUD 操作**: ```javascript import { PrismaClient } from '@prisma/client'; const prisma = new PrismaClient(); export default async function handler(req, res) { if (req.method === 'GET') { const users = await prisma.user.findMany(); res.status(200).json(users); } } ``` **数据库集成**: - PostgreSQL - MySQL - MongoDB - 其他数据库 ### 与其他服务的比较 #### 1. vs AWS Lambda **Vercel 优势**: - 更简单的配置 - 更好的开发体验 - 自动集成 Next.js - 全球边缘网络 **AWS Lambda 优势**: - 更长的执行时间 - 更多的运行时支持 - 更低的成本(大规模) - 更多的集成选项 #### 2. vs Cloudflare Workers **Vercel 优势**: - 更长的执行时间 - 更大的内存限制 - 更好的 Node.js 支持 - 更丰富的生态系统 **Cloudflare Workers 优势**: - 更快的冷启动 - 更低的延迟 - 更高的并发限制 - 更便宜的价格 #### 3. vs Netlify Functions **Vercel 优势**: - 更好的 Next.js 集成 - 更快的部署 - 更详细的日志 - 更好的边缘函数支持 **Netlify Functions 优势**: - 更长的执行时间 - 更多的运行时支持 - 更好的 Go 支持 ### 总结 Vercel 的 Serverless Functions 提供了: **优势**: 1. 自动扩展,无需管理服务器 2. 全球边缘网络,低延迟 3. 简单的 API 设计,易于使用 4. 多种运行时支持 5. 与 Next.js 深度集成 **限制**: 1. 执行时间限制 2. 内存限制 3. 请求体大小限制 4. 并发限制 5. 冷启动延迟 6. 只读文件系统 7. 网络限制 了解这些特点和限制,可以帮助开发者更好地设计和实现 Serverless Functions,充分发挥 Vercel 平台的优势。
服务端 · 2月21日 16:50
Vercel 与 Next.js 的集成优势是什么?## Vercel 与 Next.js 的集成优势是什么? Vercel 与 Next.js 的集成可以说是天作之合,因为 Vercel 的创始团队也是 Next.js 的创建者。这种深度集成带来了许多独特的优势,使得在 Vercel 上部署 Next.js 应用成为最佳选择。 ### 深度集成的技术优势 #### 1. 零配置部署 **自动检测和优化**: - Vercel 自动识别 Next.js 项目 - 自动配置构建设置和路由 - 无需手动配置 `vercel.json` - 自动应用 Next.js 特定的优化 **智能构建**: - 自动识别页面类型(静态、动态、ISR) - 优化构建流程 - 自动处理图片优化 - 智能缓存策略 #### 2. Serverless Functions 无缝支持 **API Routes 部署**: ```javascript // pages/api/hello.js export default function handler(req, res) { res.status(200).json({ message: 'Hello from Vercel' }); } ``` **自动部署为 Serverless 函数**: - 每个 API Route 自动成为独立的 Serverless 函数 - 自动处理函数的冷启动 - 优化的函数内存和超时配置 - 自动扩展以应对流量 #### 3. 增量静态再生成(ISR)优化 **原生支持**: ```javascript export async function getStaticProps() { return { props: { data: await fetchData() }, revalidate: 60 // 每 60 秒重新生成 }; } ``` **Vercel 特定优化**: - 智能的缓存失效策略 - 后台重新生成,不影响用户体验 - 分布式缓存确保一致性 - 自动处理 CDN 缓存 #### 4. 边缘运行时支持 **Edge Runtime**: ```javascript export const runtime = 'edge'; export default function handler() { return new Response('Hello from Edge!'); } ``` **优势**: - 在全球边缘节点执行代码 - 极低的延迟 - 自动地理位置路由 - 优化的冷启动时间 ### 性能优化 #### 1. 图片优化 **自动图片优化**: ```jsx import Image from 'next/image'; <Image src="/hero.jpg" alt="Hero" width={800} height={600} priority /> ``` **Vercel 优化**: - 自动生成多种尺寸和格式 - WebP、AVIF 等现代格式支持 - 智能的懒加载 - CDN 缓存优化后的图片 #### 2. 字体优化 **next/font 集成**: ```jsx import { Inter } from 'next/font/google'; const inter = Inter({ subsets: ['latin'] }); ``` **优势**: - 自动优化字体加载 - 零布局偏移 - 自动托管字体文件 - 智能的字体子集化 #### 3. 代码分割和懒加载 **自动优化**: - 路由级别的代码分割 - 组件级别的懒加载 - 自动预加载关键资源 - 优化的包大小 ### 开发体验提升 #### 1. 预览部署 **Pull Request 预览**: - 每个 PR 自动生成预览 URL - 实时更新预览 - 独立的环境变量 - 便于代码审查 #### 2. 实时日志 **详细的日志信息**: - 构建日志 - 运行时日志 - 错误堆栈跟踪 - 性能指标 #### 3. Analytics 集成 **Vercel Analytics**: ```jsx import { Analytics } from '@vercel/analytics/react'; export default function RootLayout({ children }) { return ( <html> <body> {children} <Analytics /> </body> </html> ); } ``` **功能**: - Web Vitals 监控 - 用户行为分析 - 性能洞察 - 无需额外配置 ### 高级功能支持 #### 1. 中间件支持 **Next.js Middleware**: ```javascript import { NextResponse } from 'next/server'; import type { NextRequest } from 'next/server'; export function middleware(request: NextRequest) { return NextResponse.rewrite(new URL('/dashboard', request.url)); } export const config = { matcher: '/home/:path*', }; ``` **Vercel 优势**: - 在边缘运行中间件 - 极快的响应时间 - 自动扩展 - 支持复杂的路由逻辑 #### 2. Server Components 支持 **React Server Components**: ```jsx // Server Component async function UserProfile({ userId }) { const user = await fetchUser(userId); return <div>{user.name}</div>; } ``` **优势**: - 自动在服务器端渲染 - 减少客户端 JavaScript - 更快的首屏加载 - 更好的 SEO #### 3. Streaming 支持 **渐进式渲染**: ```jsx import { Suspense } from 'react'; export default function Page() { return ( <div> <Header /> <Suspense fallback={<Loading />}> <SlowComponent /> </Suspense> </div> ); } ``` **Vercel 优化**: - 自动支持 Streaming - 优化的传输协议 - 更快的 Time to First Byte (TTFB) - 更好的用户体验 ### 部署和运维优势 #### 1. 自动扩展 **按需扩展**: - 自动处理流量峰值 - 无需手动配置服务器 - 全球边缘网络 - 高可用性保证 #### 2. 回滚功能 **一键回滚**: - 保留所有历史部署 - 快速回滚到任何版本 - 零停机时间 - 简单的版本管理 #### 3. 环境管理 **多环境支持**: - Production、Preview、Development 环境 - 独立的环境变量 - 环境特定的配置 - 简化的环境切换 ### 成本效益 #### 1. 免费额度 **免费计划包含**: - 无限带宽 - 100GB 带宽 - 6,000 分钟构建时间 - 100GB-Hours Serverless Functions - 无限预览部署 #### 2. 按需付费 **付费计划优势**: - 更高的配额 - 优先支持 - 团队协作功能 - 高级分析 ### 与其他平台的对比 #### 1. vs Netlify **Vercel 优势**: - 更好的 Next.js 支持 - 更快的边缘函数 - 更详细的日志 - 更好的开发体验 #### 2. vs AWS Amplify **Vercel 优势**: - 更简单的配置 - 更快的部署 - 更好的预览部署 - 更直观的界面 #### 3. vs 自托管 **Vercel 优势**: - 零运维成本 - 自动扩展 - 全球 CDN - 自动 SSL ### 最佳实践 #### 1. 利用 ISR - 对动态内容使用 ISR - 设置合理的 revalidate 时间 - 使用 on-demand revalidation - 监控缓存命中率 #### 2. 优化图片 - 使用 next/image 组件 - 提供正确的尺寸 - 使用 priority 属性 - 启用自动格式转换 #### 3. 使用 Edge Runtime - 对需要低延迟的功能使用 Edge Runtime - 注意 Edge Runtime 的限制 - 合理划分 Serverless 和 Edge 函数 #### 4. 监控性能 - 使用 Vercel Analytics - 监控 Web Vitals - 跟踪错误率 - 优化关键路径 ### 实际应用案例 #### 1. 电商网站 **优势**: - ISR 实现产品页面缓存 - Edge Functions 处理购物车 - 图片优化提升加载速度 - 全球 CDN 确保快速访问 #### 2. 内容平台 **优势**: - SSG 生成静态页面 - ISR 更新内容 - 预览部署便于内容审核 - Analytics 了解用户行为 #### 3. SaaS 应用 **优势**: - Serverless Functions 处理 API - Middleware 处理认证 - Edge Runtime 提升响应速度 - 自动扩展应对用户增长 ### 总结 Vercel 与 Next.js 的深度集成提供了: 1. **零配置体验**:自动识别和优化 2. **卓越性能**:边缘网络、CDN、优化 3. **开发效率**:预览部署、实时日志 4. **可扩展性**:自动扩展、高可用 5. **成本效益**:免费额度、按需付费 这种集成使得开发者能够专注于构建功能,而不必担心基础设施和部署细节,是 Next.js 应用的理想部署平台。
服务端 · 2月21日 16:50
Vercel 与其他部署平台(如 Netlify、AWS Amplify)相比有哪些优势和劣势?## Vercel 与其他部署平台(如 Netlify、AWS Amplify)相比有哪些优势和劣势? 选择合适的部署平台对于项目的成功至关重要。Vercel、Netlify 和 AWS Amplify 都是流行的前端部署平台,各有其特点和适用场景。下面将从多个维度对比这些平台。 ### Vercel 详解 #### 优势 **1. Next.js 深度集成** - Vercel 是 Next.js 的创建者,提供最佳支持 - 自动识别和优化 Next.js 项目 - 原生支持 ISR、SSG、SSR - 无需配置即可获得最佳性能 **2. 全球边缘网络** - 50+ 全球边缘节点 - 自动地理位置路由 - 低延迟访问 - 高可用性保证 **3. 零配置部署** - 自动检测框架和配置 - 智能构建设置 - 自动 SSL 证书 - 简化的部署流程 **4. 开发体验** - 实时日志和错误追踪 - 预览部署 - 快速回滚 - 直观的 Dashboard **5. 性能优化** - 自动图片优化 - 字体优化 - 代码分割 - CDN 缓存 #### 劣势 **1. 成本较高** - Pro 计划 $20/月 - 超出配额费用较高 - 大规模部署成本增加 **2. 平台锁定** - 某些功能是 Vercel 特有的 - 迁移到其他平台可能需要重构 - 依赖 Vercel 特定功能 **3. 限制较多** - Serverless Functions 执行时间限制 - 内存限制 - 请求体大小限制 ### Netlify 详解 #### 优势 **1. 多框架支持** - 支持几乎所有前端框架 - 良好的 Hugo、Jekyll 支持 - 灵活的构建配置 - 自定义构建命令 **2. 强大的表单处理** - 内置表单功能 - 无需后端即可处理表单 - 自动邮件通知 - 表单数据管理 **3. Functions 功能** - 支持多种运行时(Node.js、Go、Python、Ruby) - 更长的执行时间(免费计划 10 秒,付费计划 60 秒) - 更大的内存限制 - 良好的 Go 支持 **4. 定价灵活** - 免费计划更慷慨 - 按使用量计费 - 团队计划价格合理 - 企业级功能 **5. 插件生态** - 丰富的插件系统 - 社区贡献的插件 - 易于扩展功能 - 自定义插件开发 #### 劣势 **1. Next.js 支持不如 Vercel** - ISR 支持有限 - 某些 Next.js 特性不支持 - 需要额外配置 - 性能优化不如 Vercel **2. 边缘功能较弱** - Edge Functions 功能有限 - 边缘节点较少 - 边缘运行时支持有限 **3. Dashboard 体验** - 界面不如 Vercel 直观 - 某些功能难以发现 - 学习曲线较陡 ### AWS Amplify 详解 #### 优势 **1. AWS 生态集成** - 与 AWS 服务深度集成 - 无缝连接 DynamoDB、Cognito、S3 - 使用 AWS 基础设施 - 企业级可靠性 **2. 全栈解决方案** - 前端和后端统一管理 - 数据库、认证、存储一体化 - API Gateway 集成 - GraphQL 支持 **3. 强大的后端功能** - Amplify CLI 功能强大 - 数据模型定义 - 实时订阅 - 离线支持 **4. 企业级特性** - 高级安全功能 - 合规性支持 - 详细的访问控制 - 审计日志 **5. 灵活的部署** - 支持多种部署方式 - 自定义部署流程 - 蓝绿部署 - 金丝雀发布 #### 劣势 **1. 学习曲线陡峭** - AWS 概念复杂 - 需要理解 AWS 服务 - 配置复杂度高 - 文档分散 **2. 成本难以预测** - AWS 服务计费复杂 - 按使用量计费 - 需要仔细监控 - 容易产生意外费用 **3. 部署速度较慢** - 构建时间较长 - 部署流程复杂 - 不如 Vercel 快速 - 冷启动时间较长 ### 详细对比 #### 1. 框架支持 | 框架 | Vercel | Netlify | AWS Amplify | |------|--------|---------|-------------| | Next.js | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ | | React | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | | Vue.js | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | | Angular | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | | Svelte | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ | | Hugo | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | | Jekyll | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | #### 2. 性能特性 | 特性 | Vercel | Netlify | AWS Amplify | |------|--------|---------|-------------| | 全球 CDN | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | | Edge Functions | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐ | | ISR 支持 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐ | | 图片优化 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ | | 字体优化 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐ | #### 3. 开发体验 | 特性 | Vercel | Netlify | AWS Amplify | |------|--------|---------|-------------| | 易用性 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ | | 文档质量 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ | | 社区支持 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | | Dashboard | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ | | CLI 工具 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | #### 4. 定价对比 | 计划 | Vercel | Netlify | AWS Amplify | |------|--------|---------|-------------| | 免费带宽 | 100GB/月 | 100GB/月 | 无限制 | | 免费构建时间 | 6,000 分钟 | 300 分钟 | 1,000 分钟 | | Pro 计划 | $20/月 | $19/月 | 按使用量 | | 团队计划 | $20/用户/月 | $19/用户/月 | 按使用量 | | 企业计划 | 定制 | 定制 | 定制 | #### 5. 功能对比 | 功能 | Vercel | Netlify | AWS Amplify | |------|--------|---------|-------------| | 预览部署 | ✅ | ✅ | ✅ | | 环境变量 | ✅ | ✅ | ✅ | | 自定义域名 | ✅ | ✅ | ✅ | | SSL 证书 | ✅ | ✅ | ✅ | | 表单处理 | ❌ | ✅ | ✅ | | 数据库集成 | ⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | | 认证服务 | ⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐⭐ | | 存储服务 | ⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐⭐ | ### 适用场景分析 #### 选择 Vercel 的场景 **1. Next.js 项目** - 最佳 Next.js 支持 - 自动优化 - 最佳性能 **2. 快速原型开发** - 零配置部署 - 快速迭代 - 预览部署 **3. 全球化应用** - 全球 CDN - 低延迟 - 高可用性 **4. 团队协作** - 直观的界面 - 实时日志 - 快速回滚 #### 选择 Netlify 的场景 **1. 多框架项目** - 支持各种框架 - 灵活配置 - 静态站点生成器 **2. 表单密集型应用** - 内置表单功能 - 无需后端 - 自动处理 **3. 预算有限的项目** - 免费计划慷慨 - 按使用量计费 - 成本可控 **4. 需要 Go 运行时** - 良好的 Go 支持 - 高性能 - 灵活配置 #### 选择 AWS Amplify 的场景 **1. AWS 生态项目** - 已使用 AWS 服务 - 需要深度集成 - 企业级需求 **2. 全栈应用** - 前后端统一管理 - 数据库、认证、存储 - GraphQL API **3. 企业级应用** - 高级安全功能 - 合规性要求 - 详细访问控制 **4. 复杂后端需求** - 复杂的数据模型 - 实时功能 - 离线支持 ### 迁移考虑因素 #### 从 Vercel 迁移到其他平台 **需要考虑**: - Next.js 特定功能的兼容性 - ISR 配置的迁移 - 环境变量的重新配置 - 自定义域名的 DNS 更新 - 构建配置的调整 #### 从 Netlify 迁移到其他平台 **需要考虑**: - 表单功能的替代方案 - 插件功能的迁移 - Functions 运行时的兼容性 - 构建命令的调整 - 环境变量的迁移 #### 从 AWS Amplify 迁移到其他平台 **需要考虑**: - AWS 服务的解耦 - 数据库迁移 - 认证系统的迁移 - 存储服务的迁移 - API Gateway 的重新配置 ### 最佳实践建议 #### 1. 评估需求 **技术需求**: - 使用的框架 - 性能要求 - 功能需求 - 集成需求 **业务需求**: - 预算限制 - 团队规模 - 项目规模 - 合规要求 #### 2. 试用和比较 **免费试用**: - 利用免费计划 - 测试核心功能 - 评估性能 - 体验开发流程 **性能测试**: - 测试加载速度 - 测试构建时间 - 测试部署速度 - 测试边缘功能 #### 3. 长期考虑 **可扩展性**: - 平台能否支持增长 - 成本如何随规模变化 - 功能是否满足未来需求 **可迁移性**: - 平台锁定程度 - 迁移难度 - 数据导出能力 **社区和生态**: - 社区活跃度 - 文档质量 - 第三方集成 ### 总结 **Vercel 最适合**: - Next.js 项目 - 需要最佳性能 - 快速原型开发 - 全球化应用 **Netlify 最适合**: - 多框架项目 - 表单密集型应用 - 预算有限的项目 - 需要 Go 运行时 **AWS Amplify 最适合**: - AWS 生态项目 - 全栈应用 - 企业级应用 - 复杂后端需求 选择部署平台时,应该综合考虑技术需求、业务需求、预算和长期发展计划。没有绝对最好的平台,只有最适合自己项目需求的平台。
服务端 · 2月21日 16:50
Vercel 如何处理环境变量和配置管理?## Vercel 如何处理环境变量和配置管理? Vercel 提供了一套完善的环境变量和配置管理系统,让开发者能够安全地管理不同环境下的配置信息。 ### 环境变量管理 #### 1. 环境变量类型 Vercel 支持三种主要的环境变量类型: - **Production(生产环境)**:用于生产部署,只有合并到主分支的代码才能访问 - **Preview(预览环境)**:用于预览部署,所有 Pull Request 和分支都能访问 - **Development(开发环境)**:用于本地开发,通过 Vercel CLI 访问 #### 2. 设置环境变量 可以通过以下方式设置环境变量: **通过 Vercel Dashboard**: 1. 进入项目设置 2. 选择 "Environment Variables" 3. 添加变量名称和值 4. 选择适用的环境(Production、Preview、Development) **通过 Vercel CLI**: ```bash vercel env add MY_API_KEY production vercel env add MY_API_KEY preview vercel env add MY_API_KEY development ``` **通过 vercel.json 配置文件**: ```json { "env": { "MY_API_KEY": "@my-api-key" }, "build": { "env": { "BUILD_TIME_VAR": "value" } } } ``` #### 3. 访问环境变量 在代码中可以通过 `process.env` 访问环境变量: ```javascript const apiKey = process.env.MY_API_KEY; ``` ### 配置管理 #### 1. vercel.json 配置文件 `vercel.json` 是 Vercel 的项目配置文件,可以定义构建、路由、重定向等设置: ```json { "version": 2, "buildCommand": "npm run build", "outputDirectory": "dist", "devCommand": "npm run dev", "installCommand": "npm install", "framework": "create-react-app", "regions": ["iad1"], "functions": { "api/**/*.js": { "memory": 1024, "maxDuration": 10 } }, "headers": [ { "source": "/(.*)", "headers": [ { "key": "X-Content-Type-Options", "value": "nosniff" } ] } ], "rewrites": [ { "source": "/api/:path*", "destination": "/api/:path*" } ] } ``` #### 2. 框架自动检测 Vercel 能够自动检测并配置常见的前端框架: - Next.js - React (Create React App) - Vue.js - Angular - Nuxt.js - Gatsby - SvelteKit 对于自动检测的框架,通常不需要手动配置 `vercel.json`。 #### 3. 构建配置 **构建命令**:定义如何构建项目 ```json { "buildCommand": "npm run build" } ``` **输出目录**:指定构建产物的目录 ```json { "outputDirectory": "dist" } ``` **安装命令**:自定义依赖安装命令 ```json { "installCommand": "npm ci" } ``` ### 最佳实践 #### 1. 安全性 - 永远不要将敏感信息提交到代码仓库 - 使用环境变量存储 API 密钥、数据库连接字符串等敏感信息 - 定期轮换敏感的 API 密钥和令牌 #### 2. 环境隔离 - 为不同环境使用不同的配置 - 生产环境使用生产数据库和 API 端点 - 预览环境使用测试资源 #### 3. 默认值处理 在代码中为环境变量提供默认值: ```javascript const apiUrl = process.env.API_URL || 'https://api.example.com'; ``` #### 4. 类型检查 使用 TypeScript 或其他类型检查工具确保环境变量的类型安全: ```typescript const API_URL = process.env.API_URL as string; const PORT = parseInt(process.env.PORT || '3000', 10); ``` ### 常见问题 #### 1. 环境变量未生效 确保: - 变量已正确设置在对应的环境中 - 重新部署项目以应用新的环境变量 - 检查变量名称的大小写是否正确 #### 2. 本地开发访问环境变量 使用 Vercel CLI 拉取环境变量到本地: ```bash vercel env pull .env.local ``` #### 3. 环境变量长度限制 Vercel 对环境变量的长度有限制,对于大型配置,考虑使用配置文件或环境变量管理服务。
服务端 · 2月21日 16:50
Vercel 如何处理错误和日志管理?## Vercel 如何处理错误和日志管理? Vercel 提供了一套完善的错误处理和日志管理系统,帮助开发者快速识别、调试和解决问题。了解这些功能对于维护生产环境的稳定性至关重要。 ### 日志管理 #### 1. 实时日志 **构建日志**: - 显示构建过程的每一步 - 包括依赖安装、构建命令执行等 - 实时更新构建进度 - 显示构建错误和警告 **运行时日志**: - Serverless Functions 的执行日志 - API Routes 的请求和响应日志 - 错误堆栈跟踪 - 性能指标 **访问日志**: - HTTP 请求日志 - 响应时间 - 状态码 - 请求来源 #### 2. 日志查看方式 **通过 Vercel Dashboard**: 1. 进入项目页面 2. 选择 "Deployments" 标签 3. 点击特定的部署 4. 查看 "Build Logs" 或 "Function Logs" **通过 Vercel CLI**: ```bash # 查看最新部署的日志 vercel logs # 查看特定部署的日志 vercel logs <deployment-url> # 实时跟踪日志 vercel logs --follow # 查看函数日志 vercel logs --filter function ``` #### 3. 日志过滤和搜索 **过滤选项**: - 按时间范围过滤 - 按日志级别过滤(Error、Warning、Info) - 按函数名称过滤 - 按请求 ID 过滤 **搜索功能**: - 关键词搜索 - 正则表达式搜索 - 组合过滤条件 ```bash # 搜索包含特定关键词的日志 vercel logs --grep "error" # 过滤特定函数的日志 vercel logs --filter "api/hello" ``` #### 4. 日志导出 **导出日志**: - 支持导出为 JSON 格式 - 可以导出特定时间范围的日志 - 用于离线分析和存档 ```bash # 导出日志到文件 vercel logs --output logs.json ``` ### 错误处理 #### 1. 构建错误 **常见构建错误**: **依赖安装失败**: ``` Error: Cannot find module 'react' ``` **解决方案**: - 检查 `package.json` 中的依赖 - 删除 `node_modules` 和 `package-lock.json` - 重新安装依赖 - 检查 Node.js 版本兼容性 **构建命令失败**: ``` Error: Build failed with exit code 1 ``` **解决方案**: - 检查构建命令是否正确 - 查看详细的错误信息 - 本地重现构建过程 - 检查环境变量配置 **类型错误**: ``` Error: Type 'string' is not assignable to type 'number' ``` **解决方案**: - 修复 TypeScript 类型错误 - 运行本地类型检查 - 使用 `--noEmit` 选项验证 #### 2. 运行时错误 **Serverless Functions 错误**: **超时错误**: ```javascript Error: Function execution timed out ``` **解决方案**: - 优化函数执行时间 - 增加函数超时限制 - 使用异步处理模式 - 拆分长时间运行的任务 **内存不足错误**: ```javascript Error: JavaScript heap out of memory ``` **解决方案**: - 增加函数内存限制 - 优化内存使用 - 使用流式处理 - 减少数据加载量 **未捕获的异常**: ```javascript Error: UnhandledPromiseRejectionWarning ``` **解决方案**: - 添加适当的错误处理 - 使用 try-catch 块 - 实现全局错误处理器 - 记录所有未捕获的异常 #### 3. 部署错误 **域名配置错误**: ``` Error: Domain verification failed ``` **解决方案**: - 检查 DNS 记录配置 - 等待 DNS 传播 - 验证域名所有权 - 检查 SSL 证书状态 **环境变量错误**: ``` Error: Missing required environment variable ``` **解决方案**: - 检查环境变量配置 - 确保所有必需的变量都已设置 - 验证变量名称拼写 - 重新部署项目 ### 错误追踪集成 #### 1. Sentry 集成 **安装 Sentry**: ```bash npm install @sentry/nextjs npx @sentry/wizard -i nextjs ``` **配置 Sentry**: ```javascript // sentry.client.config.js import * as Sentry from "@sentry/nextjs"; Sentry.init({ dsn: process.env.NEXT_PUBLIC_SENTRY_DSN, tracesSampleRate: 1.0, }); ``` **捕获错误**: ```javascript try { // 你的代码 } catch (error) { Sentry.captureException(error); } ``` #### 2. 其他错误追踪服务 **LogRocket**: - 会话回放 - 性能监控 - 错误追踪 **Rollbar**: - 实时错误报告 - 错误分组 - 部署跟踪 **Bugsnag**: - 自动错误报告 - 错误分析 - 用户影响分析 ### 性能监控 #### 1. Vercel Analytics **集成 Analytics**: ```jsx import { Analytics } from '@vercel/analytics/react'; export default function RootLayout({ children }) { return ( <html> <body> {children} <Analytics /> </body> </html> ); } ``` **监控指标**: - Web Vitals(LCP、FID、CLS) - 页面加载时间 - 用户行为分析 - 转化率追踪 #### 2. 自定义性能监控 **性能追踪**: ```javascript export async function getServerSideProps() { const start = Date.now(); try { const data = await fetchData(); const duration = Date.now() - start; // 记录性能指标 console.log(`Data fetch duration: ${duration}ms`); return { props: { data } }; } catch (error) { console.error('Error fetching data:', error); return { props: { error: true } }; } } ``` ### 调试技巧 #### 1. 本地调试 **使用 Vercel CLI 本地开发**: ```bash # 启动本地开发服务器 vercel dev # 模拟生产环境 vercel dev --production ``` **本地环境变量**: ```bash # 拉取环境变量 vercel env pull .env.local # 推送环境变量 vercel env push .env.local ``` #### 2. 远程调试 **使用日志调试**: ```javascript export default async function handler(req, res) { console.log('Request received:', req.method, req.url); console.log('Request body:', req.body); try { const result = await processData(req.body); console.log('Processing result:', result); res.status(200).json(result); } catch (error) { console.error('Processing error:', error); res.status(500).json({ error: error.message }); } } ``` #### 3. 性能分析 **使用 Chrome DevTools**: - Network 面板分析请求 - Performance 面板分析性能 - Memory 面板分析内存使用 **使用 Lighthouse**: - 运行性能审计 - 识别性能瓶颈 - 获取优化建议 ### 告警和通知 #### 1. 部署失败告警 **配置告警**: - 在 Vercel Dashboard 中设置 - 通过邮件通知 - 通过 Slack 通知 - 通过 Webhook 通知 **设置步骤**: 1. 进入项目设置 2. 选择 "Notifications" 3. 配置告警规则 4. 设置通知渠道 #### 2. 错误率告警 **监控错误率**: - 设置错误率阈值 - 配置告警触发条件 - 定义通知频率 **集成第三方服务**: - PagerDuty - Opsgenie - VictorOps #### 3. 性能告警 **Web Vitals 告警**: - LCP 阈值告警 - FID 阈值告警 - CLS 阈值告警 **自定义性能指标**: - API 响应时间 - 数据库查询时间 - 函数执行时间 ### 最佳实践 #### 1. 日志记录 **结构化日志**: ```javascript export default async function handler(req, res) { const logData = { timestamp: new Date().toISOString(), method: req.method, url: req.url, userId: req.headers['x-user-id'], }; console.log(JSON.stringify(logData)); try { const result = await processRequest(req); console.log(JSON.stringify({ ...logData, status: 'success' })); res.status(200).json(result); } catch (error) { console.error(JSON.stringify({ ...logData, status: 'error', error: error.message })); res.status(500).json({ error: 'Internal Server Error' }); } } ``` **日志级别**: - Error:严重错误 - Warning:警告信息 - Info:一般信息 - Debug:调试信息 #### 2. 错误处理 **全局错误处理**: ```javascript // pages/_error.js export default function Error({ statusCode }) { return ( <div> <h1>Error: {statusCode}</h1> <p>Something went wrong</p> </div> ); } Error.getInitialProps = ({ res, err }) => { const statusCode = res ? res.statusCode : err ? err.statusCode : 404; return { statusCode }; }; ``` **API 错误处理**: ```javascript export default async function handler(req, res) { try { // 验证请求 if (!req.body) { return res.status(400).json({ error: 'Request body is required' }); } // 处理请求 const result = await processRequest(req.body); res.status(200).json(result); } catch (error) { // 记录错误 console.error('API Error:', error); // 返回适当的错误响应 if (error instanceof ValidationError) { return res.status(400).json({ error: error.message }); } if (error instanceof AuthenticationError) { return res.status(401).json({ error: 'Unauthorized' }); } // 默认错误响应 res.status(500).json({ error: 'Internal Server Error' }); } } ``` #### 3. 监控和分析 **定期审查日志**: - 每日检查错误日志 - 分析错误模式 - 识别潜在问题 - 制定改进计划 **性能监控**: - 监控关键指标 - 设置性能基线 - 识别性能退化 - 优化慢速端点 **用户反馈**: - 收集用户错误报告 - 分析用户行为 - 改进用户体验 - 优先处理影响用户的问题 ### 故障排除流程 #### 1. 问题识别 **症状识别**: - 用户报告问题 - 监控告警触发 - 日志显示错误 - 性能指标下降 #### 2. 问题诊断 **收集信息**: - 查看相关日志 - 检查错误堆栈 - 分析性能数据 - 复现问题 #### 3. 问题解决 **实施修复**: - 修复代码 - 更新配置 - 优化性能 - 测试修复 #### 4. 验证和监控 **验证修复**: - 部署修复 - 测试功能 - 监控日志 - 确认问题解决 ### 总结 Vercel 的错误处理和日志管理提供了: 1. **全面的日志记录**:构建、运行时、访问日志 2. **强大的错误追踪**:集成第三方错误追踪服务 3. **实时监控**:性能指标和错误率监控 4. **灵活的告警**:多种通知渠道和告警规则 5. **便捷的调试工具**:本地和远程调试支持 通过有效利用这些功能,开发者可以快速识别和解决问题,提高应用的稳定性和可靠性。
服务端 · 2月21日 16:50
什么是 Vercel 及其核心功能?## 什么是 Vercel 及其核心功能? Vercel 是一个基于云的静态网站托管和部署平台,专为现代前端开发而设计。它提供了以下核心功能: ### 核心功能 1. **自动部署**:与 GitHub、GitLab、Bitbucket 等代码托管服务集成,当代码推送到仓库时自动触发构建和部署流程。 2. **全球 CDN**:利用全球分布的边缘网络,确保用户能够快速访问部署的网站,提供低延迟的访问体验。 3. **零配置部署**:支持多种前端框架(如 Next.js、React、Vue、Angular 等),无需复杂的配置即可实现自动化部署。 4. **预览环境**:为每个 Pull Request 或分支自动生成预览 URL,方便团队进行代码审查和测试。 5. **自定义域名**:支持绑定自定义域名,并自动配置 SSL 证书,确保网站安全访问。 6. **环境变量管理**:提供安全的环境变量管理功能,支持不同环境(开发、预览、生产)的变量配置。 7. **Serverless Functions**:支持部署无服务器函数,允许在 Vercel 平台上运行后端逻辑。 8. **边缘网络**:利用边缘计算能力,在离用户最近的节点执行代码,提升性能。 ### 技术特点 - 基于 HTTP/2 和 HTTP/3 协议,提供更快的加载速度 - 支持增量静态再生成(ISR)和静态站点生成(SSG) - 提供实时日志和性能监控 - 支持团队协作和权限管理 ### 适用场景 Vercel 特别适合以下场景: - 静态网站和单页应用(SPA) - Next.js 应用的部署 - Jamstack 架构项目 - 需要快速迭代和预览的项目 - 全球化部署需求的应用 ### 与传统部署的区别 传统部署通常需要手动配置服务器、设置 CI/CD 流程、管理 SSL 证书等,而 Vercel 将这些流程自动化,大大简化了部署流程,让开发者能够专注于代码本身而非基础设施管理。
服务端 · 2月21日 16:45
Vercel 的定价模式是怎样的?## Vercel 的定价模式是怎样的? Vercel 提供了灵活的定价模式,从免费计划到企业级解决方案,满足不同规模团队和项目的需求。了解 Vercel 的定价结构对于选择合适的计划和控制成本非常重要。 ### 免费计划(Hobby) #### 适用对象 - 个人开发者 - 学习和实验项目 - 小型个人网站 - 开源项目 #### 包含功能 **部署功能**: - 无限项目数量 - 无限部署次数 - 自动 Git 集成 - 预览部署(无限) - 生产部署(无限) **性能特性**: - 100GB 带宽/月 - 6,000 分钟构建时间/月 - 100GB-Hours Serverless Functions - 全球 CDN - 自动 SSL 证书 **开发工具**: - 实时日志 - 错误追踪 - 部署历史 - 环境变量管理 - 团队协作(最多 1 人) **限制**: - 无团队协作功能 - 无优先支持 - 无高级分析 - 无自定义区域 ### Pro 计划 #### 适用对象 - 专业开发者 - 小型团队 - 商业项目 - 需要更多资源的个人项目 #### 价格 - **个人 Pro**:$20/月 - **团队 Pro**:$20/用户/月 #### 包含功能 **部署功能**: - 所有免费计划功能 - 1TB 带宽/月 - 10,000 分钟构建时间/月 - 1,000GB-Hours Serverless Functions - 无限团队成员 **性能特性**: - 更快的构建速度 - 优先队列处理 - 自定义区域选择 - 更长的函数执行时间(60 秒) - 更大的函数内存(最高 3008 MB) **开发工具**: - 高级分析 - 性能监控 - 错误追踪集成 - Slack 通知 - 更详细的日志 **团队功能**: - 团队协作 - 权限管理 - SSO(单点登录) - 审计日志 - 项目共享 **支持**: - 邮件支持(24 小时响应) - Discord 社区支持 - 文档访问 ### Enterprise 计划 #### 适用对象 - 大型企业 - 高流量网站 - 需要定制化解决方案 - 有合规性要求的组织 #### 价格 - 定制定价 - 需要联系销售团队 #### 包含功能 **部署功能**: - 所有 Pro 计划功能 - 无限带宽 - 无限构建时间 - 无限 Serverless Functions - 自定义 SLA - 专属基础设施 **性能特性**: - 最高性能保证 - 自定义区域部署 - 专属边缘节点 - 更长的函数执行时间(可协商) - 更大的函数内存(可协商) **安全与合规**: - SOC 2 Type II 合规 - HIPAA 合规(可选) - SSO/SAML - IP 白名单 - 数据驻留选项 - 高级安全功能 **团队功能**: - 无限团队成员 - 高级权限管理 - 组织级管理 - 审计日志 - 合规报告 **支持**: - 专属客户成功经理 - 24/7 优先支持 - 技术顾问 - 培训和入职支持 - 定期业务审查 ### 按需付费功能 #### 超出配额的使用 **带宽**: - Pro 计划:$40/100GB - Enterprise:包含无限带宽 **构建时间**: - Pro 计划:$0.10/分钟 - Enterprise:包含无限构建时间 **Serverless Functions**: - Pro 计划:$0.60/GB-Hour - Enterprise:包含无限 Functions #### 额外功能 **自定义域名**: - 免费:无限自定义域名 - SSL 证书:免费自动颁发 **团队协作**: - Pro 计划:$20/用户/月 - Enterprise:包含无限用户 ### 成本优化策略 #### 1. 合理使用资源 **监控使用情况**: - 定期检查 Dashboard 中的使用统计 - 设置使用量告警 - 分析资源使用模式 **优化构建时间**: - 利用 Vercel 的缓存机制 - 使用增量构建 - 优化依赖安装 **减少函数调用**: - 实现缓存策略 - 使用 CDN 缓存 - 优化 API 设计 #### 2. 选择合适的计划 **评估需求**: - 估算带宽使用量 - 评估构建时间需求 - 考虑团队规模 - 分析性能要求 **从免费开始**: - 先使用免费计划 - 监控实际使用情况 - 根据需要升级 #### 3. 利用免费额度 **预览部署**: - 充分利用无限预览部署 - 在合并前测试所有更改 - 减少生产环境问题 **缓存策略**: - 合理配置 CDN 缓存 - 使用 ISR 减少函数调用 - 实现客户端缓存 ### 计划对比 | 功能 | Hobby | Pro | Enterprise | |------|-------|-----|------------| | 价格 | 免费 | $20/月 | 定制 | | 带宽 | 100GB/月 | 1TB/月 | 无限 | | 构建时间 | 6,000 分钟/月 | 10,000 分钟/月 | 无限 | | Serverless Functions | 100GB-Hours | 1,000GB-Hours | 无限 | | 团队成员 | 1 人 | 无限 | 无限 | | 自定义域名 | 无限 | 无限 | 无限 | | SSL 证书 | 自动 | 自动 | 自动 | | 预览部署 | 无限 | 无限 | 无限 | | 自定义区域 | ❌ | ✅ | ✅ | | 优先支持 | ❌ | ✅ | ✅ | | SSO | ❌ | ✅ | ✅ | | 审计日志 | ❌ | ✅ | ✅ | | SLA | ❌ | 99.95% | 99.99%+ | ### 计费周期 #### 月度计费 - 按月计费 - 灵活取消 - 适合短期项目 #### 年度计费 - 享受折扣(通常 10-20%) - 一次性支付 - 适合长期项目 ### 免费试用 #### Pro 计划试用 - 14 天免费试用 - 无需信用卡 - 包含所有 Pro 功能 - 试用期结束后自动降级 #### Enterprise 试用 - 需要联系销售 - 定制试用方案 - 包含专属支持 ### 付款方式 #### 支持的付款方式 - 信用卡(Visa、MasterCard、American Express) - 借记卡 - PayPal(部分地区) - 银行转账(Enterprise) #### 发票 - 自动生成发票 - PDF 格式下载 - 发送到注册邮箱 - 支持自定义发票信息(Enterprise) ### 常见问题 #### Q1: 可以随时更改计划吗? A: 是的,可以随时升级或降级计划。升级立即生效,降级在下一个计费周期生效。 #### Q2: 超出配额会发生什么? A: 超出配额后,服务会继续运行,但会按使用量计费。可以设置使用上限以避免意外费用。 #### Q3: 免费计划适合生产环境吗? A: 免费计划可以用于小型生产项目,但有限制。对于商业项目,建议使用 Pro 或 Enterprise 计划。 #### Q4: 如何监控使用情况? A: 在 Vercel Dashboard 的 "Usage" 页面可以查看详细的使用统计和成本分析。 #### Q5: 可以暂停项目吗? A: 可以暂停项目以停止产生费用。暂停的项目不会产生带宽和函数使用费用。 ### 成本估算示例 #### 小型博客网站 - 月访问量:10,000 - 带宽使用:约 5GB - 构建次数:约 10 次 - **推荐计划**:Hobby(免费) #### 中型电商网站 - 月访问量:100,000 - 带宽使用:约 50GB - 构建次数:约 50 次 - Serverless Functions:约 200GB-Hours - **推荐计划**:Pro($20/月) #### 大型企业应用 - 月访问量:1,000,000+ - 带宽使用:500GB+ - 构建次数:200+ - Serverless Functions:1,000GB-Hours+ - **推荐计划**:Enterprise(定制) ### 节省成本的技巧 #### 1. 优化资源使用 - 压缩图片和静态资源 - 使用 CDN 缓存 - 实现代码分割 - 优化数据库查询 #### 2. 利用免费功能 - 使用预览部署进行测试 - 利用无限自定义域名 - 使用自动 SSL 证书 - 利用免费的分析工具 #### 3. 团队协作优化 - 合理分配团队成员 - 使用项目共享功能 - 定期审查访问权限 - 利用 SSO 简化管理 #### 4. 监控和告警 - 设置使用量告警 - 定期审查账单 - 分析成本趋势 - 优化高成本项目 ### 总结 Vercel 的定价模式提供了: 1. **灵活性**:从免费到企业级,满足不同需求 2. **透明度**:清晰的价格和配额 3. **可预测性**:按月计费,易于预算 4. **可扩展性**:随着业务增长轻松升级 5. **价值导向**:付费计划提供更多功能和更好的支持 选择合适的计划需要综合考虑项目规模、团队大小、性能要求和预算。建议从免费计划开始,根据实际使用情况逐步升级。
服务端 · 2月21日 16:45
Vercel 的部署流程是怎样的?## Vercel 的部署流程是怎样的? Vercel 的部署流程设计得非常简洁高效,从代码提交到网站上线通常只需要几分钟时间。以下是详细的部署流程说明: ### 部署触发方式 #### 1. Git 集成部署(推荐) 这是最常用的部署方式,通过连接代码仓库实现自动化部署: **支持的代码托管平台**: - GitHub - GitLab - Bitbucket **部署触发条件**: - 推送代码到主分支(触发生产部署) - 创建或更新 Pull Request(触发预览部署) - 推送代码到其他分支(触发预览部署) **设置步骤**: 1. 在 Vercel Dashboard 中创建新项目 2. 选择导入 Git 仓库 3. 授权 Vercel 访问你的代码仓库 4. 选择要部署的仓库和分支 5. 配置构建设置(通常自动检测) 6. 点击 "Deploy" 完成首次部署 #### 2. Vercel CLI 部署 使用命令行工具进行手动部署: ```bash # 安装 Vercel CLI npm i -g vercel # 登录 Vercel vercel login # 部署到预览环境 vercel # 部署到生产环境 vercel --prod # 部署特定目录 vercel --path ./dist ``` #### 3. API 部署 通过 Vercel API 进行程序化部署: ```javascript const { createDeployment } = require('@vercel/client'); const deployment = await createDeployment({ token: process.env.VERCEL_TOKEN, path: './dist', projectSettings: { projectName: 'my-project' } }); ``` ### 部署流程详解 #### 阶段 1:代码拉取 1. Vercel 从 Git 仓库拉取最新代码 2. 检查 `.gitignore` 文件,排除不需要的文件 3. 解析项目的依赖关系 #### 阶段 2:依赖安装 1. **检测包管理器**:自动检测项目使用的包管理器(npm、yarn、pnpm) 2. **安装依赖**:运行相应的安装命令 - npm: `npm install` - yarn: `yarn install` - pnpm: `pnpm install` 3. **缓存优化**:Vercel 会缓存 `node_modules` 以加速后续部署 #### 阶段 3:构建过程 1. **构建命令执行**:运行配置的构建命令 - 默认:`npm run build` - 可在 `vercel.json` 中自定义 2. **框架检测**:识别项目使用的框架并应用优化 3. **静态资源生成**:生成 HTML、CSS、JavaScript 等静态文件 4. **代码分割**:自动进行代码分割以优化加载性能 #### 阶段 4:部署上传 1. **文件上传**:将构建产物上传到 Vercel 的边缘网络 2. **CDN 分发**:将文件分发到全球各地的边缘节点 3. **缓存配置**:配置适当的缓存策略 #### 阶段 5:域名配置 1. **SSL 证书**:自动配置和更新 SSL 证书(Let's Encrypt) 2. **域名解析**:配置 DNS 记录 3. **自定义域名**:如果配置了自定义域名,进行相应的 DNS 设置 ### 预览部署 vs 生产部署 #### 预览部署(Preview Deployments) **特点**: - 为每个 Pull Request 或分支生成唯一的 URL - URL 格式:`https://project-name-branch-name.vercel.app` - 自动更新:每次推送都会更新预览部署 - 独立环境:使用预览环境的环境变量 **用途**: - 代码审查 - 功能测试 - 团队协作 - 客户演示 #### 生产部署(Production Deployments) **特点**: - 部署到主域名 - URL 格式:`https://project-name.vercel.app` 或自定义域名 - 使用生产环境的环境变量 - 更严格的构建检查 **触发条件**: - 代码合并到主分支 - 手动触发生产部署 - 使用 `vercel --prod` 命令 ### 部署优化策略 #### 1. 构建缓存 Vercel 自动缓存以下内容以加速构建: - `node_modules` 目录 - 构建产物 - 依赖下载 #### 2. 增量构建 对于支持的项目,Vercel 可以进行增量构建: - 只重新构建修改的页面 - 复用未改变的构建产物 - 大幅减少构建时间 #### 3. 并行构建 Vercel 支持并行构建多个项目或部署: - 同时处理多个 Pull Request - 并行执行构建步骤 - 提高团队开发效率 ### 部署监控和日志 #### 1. 实时日志 Vercel 提供实时的构建和部署日志: - 查看构建过程的每一步 - 识别构建错误 - 监控部署进度 #### 2. 部署历史 可以查看所有历史部署: - 部署时间 - 部署状态 - 部署者信息 - Git commit 信息 #### 3. 错误通知 当部署失败时,Vercel 会: - 在 Dashboard 中显示错误信息 - 发送邮件通知(如果配置) - 在 Slack 或其他集成工具中通知 ### 常见问题和解决方案 #### 1. 构建失败 **常见原因**: - 依赖版本冲突 - 构建命令错误 - 环境变量缺失 - 内存不足 **解决方案**: - 检查构建日志找出具体错误 - 确保所有依赖正确安装 - 验证环境变量配置 - 增加函数内存限制 #### 2. 部署超时 **原因**: - 构建时间过长 - 网络问题 - 资源限制 **解决方案**: - 优化构建流程 - 使用增量构建 - 检查网络连接 - 升级到付费计划获得更长构建时间 #### 3. 部署后页面 404 **原因**: - 输出目录配置错误 - 路由配置问题 - 文件未正确生成 **解决方案**: - 检查 `outputDirectory` 配置 - 验证路由设置 - 确认构建产物包含所有必要文件 ### 最佳实践 #### 1. 使用预览部署 - 在合并代码前 always 使用预览部署进行测试 - 为每个功能分支创建预览部署 - 在 Pull Request 中分享预览 URL #### 2. 配置正确的构建命令 - 确保 `package.json` 中有正确的 `build` 脚本 - 使用生产环境构建(如 `NODE_ENV=production`) - 优化构建输出大小 #### 3. 管理环境变量 - 为不同环境配置不同的环境变量 - 不要在代码中硬编码敏感信息 - 定期更新和轮换 API 密钥 #### 4. 监控部署状态 - 设置部署失败通知 - 定期检查部署日志 - 使用 Vercel Analytics 监控性能 #### 5. 优化构建时间 - 利用 Vercel 的缓存机制 - 使用增量静态再生成(ISR) - 避免不必要的构建步骤
服务端 · 2月21日 16:45
Vercel 的 Edge Functions 和 Serverless Functions 有什么区别?## Vercel 的 Edge Functions 和 Serverless Functions 有什么区别? Vercel 提供了两种主要的计算服务:Edge Functions 和 Serverless Functions。虽然它们都用于运行后端代码,但在架构、性能、使用场景等方面有显著差异。理解这些区别对于选择合适的计算服务至关重要。 ### Serverless Functions #### 定义和架构 **什么是 Serverless Functions**: - 运行在 Vercel 的无服务器计算平台上 - 基于 AWS Lambda 或类似技术 - 支持长时间运行的计算任务 - 适合处理复杂的业务逻辑 **架构特点**: - 分布式服务器集群 - 冷启动时间较长(几百毫秒到几秒) - 更长的执行时间限制 - 更大的内存配额 - 支持完整的 Node.js 运行时 #### 特性 **执行环境**: - Node.js 运行时 - 支持所有 Node.js 模块 - 完整的文件系统访问(只读) - 支持数据库连接 - 支持外部 API 调用 **性能特点**: - 执行时间:最长 60 秒(Pro 计划) - 内存:最高 3008 MB(Pro 计划) - 冷启动:较慢(500ms - 3s) - 并发:受限于计划配额 **使用场景**: - 复杂的数据处理 - 长时间运行的 API - 数据库操作 - 文件处理 - 第三方 API 集成 #### 代码示例 ```javascript // pages/api/hello.js export default async function handler(req, res) { // 复杂的数据处理 const data = await fetchComplexData(); // 数据库操作 const result = await database.query(data); // 文件处理 const processed = await processFile(result); res.status(200).json({ data: processed }); } export const config = { maxDuration: 30, // 30 秒执行时间 memory: 2048, // 2GB 内存 }; ``` ### Edge Functions #### 定义和架构 **什么是 Edge Functions**: - 运行在 Vercel 的全球边缘网络上 - 基于 V8 JavaScript 引擎 - 极快的响应时间 - 适合处理轻量级、低延迟的任务 **架构特点**: - 全球分布的边缘节点 - 极快的冷启动时间(几毫秒) - 更短的执行时间限制 - 较小的内存配额 - 受限的运行时环境 #### 特性 **执行环境**: - Edge Runtime(基于 V8) - 支持标准的 Web API - 受限的 Node.js API - 不支持文件系统访问 - 不支持数据库连接池 **性能特点**: - 执行时间:最长 30 秒 - 内存:128 MB - 冷启动:极快(< 50ms) - 并发:高并发能力 **使用场景**: - 请求路由和重定向 - A/B 测试 - 地理位置路由 - 认证和授权 - 内容个性化 - 缓存控制 #### 代码示例 ```javascript // middleware.js import { NextResponse } from 'next/server'; import type { NextRequest } from 'next/server'; export const runtime = 'edge'; export function middleware(request: NextRequest) { // 极快的响应 const geo = request.geo; // 地理位置路由 if (geo?.country === 'CN') { return NextResponse.rewrite(new URL('/zh', request.url)); } // A/B 测试 const abTest = Math.random() > 0.5 ? 'A' : 'B'; const response = NextResponse.next(); response.cookies.set('ab-test', abTest); return response; } export const config = { matcher: '/((?!api|_next/static|_next/image|favicon.ico).*)', }; ``` ### 详细对比 #### 1. 性能对比 | 特性 | Serverless Functions | Edge Functions | |------|-------------------|----------------| | 冷启动时间 | 500ms - 3s | < 50ms | | 执行时间限制 | 60s (Pro) | 30s | | 内存限制 | 3008 MB (Pro) | 128 MB | | 响应延迟 | 中等 | 极低 | | 并发能力 | 中等 | 高 | #### 2. 运行时对比 | 特性 | Serverless Functions | Edge Functions | |------|-------------------|----------------| | 运行时 | Node.js | Edge Runtime (V8) | | Node.js API | 完整支持 | 受限支持 | | Web API | 支持 | 完整支持 | | 文件系统 | 只读访问 | 不支持 | | 数据库连接 | 支持 | 受限 | #### 3. 使用场景对比 | 场景 | Serverless Functions | Edge Functions | |------|-------------------|----------------| | 复杂计算 | ✅ 适合 | ❌ 不适合 | | 数据处理 | ✅ 适合 | ❌ 不适合 | | 请求路由 | ⚠️ 可以 | ✅ 最佳 | | A/B 测试 | ⚠️ 可以 | ✅ 最佳 | | 认证授权 | ⚠️ 可以 | ✅ 最佳 | | 文件处理 | ✅ 适合 | ❌ 不适合 | | API 集成 | ✅ 适合 | ⚠️ 受限 | ### 选择指南 #### 选择 Serverless Functions 的场景 **1. 需要长时间运行的任务** ```javascript // 处理大型数据集 export default async function handler(req, res) { const largeDataset = await fetchLargeDataset(); const processed = await processLargeData(largeDataset); res.status(200).json({ data: processed }); } export const config = { maxDuration: 60, // 需要更长的执行时间 }; ``` **2. 需要数据库操作** ```javascript import { PrismaClient } from '@prisma/client'; const prisma = new PrismaClient(); export default async function handler(req, res) { // 复杂的数据库查询 const users = await prisma.user.findMany({ include: { posts: true, comments: true, }, }); res.status(200).json({ users }); } ``` **3. 需要文件处理** ```javascript import formidable from 'formidable'; export default async function handler(req, res) { const form = formidable({ multiples: true }); const [fields, files] = await form.parse(req); // 处理上传的文件 const processed = await processFiles(files); res.status(200).json({ processed }); } ``` **4. 需要完整的 Node.js API** ```javascript import fs from 'fs/promises'; import path from 'path'; export default async function handler(req, res) { // 使用 Node.js 文件系统 const filePath = path.join(process.cwd(), 'data.json'); const data = await fs.readFile(filePath, 'utf-8'); res.status(200).json(JSON.parse(data)); } ``` #### 选择 Edge Functions 的场景 **1. 需要极快响应的路由** ```javascript // middleware.js import { NextResponse } from 'next/server'; export const runtime = 'edge'; export function middleware(request: NextRequest) { // 极快的路由决策 if (request.nextUrl.pathname.startsWith('/api')) { return NextResponse.rewrite(new URL('/api-handler', request.url)); } return NextResponse.next(); } ``` **2. 需要地理位置路由** ```javascript export function middleware(request: NextRequest) { const geo = request.geo; // 基于地理位置的路由 if (geo?.country === 'US') { return NextResponse.rewrite(new URL('/us', request.url)); } else if (geo?.country === 'CN') { return NextResponse.rewrite(new URL('/zh', request.url)); } return NextResponse.next(); } ``` **3. 需要 A/B 测试** ```javascript export function middleware(request: NextRequest) { // A/B 测试逻辑 const variant = Math.random() > 0.5 ? 'A' : 'B'; const response = NextResponse.next(); response.cookies.set('ab-variant', variant); // 根据变体修改响应 if (variant === 'B') { response.headers.set('X-Experiment', 'B'); } return response; } ``` **4. 需要认证和授权** ```javascript export function middleware(request: NextRequest) { const token = request.cookies.get('auth-token'); // 快速认证检查 if (!token) { return NextResponse.redirect(new URL('/login', request.url)); } // 验证 token const isValid = verifyToken(token.value); if (!isValid) { return NextResponse.redirect(new URL('/login', request.url)); } return NextResponse.next(); } ``` ### 混合使用策略 #### 1. 分层架构 **Edge Functions 处理路由和认证**: ```javascript // middleware.js export function middleware(request: NextRequest) { // 快速路由和认证 if (!isAuthenticated(request)) { return NextResponse.redirect(new URL('/login', request.url)); } return NextResponse.next(); } ``` **Serverless Functions 处理业务逻辑**: ```javascript // pages/api/data.js export default async function handler(req, res) { // 复杂的业务逻辑 const data = await processBusinessLogic(req.body); res.status(200).json({ data }); } ``` #### 2. 缓存策略 **Edge Functions 处理缓存**: ```javascript export function middleware(request: NextRequest) { const cacheKey = request.url; // 检查缓存 const cached = cache.get(cacheKey); if (cached) { return new Response(cached, { headers: { 'X-Cache': 'HIT' } }); } return NextResponse.next(); } ``` **Serverless Functions 生成数据**: ```javascript export default async function handler(req, res) { // 生成数据 const data = await generateData(); // 设置缓存头 res.setHeader('Cache-Control', 'public, max-age=3600'); res.status(200).json(data); } ``` ### 性能优化建议 #### 1. Serverless Functions 优化 **减少冷启动**: - 保持函数热状态 - 使用连接池 - 优化依赖加载 - 使用预编译 **优化执行时间**: - 避免长时间运行的任务 - 使用异步处理 - 优化数据库查询 - 使用缓存 #### 2. Edge Functions 优化 **极简代码**: - 只包含必要的逻辑 - 避免复杂的计算 - 使用轻量级依赖 - 优化代码大小 **利用缓存**: - 使用 KV 存储 - 实现智能缓存 - 设置合理的缓存时间 - 使用 CDN 缓存 ### 成本考虑 #### 1. Serverless Functions 成本 **计费方式**: - 按执行时间计费 - 按内存使用计费 - 按请求次数计费 **成本优化**: - 优化执行时间 - 减少内存使用 - 实现缓存策略 - 批量处理请求 #### 2. Edge Functions 成本 **计费方式**: - 按请求次数计费 - 按执行时间计费 **成本优化**: - 减少不必要的 Edge Functions - 优化代码逻辑 - 使用缓存减少调用 - 合理使用路由规则 ### 最佳实践 #### 1. 架构设计 **分层设计**: - Edge Functions:路由、认证、缓存 - Serverless Functions:业务逻辑、数据处理 - 数据库:数据存储和查询 **职责分离**: - 每个函数只做一件事 - 避免过度复杂 - 便于测试和维护 #### 2. 监控和调试 **性能监控**: - 监控执行时间 - 监控冷启动时间 - 监控错误率 - 监控资源使用 **日志记录**: - 记录关键操作 - 记录错误信息 - 记录性能指标 - 使用结构化日志 #### 3. 测试策略 **单元测试**: - 测试函数逻辑 - 测试边界条件 - 测试错误处理 **集成测试**: - 测试函数间交互 - 测试数据库集成 - 测试 API 集成 **性能测试**: - 测试响应时间 - 测试并发能力 - 测试冷启动时间 ### 总结 **Serverless Functions 适合**: - 复杂的业务逻辑 - 长时间运行的任务 - 数据库操作 - 文件处理 - 需要完整 Node.js API **Edge Functions 适合**: - 极快响应的路由 - 地理位置路由 - A/B 测试 - 认证和授权 - 内容个性化 - 缓存控制 **最佳实践**: - 根据需求选择合适的函数类型 - 混合使用两种函数类型 - 实现分层架构 - 优化性能和成本 - 持续监控和改进 通过理解 Serverless Functions 和 Edge Functions 的区别,开发者可以更好地设计应用架构,选择合适的计算服务,实现最佳的性能和成本效益。
服务端 · 2月21日 16:45
如何在 Vercel 上配置自定义域名和 SSL 证书?## 如何在 Vercel 上配置自定义域名和 SSL 证书? 在 Vercel 上配置自定义域名和 SSL 证书是一个简单直接的过程,Vercel 提供了自动化的 SSL 证书管理,使得这一过程变得非常便捷。 ### 自定义域名配置 #### 1. 添加自定义域名 **通过 Vercel Dashboard 添加**: 1. 登录 Vercel Dashboard 2. 选择你的项目 3. 进入 "Settings" → "Domains" 4. 点击 "Add Domain" 5. 输入你的域名(如 `example.com` 或 `www.example.com`) 6. 选择域名类型: - **Production**:用于生产环境 - **Preview**:用于预览部署 **通过 Vercel CLI 添加**: ```bash # 添加生产域名 vercel domains add example.com # 添加预览域名 vercel domains add preview.example.com --preview ``` #### 2. 域名类型 Vercel 支持以下域名类型: **根域名**: - `example.com` - 需要配置 A 记录或 CNAME 别名记录 **子域名**: - `www.example.com` - `blog.example.com` - `api.example.com` - 使用 CNAME 记录 **通配符域名**: - `*.example.com` - 匹配所有子域名 - 需要付费计划 #### 3. DNS 配置 **配置步骤**: 1. 在 Vercel Dashboard 中查看 DNS 配置要求 2. 登录你的域名注册商(如 GoDaddy、Namecheap、Cloudflare) 3. 根据类型添加相应的 DNS 记录 **A 记录配置**(用于根域名): ``` Type: A Name: @ Value: 76.76.21.21 TTL: 3600 (或默认值) ``` **CNAME 记录配置**(用于子域名): ``` Type: CNAME Name: www Value: cname.vercel-dns.com TTL: 3600 (或默认值) ``` **使用 Cloudflare 时的特殊配置**: 如果你使用 Cloudflare 作为 DNS 提供商,需要注意: 1. **代理模式**: - 启用 Cloudflare 代理(橙色云朵)时,Vercel 可能无法正确验证域名所有权 - 建议先禁用代理(灰色云朵),等待验证通过后再启用 2. **SSL 模式**: - 设置为 "Full" 或 "Full (strict)" - 不要使用 "Flexible" 模式 #### 4. 域名验证 **验证过程**: 1. 添加 DNS 记录后,Vercel 会自动验证域名配置 2. 验证通常需要几分钟到几小时(取决于 DNS 传播) 3. 验证成功后,域名状态会显示为 "Valid Configuration" **验证检查**: ```bash # 检查 DNS 记录是否生效 dig example.com # 检查 CNAME 记录 dig www.example.com CNAME # 检查 DNS 传播 nslookup example.com ``` ### SSL 证书配置 #### 1. 自动 SSL 证书 Vercel 使用 Let's Encrypt 自动为你的域名提供 SSL 证书: **特点**: - 完全免费 - 自动续期 - 支持 HTTP/2 和 HTTP/3 - 自动配置 **证书类型**: - **单域名证书**:保护单个域名 - **通配符证书**:保护主域名及其所有子域名(需要付费计划) #### 2. SSL 证书自动管理 **自动颁发**: - 域名验证通过后,Vercel 自动颁发 SSL 证书 - 通常在几分钟内完成 - 无需手动操作 **自动续期**: - 证书到期前 30 天自动续期 - 无需担心证书过期 - 完全自动化 **证书监控**: - Vercel 持续监控证书状态 - 发现问题时自动修复 - 在 Dashboard 中可以查看证书详情 #### 3. 强制 HTTPS **自动重定向**: Vercel 默认将所有 HTTP 请求重定向到 HTTPS: ```javascript // 在 vercel.json 中配置 { "redirects": [ { "source": "/:path*", "has": [ { "type": "host", "value": "example.com" } ], "destination": "https://example.com/:path*", "permanent": true } ] } ``` **HSTS 配置**: ```javascript { "headers": [ { "source": "/(.*)", "headers": [ { "key": "Strict-Transport-Security", "value": "max-age=31536000; includeSubDomains" } ] } ] } ``` ### 高级配置 #### 1. 多域名配置 **添加多个域名**: 1. 在 Domains 设置中逐个添加域名 2. 为每个域名配置 DNS 记录 3. 等待所有域名验证通过 **主域名设置**: ```javascript // 在 vercel.json 中设置主域名 { "name": "my-project", "alias": ["example.com", "www.example.com"] } ``` #### 2. 环境特定域名 **预览环境域名**: ```bash # 为预览部署添加特定域名 vercel domains add preview.example.com --preview ``` **开发环境域名**: ```bash # 为开发环境添加域名 vercel domains add dev.example.com --dev ``` #### 3. 自定义 404 页面 **配置自定义 404 页面**: ```javascript // 在 vercel.json 中配置 { "rewrites": [ { "source": "/404", "destination": "/custom-404.html" } ], "notFound": true } ``` ### 故障排除 #### 1. 域名验证失败 **常见原因**: - DNS 记录配置错误 - DNS 传播未完成 - 域名已被其他服务使用 - Cloudflare 代理模式问题 **解决方案**: 1. 检查 DNS 记录是否正确 2. 使用 DNS 检查工具验证记录 3. 等待 DNS 传播完成(最多 48 小时) 4. 如果使用 Cloudflare,暂时禁用代理 ```bash # 检查 DNS 记录 dig example.com +short # 检查 WHOIS 信息 whois example.com # 检查 DNS 传播 dig example.com @8.8.8.8 ``` #### 2. SSL 证书颁发失败 **常见原因**: - 域名验证未通过 - DNS 记录配置错误 - 防火墙阻止 Let's Encrypt 验证 - 域名已被其他证书使用 **解决方案**: 1. 确保域名验证通过 2. 检查 DNS 记录配置 3. 检查防火墙设置 4. 在 Dashboard 中手动触发证书重新颁发 #### 3. HTTPS 重定向不工作 **检查清单**: 1. 确认 SSL 证书已颁发 2. 检查 Vercel 配置中的重定向设置 3. 清除浏览器缓存 4. 使用隐私模式测试 ### 最佳实践 #### 1. 域名管理 - 使用版本控制管理域名配置 - 定期检查域名到期时间 - 为重要域名设置自动续费 - 保留域名访问权限的备份 #### 2. SSL 安全 - 启用 HSTS 以强制 HTTPS - 定期检查 SSL 证书状态 - 使用强密码保护域名账户 - 启用双因素认证 #### 3. 监控和告警 - 设置域名到期提醒 - 监控 SSL 证书状态 - 配置网站可用性监控 - 设置错误告警 #### 4. 性能优化 - 使用 CDN 加速静态资源 - 启用 HTTP/2 和 HTTP/3 - 优化 DNS 解析时间 - 使用现代 TLS 版本 ### 常见问题解答 #### Q1: 可以使用免费域名吗? A: 可以,Vercel 支持任何合法的域名,包括免费域名。但建议使用付费域名以获得更好的稳定性和支持。 #### Q2: SSL 证书有数量限制吗? A: 免费计划中,每个项目可以添加无限数量的域名,每个域名都会自动获得 SSL 证书。 #### Q3: 如何迁移现有域名到 Vercel? A: 1. 在 Vercel 中添加域名 2. 更新 DNS 记录指向 Vercel 3. 等待 DNS 传播 4. 验证配置正确 #### Q4: 可以使用自己的 SSL 证书吗? A: Vercel 不支持上传自定义 SSL 证书,必须使用 Vercel 自动颁发的 Let's Encrypt 证书。 #### Q5: 域名配置需要多长时间生效? A: 通常需要几分钟到几小时,最长可能需要 48 小时(DNS 传播时间)。 ### 总结 在 Vercel 上配置自定义域名和 SSL 证书的主要优势: 1. **自动化**:SSL 证书自动颁发和续期 2. **简单**:直观的配置界面 3. **免费**:Let's Encrypt SSL 证书完全免费 4. **安全**:自动 HTTPS 重定向 5. **可靠**:99.99% 的正常运行时间保证 通过遵循上述步骤和最佳实践,你可以轻松地在 Vercel 上配置自定义域名和 SSL 证书,为你的网站提供安全、专业的访问体验。
服务端 · 2月21日 16:28