Comments 5
Я вот как раз и затеял Fusor чтобы можно было явно контролировать обновления хоть пакетные, хоть одиночные, также можно самому рендерить и обновлять сложные участки дом асинхронно или синхронно, также диффить сложные структуры там где это важно.
Реакт это черная коробочка которая оптимизирована на средний/общий по больнице результат. Когда нужна максимальная оптимизация, то он уже не подходит.
Важно!
useSyncExternalStoreлучше использовать в библиотеках, а не в пользовательском коде приложения.
Это почему?
Потому что большинство кейсов покрывается стандартными хуками и использование данного будет оверхедом. Хотя есть кейсы, когда он действительно необходим. Например, когда нужно подписаться на изменения значения браузерного API.
Короче говоря, этот хук заслуживает отдельной статьи ;)
Я понял что меня смутило. Получается у меня больше вопрос по форме. Вы пишете:
... а не в пользовательском коде приложения.
По идее, любой код, который использует реакт является по отношению к нему клиентским, а вашими словами пользовательским. Иными словами, вот пишем мы кастомный хук с котором используем useState, useCallback и получаем пользовательский код по отношению к реакту и часть внутренний библиотеки по отношению к коду, который этот хук будет использовать.
В самой документации реакта я ничего такого не видел. Там ясно написано:
When possible, we recommend using built-in React state with
useStateanduseReducerinstead. TheuseSyncExternalStoreAPI is mostly useful if you need to integrate with existing non-React code.
Иными словами, речь идет о клиентском коде, который не использует реактивные состояния, которые предлагает реакт.
Таким образом, useSyncExternalStore создан для пользовательского кода, когда он рассчитан на работу с внешними состояниями.
Если правильно понял, нравится вам оопешный подход. Например, хотите использовать реакт просто как удобную прослойку для работы с домом. Теперь легко подключать такие внешние состояния используя апи самого реакта.
Оверхед, конечно, тут тоже имеет место, но само по себе это не какой-то блокер. Редакс - это тоже оверхед.
Я все это к тому, что я бы не стал менять формулировку предложенную в документации. Она более точно отражает назначение этого хука.
JS выполняет обновление DOM в одном основном потоке. Как тут получается многопоточность если react всё равно транслируется в JS?
Можно эту тему раскрыть?
Даже если ответы от сервера приходят практически одновременно JavaScript все равно выполняет код в основном потоке последовательно.
Сценарий с почти одновременными ответами
Допустим, два запроса отправлены, и серверы ответили практически одновременно. Вот что произойдет:
События в очереди: Когда ответы приходят, соответствующие им обработчики (функции, переданные в .then()) добавляются в очередь задач
Цикл событий (Event Loop): Цикл событий JavaScript постоянно проверяет, есть ли задачи в очереди, и если есть, выполняет их одну за другой.
Последовательно
Что интересного в React 18