Node.js 22 serverless-функции с нативными модулями и тёплыми пулами
Node.js 22 serverless-функции работают в изолированных контейнерах: вся экосистема npm, нативные аддоны и возможности ES2024 без ограничений V8-изолятов. Подключайте функции к HTTP-маршрутам, вебхукам или шагам пайплайна. Регулярные запуски настраиваются в расписании пайплайна из того же воркспейса.
Обновлено: 2026-06-28
Кратко
Суть ответа
Node.js 22 serverless-функции с нативными модулями и тёплыми пулами. Inquir запускает Node.js 22 в Docker-контейнерах — тот же Node.js, что у вас локально, с той же поддержкой нативных модулей. Объявите зависимости в package.json, подключите слои для нативных аддонов — артефакт деплоя соберёт платформа.
Когда подходит
- Обработчик использует нативные npm-пакеты (sharp, bcrypt, grpc), которым нужен настоящий контейнер Node.js.
- Нужно, чтобы HTTP API, обработчики вебхуков и пайплайны с фоновыми запусками и расписаниями использовали один каталог функций Node.js.
На что обратить внимание
- Lambda даёт полный Node.js, но стоимость эксплуатации связки API Gateway + CloudWatch + IAM-роли для небольшой команды ощутима.
- Edge-рантаймы быстры по всему миру, но вы теряете нативные модули и всё, чему нужно настоящее POSIX-окружение.
Нагрузка и где ломается
Где edge-рантаймы ограничивают Node.js
Edge-рантаймы (Cloudflare Workers, Vercel Edge Functions) запускают подмножество Node.js внутри V8-изолятов. Нативные аддоны вроде sharp, bcrypt и grpc-node, доступ к файловой системе, сабпроцессы и соединения с приватной сетью там ограничены или недоступны.
Платформы в стиле Lambda, как AWS Lambda, поддерживают полный Node.js, но требуют самостоятельно собрать API Gateway, EventBridge, CloudWatch и Layers, прежде чем первая функция увидит трафик.
Компромиссы
Чего не хватает и Lambda, и edge
Lambda даёт полный Node.js, но стоимость эксплуатации связки API Gateway + CloudWatch + IAM-роли для небольшой команды ощутима.
Edge-рантаймы быстры по всему миру, но вы теряете нативные модули и всё, чему нужно настоящее POSIX-окружение.
Как помогает Inquir
Полный Node.js 22 за одним шлюзом
Inquir запускает Node.js 22 в Docker-контейнерах — тот же Node.js, что у вас локально, с той же поддержкой нативных модулей. Объявите зависимости в package.json, подключите слои для нативных аддонов — артефакт деплоя соберёт платформа.
HTTP-маршруты, обработчики вебхуков и шаги пайплайнов вызывают одни и те же ID функций Node.js. Расписание запускает пайплайн, а его шаги используют эти функции. Один деплой, одна модель секретов, одна история выполнения.
Что вы получаете
Возможности рантайма Node.js 22
Вся экосистема npm
sharp, bcrypt, better-sqlite3, grpc, canvas и любой нативный аддон, который собирается под Node.js 22, работают без прослоек.
ES2024 и top-level await
Используйте свежие возможности ECMAScript, ESM-импорты и top-level await в обработчиках .mjs без транспиляции.
Тёплые контейнеры для постоянного трафика
Включите тёплые пулы, чтобы прогревать контейнеры Node.js, — это срезает задержку p99 на оживлённых HTTP-маршрутах и в циклах вызова инструментов агентами.
Шлюз и пайплайны вместе
Используйте одну функцию в HTTP-маршрутах и шагах пайплайнов. Пайплайны могут работать по расписанию или продолжать обработку в фоне.
Что дальше
Как задеплоить Node.js serverless-функцию
Написать обработчик
Экспортируйте async-функцию handler(event) из файла .mjs. Используйте ESM-импорты. Форма события совпадает с HTTP-событиями AWS Lambda для совместимости.
Объявить зависимости
Добавьте npm-пакеты в package.json. Нативные аддоны собираются при деплое; если пакету нужен отдельный шаг сборки, подключите слой. Dockerfile не требуется.
Подключить маршруты и шаги пайплайна
Привяжите функцию к HTTP-маршруту шлюза или шагу пайплайна. Расписание и фоновое выполнение настраиваются у пайплайна, который использует тот же обработчик.
Пример кода
HTTP-обработчик с нативным модулем
Шлюз передаёт событие в форме HTTP-запроса: path, headers, body (строка), queryStringParameters. Верните statusCode + body. Нативные модули вроде sharp работают, потому что рантайм — настоящий контейнер.
import sharp from 'sharp'; // native module — works in containers, not in edge isolates export async function handler(event) { const params = event.queryStringParameters ?? {}; const width = Number(params.width ?? 320); const height = Number(params.height ?? 240); if (!event.body) return { statusCode: 400, body: JSON.stringify({ error: 'body required' }) }; const input = Buffer.from(event.body, 'base64'); const resized = await sharp(input).resize(width, height).jpeg({ quality: 85 }).toBuffer(); return { statusCode: 200, headers: { 'Content-Type': 'image/jpeg' }, body: resized.toString('base64'), isBase64Encoded: true, }; }
Когда подходит
Когда Node.js 22 serverless-функции подходят лучше всего
Когда это уместно
- Обработчик использует нативные npm-пакеты (sharp, bcrypt, grpc), которым нужен настоящий контейнер Node.js.
- Нужно, чтобы HTTP API, обработчики вебхуков и пайплайны с фоновыми запусками и расписаниями использовали один каталог функций Node.js.
Когда лучше выбрать другое
- Крошечная логика на чистом JS, которой выгодно работать в сотнях edge-точек ради миллисекундной задержки по всему миру, — для этого возьмите edge-рантайм на V8-изолятах.
Частые вопросы
Частые вопросы
Какая версия Node.js в Inquir?
Node.js 22. Поддерживаются ESM (.mjs), CommonJS (.cjs) и TypeScript (компилируется перед деплоем).
Можно ли использовать ES-модули (import/export)?
Да. Назовите файлы .mjs или задайте "type": "module" в package.json. Top-level await в ESM-обработчиках работает.
Как принимать бинарные загрузки через шлюз?
Когда шлюз получает бинарное содержимое, тело приходит строкой в base64. Перед обработкой декодируйте его через Buffer.from(event.body, "base64").