Наш опыт добавления Edge Runtime в Next.js SDK
SDK Next.js от Logto теперь поддерживает Edge Runtime. В этой статье, мы хотим делиться нашим приключением, смотреть на препятствия, с которыми мы столкнулись, как мы их преодолели, и на крутые вещи, которые мы узнали на пути.
Интродукция
Edge Runtime стало популярным в технологической сфере, обеспечивая динамическую, низкую задержку в различных платформах от AWS Lambda@Edge и Cloudflare Workers до Vercel Edge. Подчеркивая его важность, Vercel недавно изменил "experimental-edge" на просто "edge", сигнализируя официальную поддержку в их популярном фреймворке Next.js.
На Next.js SDK у нас серьезное следование, поэтому в Logto мы думали: "Почему бы не добавить поддержку Edge Runtime?" Поэтому мы перекатили рукава и просто в него прыгнули. В этой статье мы собираемся поделиться нашим приключением, рассмотреть препятствия, с которыми мы столкнулись, как мы их преодолели, и крутые вещи, которые мы узнали по дороге.
Переход модулей и зависимостей для поддержки Edge Runtime
Работа с Edge Runtime представляет собой некоторые уникальные вызовы, главным образом, потому что она не поддерживает все модули и зависимости, обычно используемые в Node.js. Мы столкнулись с этой проблемой с модулями crypto, lodash и iron-sessions, что потребовало некоторых инновационных обходных путей.
Crypto
В окружающей среде Node.js модуль crypto служит оболочкой для криптографических функций OpenSSL. К сожалению, Edge Runtime не поддерживает его. Но не волнуйтесь - большинство сред прогонки Edge спасают поддерживая Web Crypto API. Несмотря на некоторые незначительные различия, это надежная замена для модуля crypto. Например, для генерации случайных байтов:
И хеширование:
Lodash
Lodash является фаворитом сре ди многих разработчиков за его утилитарность, но Edge Runtime не является его фанатом. Наш обходной путь? Мы заменили функции Lodash на встроенные методы JavaScript, делая наш код эффективным и читаемым.
Хоть замена большинства функций Lodash и не была задачей Геракла, но она требовала некоторого внимания. Давайте посмотрим, как мы воссоздали утилиту "once" своим способом:
Iron Session
Последняя версия модуля iron-session дружественна к Edge Runtime, так что все, что нам нужно было сделать, это обновить нашу версию. Так просто!
Ориентирование в тонкостях "Response" в Edge Runtime
Другой вызов, с которым мы столкнулись при адаптации нашего SDK для Edge Runtime, связан с разницей в объекте "Response". Вот как мы преодолели эти различия:
Создание ответа вручную
В отличие от Node.js, запрос в Edge Runtime не поставляется с подготовленным ответом. Это означает, что нам нужно создать его самостоятельно, вызвав new Response()
, вот пример возвращения данных:
Отказ от "withIronSessionApiRoute"
В Edge Runtime Response.body
является доступным только для чтения. Это означает, что мы не смогли инициализировать ответ, прежде чем данные были подготовлены. В результате, нам пришлось отказаться от нашего доверенного "withIronSessionApiRoute" (вместе с другим промежуточным ПО).
Чтобы понять, что мы заменили, давайте сначала разберем, что же на самом деле делает withIronSessionApiRoute
:
- Он заглядывает в cookie, конструирует объект сессии и связывает его с
res
. - Он автоматически добавляет заголовок "set-cookie" к
res
, если произошло изменение сессии.
Так как же мы воспроизводили эту функциональность в нашем новом окружении Edge Runtime?
- Чтение: Мы использовали существующую функцию
getIronSession
. Давая ему пустой и фиктивныйresponse
, мы получали сессию по мере необходи мости. Это заменило метод "get" изreq.session
. - Запись: Мы заранее подготовили
response
с данными, затем использовалиgetIronSession
с этим экземпляромresponse
, чтобы получить объект сессии. Получив этот объект, мы могли изменить сессию по мере необходимости.
Перенаправление
Перенаправление в Edge Runtime требовало от нас ручного добавления заголовка Location
в наши ответы.
Один пакет, два среды выполнения
В этом нашем путешествии мы решили придерживаться одного пакета для поддержки обоих сред выполнения - Edge и Node.js.
Вот почему
Мы подумали о создании отдельного пакета для Edge, но быстро поняли, что это необязательно. Большинство нашего кода было общим для обоих сред выполнения, только несколько строк требовали корректировки. Кроме того, использование SDK остает ся почти одинаковым в обоих средах выполнения, поэтому поддержание единого пакета было наиболее разумным.
Вот что мы сделали
Вместо дублирования усилий, мы решили расширить существующий пакет. Мы добавили папку "edge" прямо в корень пакета, рядом со старой папкой "src". Затем мы обновили файл package.json, добавив новый путь в "exports". Таким образом, могут сосуществовать обе среды выполнения - Edge и Node.js - внутри одного пакета, без лишних хлопот.
Заключение
Вы можете проверить полный исходный код нашей части SDK Next.js edge здесь.
Делясь нашим путешествием включения Edge Runtime, мы надеемся вдохновить и направить других, исследующих похожие пути. Следите за новостями об обновлениях нашего SDK Next.js.