Есть styled-components как паттерн, функция styled`...`, и у неё есть разные реализации, и styled-components тут не очень. Есть варианты получше, посмотрите на emotion или jss
Вы, наверное, из тех разработчиков, которые тесты тоже не пишут, потому что это задача QA? А задачи программистов – исключительно писать код и больше ничего?
Автор делает две одинаковые реализации, через хук и через компонент. Реализация на хуках короче в 3 раза (25 строк против 73). При этом автор заявляет
Для меня реализация с использованием React-хуков не выглядит чище реализации на React.Component.
Что? Если в 3 раза более короткий код это не критерий чистоты, то что тогда?
Потом автор делает реализацию на Ember, сравнивает её с React.Component, Ember очевидно выигрывает, и на основании этого делается вывод, что хуки не нужны.
В статье пропустили самый важный момент успеха современных фреймворков и неуспеха Backbone – возможность создания переиспользуемых компонентов. Берем и пишем:
В любом современном фреймворке можно вставить в HTML кастомный элемент, который отрендерит свою разметку и инициализирует свою логику. В Backbone/Marionette так не выйдет – извольте отрендерить контейнер (регион), а потом вручную в него примонтировать компонент.
Видели хоть одну библиотеку UI-компонентов на Backbone? То-то и оно, что на нём такие вещи невозможны в принципе. А на Angular/React/Svelte/Vue/etc – запросто.
Там весь инструмент такой. В документации постоянно натыкаешься на то что их инструмент в 10 раз лучше чем "обычный порошок". А на деле ничего толком не работает. Один сплошной хайп на том что они новые и современные.
Маленькое пожелание – при использовании setInterval нужно не забывать их очищать при удалении компонента. Даже если это просто демка для примера, лучше следовать хорошим практикам
Веб-компоненты как стандарт зародился более 10 лет назад, и с тех пор современные подходы улетели далеко вперед, а веб-компоненты все никак не угонятся и по-прежнему предоставляют удобство на уровне AngularJS.
Поэтому когда мне предлагают написать что-то на веб-компонентах, я смотрю на это как на шаг назад.
Использовать веб-компоненты как общую базу для всех фреймворков – это очень утопичная идея, в реальности не работает. Вместо использования всех возможностей Vue, вам придется искать общий знаменатель и бороться с причудами как других фреймворков, так и самих веб-компонентов. Пару лет назад я об этом написал цикл статей с детальным разбором: часть 1, часть 2 и еще один перевод на эту же тему.
simpleFetch.cancel() очень странно работает в случае нескольких параллельных запросов. Получается, что он отменит их все сразу. Правильнее было бы сделать какой-то более гранулярный контроль.
И еще пара рационализаторских предложений:
Для собирания baseUrl можно было взять нативное API: new URL(options.url, baseUrl)
P.S. и совсем маленькое замечание – сократили вы бы пост в два раза, в ценности бы он совсем не потерял. Не обязательно комментировать каждую строку кода, можно только про самое важное рассказать.
А зачем в этой связке нужен esbuild? Если это для того чтобы собирать код для запуска, то в браузере же уже нативные es-модули есть, поэтому достаточно только TS->JS сконвертировать, и не бандлить ничего
Вот тут реализация useStableEventHandler. Основное преимущество – onChange, и всю цепочку зависимостей наверх мемоизировать не надо, мы получим актуальный инстанс в любом случае. Мемоизация скрывается внутри компонента и у его пользователей голова ни о чём не болит
Речь о том, что как в первом случае никто в здравом уме не пишет. Вместо идиоматичного React сгруппированного в одном месте JSX мы получаем нечто странное. За этим лесом из memo становится не видно деревьев (собственно UI кода).
Достаточно оптимизировать пару узких мест, а не заниматься имитацией бурной деятельности и чинить несломанное.
Есть styled-components как паттерн, функция
styled`...`, и у неё есть разные реализации, и styled-components тут не очень. Есть варианты получше, посмотрите на emotion или jssВы, наверное, из тех разработчиков, которые тесты тоже не пишут, потому что это задача QA? А задачи программистов – исключительно писать код и больше ничего?
Автор делает две одинаковые реализации, через хук и через компонент. Реализация на хуках короче в 3 раза (25 строк против 73). При этом автор заявляет
Что? Если в 3 раза более короткий код это не критерий чистоты, то что тогда?
Потом автор делает реализацию на Ember, сравнивает её с React.Component, Ember очевидно выигрывает, и на основании этого делается вывод, что хуки не нужны.
Вообще не понял логику этой статьи.
В статье пропустили самый важный момент успеха современных фреймворков и неуспеха Backbone – возможность создания переиспользуемых компонентов. Берем и пишем:
В любом современном фреймворке можно вставить в HTML кастомный элемент, который отрендерит свою разметку и инициализирует свою логику. В Backbone/Marionette так не выйдет – извольте отрендерить контейнер (регион), а потом вручную в него примонтировать компонент.
Видели хоть одну библиотеку UI-компонентов на Backbone? То-то и оно, что на нём такие вещи невозможны в принципе. А на Angular/React/Svelte/Vue/etc – запросто.
А все потому что в документации они так явно и пишут:
А неймспейсы так и остались, как историческое легаси
Там весь инструмент такой. В документации постоянно натыкаешься на то что их инструмент в 10 раз лучше чем "обычный порошок". А на деле ничего толком не работает. Один сплошной хайп на том что они новые и современные.
Пользуйтесь лучше vite.js
Маленькое пожелание – при использовании setInterval нужно не забывать их очищать при удалении компонента. Даже если это просто демка для примера, лучше следовать хорошим практикам
Изначально вопрос стоял "как извлечь максимальную пользу для бизнеса". С этой точки зрения разнообразие фреймворков только идёт в минус
Еще есть 4й вариант – собраться с силами и принять корпоративный стандарт по технологиям, и закончить с этим зоопарком.
Веб-компоненты как стандарт зародился более 10 лет назад, и с тех пор современные подходы улетели далеко вперед, а веб-компоненты все никак не угонятся и по-прежнему предоставляют удобство на уровне AngularJS.
Поэтому когда мне предлагают написать что-то на веб-компонентах, я смотрю на это как на шаг назад.
Тем не менее, все объекты создадутся второй копией и все сайд-эффекты произойдут дважды
Если виджет на странице может повторяться, это это решение тоже не годится. Потому что придется один и тот же скрипт подключать и исполнять дважды.
Для такой ситуации лучше явные конструкторы создавать.
Картинка про троллейбус из буханки
А почему нельзя сделать так?
Использовать веб-компоненты как общую базу для всех фреймворков – это очень утопичная идея, в реальности не работает. Вместо использования всех возможностей Vue, вам придется искать общий знаменатель и бороться с причудами как других фреймворков, так и самих веб-компонентов. Пару лет назад я об этом написал цикл статей с детальным разбором: часть 1, часть 2 и еще один перевод на эту же тему.
simpleFetch.cancel()очень странно работает в случае нескольких параллельных запросов. Получается, что он отменит их все сразу. Правильнее было бы сделать какой-то более гранулярный контроль.И еще пара рационализаторских предложений:
Для собирания baseUrl можно было взять нативное API:
new URL(options.url, baseUrl)Для параметров тоже есть нативный URLSearchParams
P.S. и совсем маленькое замечание – сократили вы бы пост в два раза, в ценности бы он совсем не потерял. Не обязательно комментировать каждую строку кода, можно только про самое важное рассказать.
А зачем в этой связке нужен esbuild? Если это для того чтобы собирать код для запуска, то в браузере же уже нативные es-модули есть, поэтому достаточно только TS->JS сконвертировать, и не бандлить ничего
Если нам нужно вызвать callback из useEffect, то мы заворачиваем его в наш кастомный хук
Вот тут реализация useStableEventHandler. Основное преимущество – onChange, и всю цепочку зависимостей наверх мемоизировать не надо, мы получим актуальный инстанс в любом случае. Мемоизация скрывается внутри компонента и у его пользователей голова ни о чём не болит
Согласен, про "пару узких мест" я преувеличил. В реальности это сложнее.
Интересно, что может быть проще обычных функций, и как memo-обертки упрощают это еще сильнее?
Это в случае, если оптимизация гарантированно улучшает ситуацию. На самом деле этого нет. Моя демка показывает, что цифры там и там одинаковые
Речь о том, что как в первом случае никто в здравом уме не пишет. Вместо идиоматичного React сгруппированного в одном месте JSX мы получаем нечто странное. За этим лесом из memo становится не видно деревьев (собственно UI кода).
Достаточно оптимизировать пару узких мест, а не заниматься имитацией бурной деятельности и чинить несломанное.