Edge Runtime

Next.js предоставляет две среды выполнения (runtime) для серверной части вашего приложения:

  • Node.js Runtime (по умолчанию) — имеет доступ ко всем API Node.js и используется для рендеринга приложения.
  • Edge Runtime — предоставляет ограниченный набор API и используется в Middleware.

Ограничения

  • Edge Runtime не поддерживает все API Node.js. Некоторые пакеты могут работать некорректно.
  • Edge Runtime не поддерживает инкрементальную статическую регенерацию (ISR).
  • Обе среды выполнения могут поддерживать потоковую передачу данных (streaming) в зависимости от используемого адаптера развёртывания.

Справочник API

Edge Runtime поддерживает следующие API:

Сетевые API

APIОписание
BlobПредставляет blob-объект
fetchПолучает ресурс
FetchEventПредставляет событие fetch
FileПредставляет файл
FormDataПредставляет данные формы
HeadersПредставляет HTTP-заголовки
RequestПредставляет HTTP-запрос
ResponseПредставляет HTTP-ответ
URLSearchParamsПредставляет параметры URL-запроса
WebSocketПредставляет WebSocket-соединение

API кодирования

APIОписание
atobДекодирует строку в формате base-64
btoaКодирует строку в base-64
TextDecoderДекодирует Uint8Array в строку
TextDecoderStreamЦепной декодер для потоков
TextEncoderКодирует строку в Uint8Array
TextEncoderStreamЦепной кодер для потоков

API потоков

APIОписание
ReadableStreamПредставляет читаемый поток
ReadableStreamBYOBReaderПредставляет читатель ReadableStream
ReadableStreamDefaultReaderПредставляет читатель ReadableStream
TransformStreamПредставляет преобразующий поток
WritableStreamПредставляет записываемый поток
WritableStreamDefaultWriterПредставляет писатель WritableStream

Криптографические API

APIОписание
cryptoПредоставляет доступ к криптографическим функциям платформы
CryptoKeyПредставляет криптографический ключ
SubtleCryptoПредоставляет доступ к криптографическим примитивам: хешированию, подписи, шифрованию и др.

Веб-стандартные API

