Среда выполнения Edge и Node.js
В контексте Next.js среда выполнения (runtime) относится к набору библиотек, API и общей функциональности, доступной вашему коду во время выполнения.
На сервере есть две среды выполнения, в которых могут рендериться части вашего приложения:
- Среда выполнения Node.js (по умолчанию) имеет доступ ко всем API Node.js и совместимым пакетам из экосистемы.
- Среда выполнения Edge основана на Web API.
Различия сред выполнения
При выборе среды выполнения необходимо учитывать множество факторов. В этой таблице показаны основные различия. Для более детального анализа различий ознакомьтесь с разделами ниже.
Node | Serverless | Edge | |
---|---|---|---|
Холодный старт | / | ~250мс | Мгновенно |
HTTP-потоковая передача | Да | Да | Да |
Ввод-вывод | Все | Все | Только fetch |
Масштабируемость | / | Высокая | Наивысшая |
Безопасность | Обычная | Высокая | Высокая |
Задержка | Обычная | Низкая | Наименьшая |
npm-пакеты | Все | Все | Ограниченный набор |
Статический рендеринг | Да | Да | Нет |
Динамический рендеринг | Да | Да | Да |
Ревалидация данных с fetch | Да | Да | Да |
Среда выполнения Edge
В Next.js облегченная среда выполнения Edge представляет собой подмножество доступных API Node.js.
Среда выполнения Edge идеально подходит, если вам нужно доставлять динамический персонализированный контент с низкой задержкой с помощью небольших простых функций. Скорость среды выполнения Edge достигается за счет минимального использования ресурсов, но это может быть ограничивающим фактором во многих сценариях.
Например, код, выполняемый в среде выполнения Edge на Vercel, не может превышать от 1 МБ до 4 МБ. Этот лимит включает импортированные пакеты, шрифты и файлы и может варьироваться в зависимости от инфраструктуры развертывания.
Среда выполнения Node.js
Использование среды выполнения Node.js дает вам доступ ко всем API Node.js и всем npm-пакетам, которые от них зависят. Однако запуск происходит не так быстро, как при использовании среды выполнения Edge.
Развертывание приложения Next.js на сервере Node.js потребует управления, масштабирования и настройки вашей инфраструктуры. В качестве альтернативы вы можете рассмотреть развертывание приложения Next.js на бессерверной платформе, такой как Vercel, которая позаботится об этом за вас.
Бессерверная среда Node.js
Бессерверное решение идеально подходит, если вам нужно масштабируемое решение, способное обрабатывать более сложные вычислительные нагрузки, чем среда выполнения Edge. Например, с бессерверными функциями на Vercel общий размер вашего кода составляет 50 МБ, включая импортированные пакеты, шрифты и файлы.
Недостатком по сравнению с маршрутами, использующими Edge, является то, что бессерверным функциям могут потребоваться сотни миллисекунд для запуска перед началом обработки запросов. В зависимости от объема трафика вашего сайта это может происходить часто, так как функции не всегда находятся в "разогретом" состоянии.
Примеры
Настройка среды выполнения для сегмента
Вы можете указать среду выполнения для отдельных сегментов маршрута в вашем приложении Next.js. Для этого объявите переменную с именем runtime
и экспортируйте ее. Переменная должна быть строкой и иметь значение либо 'nodejs'
, либо 'edge'
.
В следующем примере показан сегмент маршрута страницы, который экспортирует runtime
со значением 'edge'
:
export const runtime = 'edge' // 'nodejs' (по умолчанию) | 'edge'
export const runtime = 'edge' // 'nodejs' (по умолчанию) | 'edge'
Вы также можете определить runtime
на уровне макета, что приведет к выполнению всех маршрутов под этим макетом в среде выполнения Edge:
export const runtime = 'edge' // 'nodejs' (по умолчанию) | 'edge'
export const runtime = 'edge' // 'nodejs' (по умолчанию) | 'edge'
Если среда выполнения сегмента не задана, будет использоваться среда выполнения nodejs
по умолчанию. Вам не нужно использовать опцию runtime
, если вы не планируете переходить со среды выполнения Node.js.
Полный список доступных API см. в документации Node.js и документации Edge. Обе среды выполнения также могут поддерживать потоковую передачу в зависимости от вашей инфраструктуры развертывания.