Небольшая просьба: добавьте вот тут важную оговорку, что реакт не выполняет код компонента, когда происходит создание jsx элемента
Чтобы научить нашу версию метода React.createElement работать с компонентами, добавим следующую проверку:
Это может произойти синхронно или асинхронно, но уже внутри реакта.
Собственно, благодаря тому, что вызов компонентов выносится из стек фрейма, в котором происходит render, и становятся возможны все основные фичи: от частичных апдейтов, до Suspense и Transitions.
Ок, согласен. Но тогда уж проще устроить для CI такой же локальный репо с кешом пакетов и монтировать его в каждый агент. Так еще стабильнее, чем ходить куда то по сети :)
Да, но это уже и так экономит львиную часть занимаемого места. То, что в локальном репо будут две версии одного пакета с 90% одинаковыми файлами мне видится уже сильно меньшей проблемой.
Пока там просто асинхронный запрос чего-то, самое худшее, что может случиться — warning в консоли. Но вот если там происходит, например, отправление формы и по успеху делается роутинг типа такого
Как будто с автоматической коробки пересел за механику: клево конечно, но на каждый день не надо, спасибо.
Бенчмарки, имхо, вообще ни о чем не говорят. Когда фреймфорк не делает за разработчика кучу рутины, не удивительно, что и кода в нем оказывается ощутимо меньше и работает все быстрее. Но это же все не бесплатно :)
По моему, если задаваться целью ускорения современного фронтенда и уменьшения объема кода, то лучше копать в сторону AOT компиляции, как уже делают Svelte и Angular. В реакте похожий проект отложили до лучших времен. Но у них другая киллер фича в приортете: параллелизация отрисовки с помощью коопертивного планировщика (это если почти на русский перевести :) )
Вспомнил случай на работе (ровно год назад): хочу отдебажить вебвью в старом андроиде, подключаю телефон к ноуту, иду в remote devices в хроме (80), выбираю свое вебвью и… вижу белый экран вместо девтулзов. Быстрое расследование показало, страничка девтулзов сама падает с ошибкой document.registerElement is not a function
Пытливому читателю предлагается угадать, на какой технологии сделаны девтулзы андроидного вебвью и какую технологию выпилили под 0 в свежем хроме. https://www.chromestatus.com/feature/4642138092470272
Смысл сравнивать есть, потому что там, где macOS запустится, она будет работать стабильно, а вот там, где запустится linux, не известно, как он будет работать.
Но еще из любопытного, можно вставлять и совсем не props, например ref или же вообще какой-нибудь window.location.pathname:
Не делайте так, если не хотите долгого неочевидного дебага!
Чтение чего либо, кроме props, state и context в теле компонента — это сайдэффект и должно происходить в use(Layout)Effect.
Во первых, ваш компонент может не знать об изменении значения произвольной рефки (например, если она спускается пропсом глубже) или компонент может не подписываться на событие popState и соответственно не отреагировать на изменение window.location. Это приведет к stalled эффекту — использованию протухших значений из замыкания.
Во вторых, такой код сломается при серверном рендеринге.
Любое чтение из "окружающего мира" (ref.current это тоже зачастую кусочек окружающего мира) надо делать в эффектах.
Уже все норм https://devblogs.microsoft.com/typescript/announcing-typescript-4-6/#cfa-destructured-discriminated-unions
Тут может помочь TS: пока не будет проверен тип
err
, типusers
будетUsers | null
НапримерСпасибо за статью и наглядные шаги!
Небольшая просьба: добавьте вот тут важную оговорку, что реакт не выполняет код компонента, когда происходит создание jsx элемента
Это может произойти синхронно или асинхронно, но уже внутри реакта.
Собственно, благодаря тому, что вызов компонентов выносится из стек фрейма, в котором происходит render, и становятся возможны все основные фичи: от частичных апдейтов, до Suspense и Transitions.
https://docs.pmnd.rs/react-three-fiber/advanced/scaling-performance#enable-concurrency
Удобный дешевый шедулинг всего приложения включая и webgl и DOM
Ок, согласен. Но тогда уж проще устроить для CI такой же локальный репо с кешом пакетов и монтировать его в каждый агент. Так еще стабильнее, чем ходить куда то по сети :)
А зачем хранить кеш в репозитории?
Для детерминированных зависимостей есть yarn.lock, его должно быть достаточно.
Да, но это уже и так экономит львиную часть занимаемого места. То, что в локальном репо будут две версии одного пакета с 90% одинаковыми файлами мне видится уже сильно меньшей проблемой.
Ну а вам шашечки или ехать?
Можно монтировать volume с локальным хранилищем
Yarn PnP делает то же самое + еще ускоряет запуск ноды за счет экономии на чтениях с диска.
Ну на самом деле же там не 0. Если мерять через Performance API, а не Date.now(), все видно.
На throttle функции хорошо бы вызывать `cancel()` в cleanup callback.
лучше переписать так
Пока там просто асинхронный запрос чего-то, самое худшее, что может случиться — warning в консоли. Но вот если там происходит, например, отправление формы и по успеху делается роутинг типа такого
то можно поломать UX.
Как будто с автоматической коробки пересел за механику: клево конечно, но на каждый день не надо, спасибо.
Бенчмарки, имхо, вообще ни о чем не говорят. Когда фреймфорк не делает за разработчика кучу рутины, не удивительно, что и кода в нем оказывается ощутимо меньше и работает все быстрее. Но это же все не бесплатно :)
По моему, если задаваться целью ускорения современного фронтенда и уменьшения объема кода, то лучше копать в сторону AOT компиляции, как уже делают Svelte и Angular. В реакте похожий проект отложили до лучших времен. Но у них другая киллер фича в приортете: параллелизация отрисовки с помощью коопертивного планировщика (это если почти на русский перевести :) )
Не хватает Miro
А компилятор не умеет такое оптимизировать? Или он не знает, что strlen чистая функция?
пояснил?
Вспомнил случай на работе (ровно год назад): хочу отдебажить вебвью в старом андроиде, подключаю телефон к ноуту, иду в remote devices в хроме (80), выбираю свое вебвью и… вижу белый экран вместо девтулзов. Быстрое расследование показало, страничка девтулзов сама падает с ошибкой
document.registerElement is not a function
Пытливому читателю предлагается угадать, на какой технологии сделаны девтулзы андроидного вебвью и какую технологию выпилили под 0 в свежем хроме.
https://www.chromestatus.com/feature/4642138092470272
Видимо, нет
https://www.npmtrends.com/nativescript-vs-react-native-vs-ionic-vs-cordova
Смысл сравнивать есть, потому что там, где macOS запустится, она будет работать стабильно, а вот там, где запустится linux, не известно, как он будет работать.
Не делайте так, если не хотите долгого неочевидного дебага!
Чтение чего либо, кроме props, state и context в теле компонента — это сайдэффект и должно происходить в use(Layout)Effect.
Во первых, ваш компонент может не знать об изменении значения произвольной рефки (например, если она спускается пропсом глубже) или компонент может не подписываться на событие popState и соответственно не отреагировать на изменение window.location. Это приведет к stalled эффекту — использованию протухших значений из замыкания.
Во вторых, такой код сломается при серверном рендеринге.
Любое чтение из "окружающего мира" (ref.current это тоже зачастую кусочек окружающего мира) надо делать в эффектах.