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