tgoop.com/super_oleg_dev/144
Last Update:
В комментариях к предыдущему посту подсветили тонкости работы React Server Components, что React делает основную работу с RSC (а не Next.js как я писал ранее) и хочется копнуть еще поглубже.
Сразу прикреплю ссылку на статью где хорошо и подробно разбирается механизм RSC (upd. местами out-of-date но концепции актуальны) - https://www.plasmic.app/blog/how-react-server-components-work
Что нам тут важно и еще не рассмотрели, это пакет react-server-dom-webpack - на сервере, импорт клиентского компонента заменяется на специальный сериализуемый объект, где присутствует ссылка на модуль вида `./src/ClientComponent.client.js`.
Для клиентского кода этот пакет содержит метод для реконструкции RSC формата в дерево React элементов.
Также, в имплементации Partial Prendering можно увидеть не один раз слово postponed.
По этому ключу вижу PR в React с Postpone API (механизм для работы с промисами в компонентах, которые могут быть зарезолвлены позже, по сути defer) и PR где мы видим работу над пререндером и возобновлением рендеринга, новые апишки prerender
и resume - в общем много интересных и сложных вещей на которые полагается Next и будут полагаться другие мета-фреймворки.
Собственно вот и код в Next где мы видим использование prerender метода и получение postponed данных, и рядом код с использованием resume метода который работает как раз с postponed компонентами.
postponed данные, возвращаемые методом prerender, содержат строку в формате RSC.
Итого, как работает PPR в Next.js:
На этапе сборки, для каждого роута Next вызывает react-dom/static prerender
(этот метод возвращает и AppShell и postponed дерево), и сохраняет полученную разметку в кэш. Также, в кэш сохраняется и полученное на этом этапе postponed RSC дерево компонентов, если вы будете собирать официальную демку, найдете postponed в кэшах с мета информацией о страницах, например файл .next/server/app/index.meta
.
В рантайме, Next проверяет есть ли страница (App Shell) в кэше, и если есть - отдает в стриме.
Затем, проверяет есть ли postponed дерево в кэше, если есть - комбинирует стрим ответа со стримом, который вернет react-dom/static resume(postponed)
.
Концептуально понятно и просто, изящно, и тут очень радует что большую часть работы все-таки делает фреймворк - React.
Конечно, у Next тут много своего кода и специфики, например как собирается дерево компонентов страниц и лэйаутов для рендеринга из сегментов, но никакой магии с вычислением отдельного отложенного React дерева на этом уровне нет.
До этого у меня был стереотип что React не будет так сильно залазить в сборку / серверную часть и гораздо больше всего остается на плечах мета-фреймворков.
Очень ждем, когда все эти механизмы выйдет из экспериментального статуса)
BY SuperOleg dev notes
Share with your friend now:
tgoop.com/super_oleg_dev/144