Среда выполнения Edge и Node.js

В контексте Next.js среда выполнения (runtime) — это набор библиотек, API и общих функций, доступных вашему коду во время выполнения.

На сервере есть две среды выполнения, в которых могут рендериться части вашего приложения:

  • Среда выполнения Node.js (по умолчанию) имеет доступ ко всем API Node.js и совместимым пакетам из экосистемы.
  • Среда выполнения Edge основана на Web API.

Различия сред выполнения

При выборе среды выполнения необходимо учитывать множество факторов. В этой таблице показаны основные различия. Для более детального анализа ознакомьтесь с разделами ниже.

NodeServerlessEdge
Холодный старт/ОбычныйНизкий
HTTP-стримингДаДаДа
Ввод-выводВсеВсеfetch
Масштабируемость/ВысокаяНаивысшая
БезопасностьОбычнаяВысокаяВысокая
ЗадержкаОбычнаяНизкаяНаименьшая
npm-пакетыВсеВсеОграниченный набор
Статический рендерингДаДаНет
Динамический рендерингДаДаДа
Ревалидация данных с fetchДаДаДа

Среда выполнения Edge

В Next.js облегчённая среда выполнения Edge — это подмножество доступных API Node.js.

Среда выполнения Edge идеально подходит, если вам нужно доставлять динамический персонализированный контент с низкой задержкой с помощью небольших простых функций. Скорость среды выполнения Edge достигается за счёт минимального использования ресурсов, но это может быть ограничивающим фактором во многих сценариях.

Например, код, выполняемый в среде выполнения Edge на Vercel, не может превышать от 1 МБ до 4 МБ. Этот лимит включает импортированные пакеты, шрифты и файлы и может варьироваться в зависимости от инфраструктуры развёртывания. Кроме того, среда выполнения Edge не поддерживает все API Node.js, что означает, что некоторые npm-пакеты могут не работать. Например, ошибки типа "Module not found: Can't resolve 'fs'" или подобные. Мы рекомендуем использовать среду выполнения Node.js, если вам нужны эти API или пакеты.

Среда выполнения 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 на уровне layout, что приведёт к выполнению всех маршрутов под этим layout в среде выполнения Edge:

export const runtime = 'edge' // 'nodejs' (по умолчанию) | 'edge'
export const runtime = 'edge' // 'nodejs' (по умолчанию) | 'edge'

Если среда выполнения сегмента не задана, будет использоваться среда выполнения nodejs по умолчанию. Вам не нужно использовать опцию runtime, если вы не планируете переходить со среды выполнения Node.js.

Полный список доступных API см. в документации Node.js и документации Edge. Обе среды выполнения также могут поддерживать стриминг в зависимости от вашей инфраструктуры развёртывания.