APIОписание
AbortControllerПозволяет прерывать один или несколько DOM-запросов по необходимости
ArrayПредставляет массив значений
ArrayBufferПредставляет буфер бинарных данных фиксированной длины
AtomicsПредоставляет атомарные операции в виде статических методов
BigIntПредставляет целое число произвольной точности
BigInt64ArrayПредставляет типизированный массив 64-битных знаковых целых чисел
BigUint64ArrayПредставляет типизированный массив 64-битных беззнаковых целых чисел
BooleanПредставляет логическое значение (true или false)
clearIntervalОтменяет повторяющееся действие, установленное вызовом setInterval()
clearTimeoutОтменяет действие, запланированное вызовом setTimeout()
consoleПредоставляет доступ к консоли отладки браузера
DataViewПредставляет общее представление ArrayBuffer
DateПредставляет момент времени в платформонезависимом формате
decodeURIДекодирует URI, ранее созданный encodeURI или аналогичной функцией
decodeURIComponentДекодирует компонент URI, ранее созданный encodeURIComponent или аналогичной функцией
DOMExceptionПредставляет ошибку, возникшую в DOM
encodeURIКодирует URI, заменяя определенные символы escape-последовательностями UTF-8
encodeURIComponentКодирует компонент URI, заменяя определенные символы escape-последовательностями UTF-8
ErrorПредставляет ошибку при выполнении оператора или доступе к свойству
EvalErrorПредставляет ошибку, связанную с глобальной функцией eval()
Float32ArrayПредставляет типизированный массив 32-битных чисел с плавающей точкой
Float64ArrayПредставляет типизированный массив 64-битных чисел с плавающей точкой
FunctionПредставляет функцию
InfinityПредставляет математическое значение бесконечности
Int8ArrayПредставляет типизированный массив 8-битных знаковых целых чисел
Int16ArrayПредставляет типизированный массив 16-битных знаковых целых чисел
Int32ArrayПредставляет типизированный массив 32-битных знаковых целых чисел
IntlПредоставляет функциональность интернационализации и локализации
isFiniteОпределяет, является ли значение конечным числом
isNaNОпределяет, является ли значение NaN
JSONПредоставляет функциональность для преобразования значений JavaScript в формат JSON и обратно
MapПредставляет коллекцию значений, где каждое значение может встречаться только один раз
MathПредоставляет доступ к математическим функциям и константам
NumberПредставляет числовое значение
ObjectПредставляет базовый объект для всех объектов JavaScript
parseFloatПреобразует строку в число с плавающей точкой
parseIntПреобразует строку в целое число с указанным основанием системы счисления
PromiseПредставляет результат асинхронной операции (успешный или неудачный)
ProxyПозволяет определять кастомное поведение для базовых операций (поиск свойств, присваивание, перечисление, вызов функций и т.д.)
queueMicrotaskСтавит микрозадачу в очередь на выполнение
RangeErrorПредставляет ошибку, когда значение выходит за допустимые пределы
ReferenceErrorПредставляет ошибку обращения к несуществующей переменной
ReflectПредоставляет методы для перехватываемых операций JavaScript
RegExpПредставляет регулярное выражение для сопоставления последовательностей символов
SetПредставляет коллекцию уникальных значений
setIntervalВызывает функцию повторно с фиксированной задержкой между вызовами
setTimeoutВызывает функцию или выполняет выражение после указанной задержки
SharedArrayBufferПредставляет буфер бинарных данных фиксированной длины для совместного использования
StringПредставляет последовательность символов
structuredCloneСоздает глубокую копию значения
SymbolПредставляет уникальный и неизменяемый тип данных, используемый как ключ свойства объекта
SyntaxErrorПредставляет ошибку синтаксического анализа недопустимого кода
TypeErrorПредставляет ошибку, когда значение имеет неожиданный тип
Uint8ArrayПредставляет типизированный массив 8-битных беззнаковых целых чисел
Uint8ClampedArrayПредставляет типизированный массив 8-битных беззнаковых целых чисел, ограниченных диапазоном 0-255
Uint32ArrayПредставляет типизированный массив 32-битных беззнаковых целых чисел
URIErrorПредставляет ошибку неправильного использования функций обработки URI
URLПредоставляет статические методы для создания URL-объектов
URLPatternПредставляет шаблон URL
URLSearchParamsПредставляет коллекцию пар ключ/значение
WeakMapПредставляет коллекцию пар ключ/значение со слабыми ссылками на ключи
WeakSetПредставляет коллекцию объектов, где каждый объект может встречаться только один раз
WebAssemblyПредоставляет доступ к WebAssembly

Полифилы, специфичные для Next.js

Переменные окружения

Вы можете использовать process.env для доступа к переменным окружения как в next dev, так и в next build.

Неподдерживаемые API

Edge Runtime имеет некоторые ограничения, включая:

  • Нативные API Node.js не поддерживаются. Например, вы не можете читать или записывать файлы.
  • node_modules можно использовать, если они реализуют ES Modules и не используют нативные API Node.js.
  • Прямой вызов require запрещён. Вместо этого используйте ES Modules.

Следующие возможности JavaScript отключены и не будут работать:

APIОписание
evalВыполняет JavaScript-код, представленный в виде строки
new Function(evalString)Создаёт новую функцию с кодом, переданным в качестве аргумента
WebAssembly.compileКомпилирует модуль WebAssembly из буферного источника
WebAssembly.instantiateКомпилирует и инстанцирует модуль WebAssembly из буферного источника

В редких случаях ваш код может содержать (или импортировать) некоторые операторы динамической оценки кода, которые не могут быть достигнуты во время выполнения и не могут быть удалены с помощью tree shaking. Вы можете ослабить проверку, разрешив определённые файлы в конфигурации Middleware:

middleware.ts
export const config = {
  unstable_allowDynamic: [
    // разрешает один файл
    '/lib/utilities.js',
    // используйте glob для разрешения всего в стороннем модуле function-bind
    '**/node_modules/function-bind/**',
  ],
}

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

Имейте в виду, что если эти операторы будут выполнены на Edge, они вызовут ошибку во время выполнения.