Разработка Serverless Functions для сайта (Vercel Functions)
Vercel Functions — это серверные функции, которые деплоятся вместе со статическим сайтом или Next.js-приложением. Никакой инфраструктуры: push в git → функция доступна через /api/....
Как устроены Vercel Functions
Файлы в директории api/ (для Vite/SPA) или app/api/ (для Next.js App Router) автоматически становятся серверными эндпоинтами. Поддерживаются Node.js, Edge Runtime, Python, Ruby, Go.
Пример: функция обратной связи
Файл api/contact.ts:
import type { VercelRequest, VercelResponse } from "@vercel/node";
import { Resend } from "resend";
const resend = new Resend(process.env.RESEND_API_KEY);
export default async function handler(req: VercelRequest, res: VercelResponse) {
if (req.method !== "POST") {
return res.status(405).json({ error: "Method not allowed" });
}
const { name, email, message } = req.body;
if (!name || !email || !message) {
return res.status(400).json({ error: "Missing fields" });
}
await resend.emails.send({
from: "[email protected]",
to: "[email protected]",
subject: `Новое сообщение от ${name}`,
text: `От: ${name} <${email}>\n\n${message}`,
});
return res.status(200).json({ ok: true });
}
Функция доступна по адресу https://your-site.vercel.app/api/contact.
Next.js App Router API Routes
// app/api/newsletter/route.ts
import { NextRequest, NextResponse } from "next/server";
export async function POST(request: NextRequest) {
const { email } = await request.json();
// Добавление в Mailchimp/SendGrid
const response = await fetch("https://api.mailchimp.com/3.0/lists/LIST_ID/members", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.MAILCHIMP_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ email_address: email, status: "subscribed" }),
});
if (!response.ok) {
return NextResponse.json({ error: "Subscription failed" }, { status: 400 });
}
return NextResponse.json({ ok: true });
}
Переменные окружения
В Vercel Dashboard → Settings → Environment Variables. Для локальной разработки — .env.local:
RESEND_API_KEY=re_...
DATABASE_URL=postgresql://...
Vercel автоматически не передаёт переменные с NEXT_PUBLIC_ на сервер — только на клиент. Серверные секреты не добавляйте с этим префиксом.
Лимиты бесплатного плана
- Максимальное время выполнения: 10 секунд (Hobby), 60 секунд (Pro)
- Размер ответа: 5 MB
- 100 GB-часов выполнения в месяц
- Регионы: один регион на Hobby, все регионы на Pro
Для большинства сайтов Hobby-плана достаточно.
Сроки
Базовые API-функции (форма, подписка, вебхук) — 1–2 дня, включая деплой и настройку переменных окружения.







