-
Notifications
You must be signed in to change notification settings - Fork 185
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[BREAKING CHANGE] feat: SSR, AppRoot: get rid of classes mutation on html elements #7739
Conversation
size-limit report 📦
|
This pull request is automatically built and testable in CodeSandbox. To see build info of the built libraries, click here or the icon next to each commit SHA. |
e2e tests |
👀 Docs deployed
Commit fad1174 |
Codecov ReportAttention: Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## master #7739 +/- ##
==========================================
- Coverage 95.46% 95.45% -0.02%
==========================================
Files 380 382 +2
Lines 11324 11312 -12
Branches 3777 3781 +4
==========================================
- Hits 10811 10798 -13
- Misses 513 514 +1
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Sentry. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Как всегда, шикарная работа 👏 👏 👏
Отметил несколько моментов, но на первый взгляд то, что нужно 👍
Также:
- нужно ребейзнуть
master
– тамAppearance
сталColorScheme
; - нужно в доке Stylegude тоже указать
vkui
иvkui__root
классы в HTML; - нужно будет сразу глянуть почему скриншоты поплыли и не нужно ли из-за ошибок в них всё переделывать
packages/vkui/src/components/AppRoot/AppRootStyleContainer.module.css
Outdated
Show resolved
Hide resolved
84d05ce
to
91f7915
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
d7e603c
to
08b428e
Compare
669f35c
to
a3f9cbd
Compare
1512096
to
382b461
Compare
packages/vkui/src/components/AppRoot/AppRootStyleContainer.module.css
Outdated
Show resolved
Hide resolved
2024-11-26.22.19.59.movНормально, что подложка исчезла у |
Спасибо, что заметила! |
Reuse AppRoot styles in AppRootPortal to share same tokens
packages/vkui/src/components/Epic/__image_snapshots__/epic-android-chromium-light-1-snap.png
Outdated
Show resolved
Hide resolved
packages/vkui/src/components/Epic/__image_snapshots__/epic-ios-webkit-dark-1-snap.png
Outdated
Show resolved
Hide resolved
...hots__/horizontalscroll-does-not-have-arrows-without-mouse-android-chromium-light-1-snap.png
Outdated
Show resolved
Hide resolved
...r/__image_snapshots__/slider-with-tooltip-slider-with-tooltip-vkcom-chromium-dark-1-snap.png
Outdated
Show resolved
Hide resolved
.../src/components/Snackbar/__image_snapshots__/snackbar-mode-android-chromium-light-1-snap.png
Outdated
Show resolved
Hide resolved
Исправил Поправил выставление |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🔥🔥🔥 👏👏👏
колосальный рефактор!!! AppRoot стало гораздо легче читать за счёт выноса распила логики внутри
и документация ❤️ до этого вообще догадки приходилось делать как это работает
🤝
F Co-authored-by: Inomdzhon Mirdzhamolov <[email protected]>
2024-11-27.22.21.51.movЗаметила, что в |
Описание
На текущий момент при монтировании приложения в режиме
full/embedded
происходит автоматическое добавление классов:html
элемент добавляются классы:.vkui
,layout
режима,.vkui__root
.vkui__embedded
для режимаembedded
layout
режима,В том числе при старте приложения в
body
тут же добавляется контейнер для монтирования плавающих элементов и в режимеembedded
на него также вешаются css-переменные для задания safeAreaInsetsВсё это мешает нормальной работе
SSR
.Требуется минимизировать кол-во изменений в DOM в рантайме при старте приложения.
В идеале совсем исключить автоматическое добавление классов, или добавить возможность контролировать эту логику.
Решение
Перенести все классы и стили внутрь приложения, желательно на уровень
AppRoot
и ниже, чтобы реакт занимался добавлением этих классов, и DOM не менялся в процессе гидратации.В процессе переноса открылись причины установки большинства классов на html:
Для темной/светлой темы также нужный правильные цвета у системного скроллбара. А задать его можно лишь повесив на html элемент свойство
color-scheme
со значением токенаvkui
.Изменения
- Классы `.vkui` и `.vkui__root--embedded` теперь всегда выставляют фон.
VKUI/packages/vkui/src/styles/common.css
Lines 31 to 39 in 1512096
VKUI/packages/vkui/src/styles/common.css
Lines 48 to 50 in 1512096
Раньше это делалось только в режиме адаптивности
regular
, чтобы уGroup
вregular
в режимеcard
был правильный фон. (добавлено было в этом PR #1065)VKUI/src/styles/styles.css
Lines 126 to 128 in b86be10
Сейчас в этом для
Group
нету необходимости, так как фоном дляGroup
управляетPanel
VKUI/packages/vkui/src/components/Panel/Panel.module.css
Lines 91 to 104 in 3abc637
Но совсем убрать фон у
.vkui
нельзя, так как в многоколоночном режимеSplitLayout
видно фонhtml
элемента , если чуть проскролить контент. Это потому, что все вложенные вSplitLayout
компоненты вплоть доPanel
имеютheight: 100%
, то есть фон в итоге применяется только на 100% высоты экрана, а ниже фона уже нет. Это можно исправить заменив вездеheight: 100%
наmin-height: 100%
, но тут нет гарантий, что ещё чего-нибудь не выстрелит, поэтому я бы этот рефакторинг сделал бы отдельно.AppRoot
(безView
,Panel
), пришлось перезаписать, так как фонhtml
поменялся с дефолтного цвета браузера на токены.vkui
.- В `AppRoot` c помощью свойства `disableSettingVKUIClassesInRuntime` появилась возможность отключить автоматическое выставление классов `.vkui` на `html` и `.vkui__root/.vkui__root--embedded` на точке монтирования приложения в режиме `full/embedded`
Использовать это свойство стоит в режиме
SSR
, чтобы в рантаймеVKUI
этим на занимался.Но можно и не отключать это поведение, главное, чтобы при SSR эти классы уже стояли там куда их выставляет
VKUI
, чтобы при гидратации изменений в классах страницы не произошло и браузеру не нужно было бы пересчитывать DOM и CSSOM.В режиме
full
.vkui
класс навешивается наhtml
элемент, а.vkui__root
на точку монтирования приложения.В режиме
embedded
.vkui__root
и.vkui__root--embedded
навешиваются на точку монтирования приложения.- Все остальные классы и токены, требуемые `VKUI`, которые раньше вешались на `html` или точку монтирования приложения, теперь вешаются на контейнер `AppRoot`. Так как `AppRoot` это точка входа в `VKUI` приложение, то такой подход приемлем.
Чтобы компоненты, рендерящиеся через порталы вне
DOM
дереваAppRoot
, тоже имели доступ к токенам и стилямAppRoot
был создан компонентAppRootStyleContainer
. Он используется как вAppRoot
, так и как обертка для порталов (а значит модалок и попапов), в компонентеAppRootPortal
.AppRootStyleContainer
через контекст знает какой сейчас режим (mode
), какойappearance
, поэтому в модалках и других плавающих элементах всегда будет применена верная цветовая схема и токены.- `AppRootPortal` был переработан
Упрощены проверки cвязанные с
usePortal
свойством.portalRoot
, контейнер для порталов всех плавающих элементов больше не создается при первом рендере.Теперь по умолчанию все плавающие элементы рендерятся в
document.body
черезcreatePortal
.Это возможно за счёт обертки
AppRootStyleContainer
, которая прокидывается в портал вместе с плавающим элементом и гарантирует наличи нужных токенов и классов у плавающих элементов.В
AppRoot
всё также можно передать свойportalRoot
какref
, так и какHTML
элемент.- Пропы `popout` и `modal` из `SplitLayout` помечены как `@deprecated`.
Так как мы теперь можем обернуть плавающие элементы в токены и классы
AppRoot
при рендере через портал, то отпадает надобность в жесткой привязкеmodal/popout
компонентов кSplitLayout
(Alert
,ScreenSpinner
,ActionSheet
)По умолчанию модалки/попапы будут рендерится в
document.body
.Это позволяет избавить пользователей от необходимости обязательно передавать
ModalRoot
вSplitLayout
и держать стейт переключения модалок на уровнеSplitLayout
.Теперь
ModalRoot
можно объявить в любой части приложения, как иAlert
,ScreenSpinner
иActionSheet
.Также можно иметь несколько
ModalRoot
если требудется по смыслу разделить модалки. (Есть ограничение на одновременный рендер модалок из разныхModalRoot
, так как будет две подложки, их цвета будут складываться и подложка будет темнее.Тем не менее всё ещё можно рендерить модалки/попапы как раньше используся popout/modal свойства.
Но по умолчанию
ModalRoot
иPopout
будут рендерится вdocument.body
. Чтобы это изменить можнопередать в них
usePortal={false}
.Release notes
BREAKING CHANGE
В режиме
mode="full"
на html-элемент добавляется класс.vkui
и класс токенов темы, которая сейчас используется. На точку монтирования приложения добавляется класс.vkui__root
.В режиме
mode="embedded"
на точку монтирования добавляются классы.vkui__root
и.vkui__root--embedded
.В режиме
mode="partial"
дополнительные классы не добавляются.Добавление классов можно отключить с помощью нового свойства
disableSettingVKUIClassesInRuntime
. Это отключит добавление всех классов, кроме класса токенов.SSR. Для того, чтобы минимизировать затраты браузера на рендер страницы нужно на стороне сервера проставить все классы самостоятельно.
document.body
. Раньше в VKUI дополнительно создавался контейнер для порталов. Мы его убрали, чтобы при старте приложения дополнительно не создавать контейнер вdocument.body
, который может быть не нужен. Переопределить контейнер для рендера порталов всё также можно с помощьюportalRoot
.popout
иmodal
помечены какdeprecated
.Это означает что
ModalRoot
иpopout
элементы (Alert
,ScreenSpinner
иActionSheet
) можно объявлять в любой части приложения. Больше нет необходимости объявлять их на верхнем уровне и передавать в SplitLayout. Такие элементы будут по умолчанию рендерится вdocument.body
. Если хочется вернуть старое поведение, то нужно точечно отключить функцию портала, передав, например, вModalRoot
usePortal=false
.