раздел 04
Serverless-функции
Что это
Фронтенд - это то, что видит пользователь в браузере. Но часто нужен и бэкенд: код, который выполняется на сервере, прячет секретные ключи, ходит в базу или вызывает API нейросети. Раньше под это поднимали и обслуживали отдельный сервер. Serverless-функция - это кусочек бэкенд-кода, который вы просто кладёте в проект, а Vercel сам запускает его на запрос и сам гасит, когда не нужен. Своего сервера у вас нет - отсюда «serverless».
Зачем это вам
- Прячете секреты. Ключ к API нейросети нельзя держать в браузере. Запрос идёт в вашу функцию на сервере, она с ключом обращается к API - ключ остаётся скрытым.
- Никакого администрирования. Не настраиваете и не обслуживаете сервер. Функция живёт рядом с фронтендом в том же проекте.
- Платите за вызовы, а не за простой. Нет запросов - функция не работает и не тратит ресурсы.
Как это сделать
В большинстве фреймворков на Vercel это «положить файл в нужную папку»:
- В проекте есть папка для API-маршрутов (в Next.js - роуты внутри
app/api/...). - Кладёте туда файл-обработчик: он принимает запрос и возвращает ответ.
- На фронтенде делаете запрос на этот адрес (например,
/api/chat). - При деплое Vercel сам превращает файл в serverless-функцию - отдельно настраивать ничего не надо.
Когда это нужно
- Спрятать секретный ключ (вызов API нейросети, платёжки).
- Сходить в базу данных и не отдавать доступ к ней в браузер.
- Сделать любую логику, которая не должна выполняться на стороне клиента.
Пример
Чат с AI на вашем сайте. Если дёргать API нейросети прямо из браузера - ключ будет виден всем. Вместо этого делаете serverless-функцию /api/chat: браузер шлёт ей сообщение, функция на сервере с секретным ключом обращается к нейросети и возвращает ответ. Ключ не покидает сервер, отдельный бэкенд поднимать не пришлось.
Антипаттерны
- Звать платный API напрямую из браузера. Ключ утечёт. Прячьте за serverless-функцией.
- Пытаться держать в функции долгое тяжёлое вычисление. У serverless есть лимит времени выполнения; для долгих задач нужен другой подход.
- Полагаться на «память» между вызовами. Функция поднимается и гасится; постоянное состояние держите в базе, а не в самой функции.