Pull to refresh

Comments 22

Вспомнил случай на работе (ровно год назад): хочу отдебажить вебвью в старом андроиде, подключаю телефон к ноуту, иду в remote devices в хроме (80), выбираю свое вебвью и… вижу белый экран вместо девтулзов. Быстрое расследование показало, страничка девтулзов сама падает с ошибкой document.registerElement is not a function
Пытливому читателю предлагается угадать, на какой технологии сделаны девтулзы андроидного вебвью и какую технологию выпилили под 0 в свежем хроме.
https://www.chromestatus.com/feature/4642138092470272

Because React implements its own synthetic event system, it cannot listen for DOM events coming from Custom Elements without the use of a workaround. Developers will need to reference their Custom Elements using a ref and manually attach event listeners with addEventListener. This makes working with Custom Elements cumbersome.


Ведь это действительно, иногда превращается в ад — попытка использовать вэб-компоненты в реакте. Он их спокойно разместит в dom-дереве, привяжется к пропертям, но вот привязать обработчик кастомного события — действительно, только через рефы. Да и вообще, спека кастомных событий рождалась не для удовлетворения потребностей именно вэб-компонентов, но для удовлетворения потребностей вэб-разработчиков.

Хорошо или плохо? Реакт решает одну хорошую и важную задачу — делает строго однонаправленный поток данных. Делает он это ценой того, что он старается держать весь поток внутри своей абстракции. И любые попытки выскочить из нее — потенциальные точки нарушения направленности потока данных. Именно поэтому разработчики этой библиотеки рекомендуют использовать рефы только в крайних случаях, когда другие способы не помогли.

Реакт не дружит с вэб-стандартами, он их оборачивает своими абстракциями, считая что это единственный верный способ реализации вэб-приложений.

В тоже время, существует много кейсов, где модель реакта не так эффективна, как реализация на чистом DOM/Custom Elements

Все правильно пишите, за одним маленьким исключением: веб-компоненты != веб-стандарты. В одном из прошлых постов я раскрывал эту тему более подробно: https://habr.com/en/post/486500/


В тоже время, существует много кейсов, где модель реакта не так эффективна, как реализация на чистом DOM/Custom Elements

Расскажите про эти кейсы, будет полезно знать.

Банально, если реализовывать приложение, совместимое с концепцией A/B-тестирования какой-либо части интерфейса, без необходимости готовить релиз для каждого эксперимента или варианта. С реактом, к сожалению, очень быстро заходишь в тупик. Именно из-за необходимости внедриться в его абстрактное дерево.

А вот с приложением, реализованном на фреймворках/либах более дружественно относящихся к DOM и веб-стандартам, такая задача легко решается, либо проблема вообще не возникает.

И да, у вэб-компонентов нет единого стандарта, что в прочем хорошо. Потому как они базируются на семействе вэб-стандартов, которые могут развиваться уже по своей собственной траектории.

Разработчик же имеет возможность выбирать ту технологию/реализацию, которая ему больше подойдет для конкретной реализации. Нужна изоляция стилей: БЭМ, linaria, Shadow DOM, выбирай что тебе удобно. Нужен встраиваемый виджет:   IFrame, вэб-виджет, вэб-компонент на шедоу или лайт DOM, ну или еще что там придумаешь.

Анализируй поставленную задачу и выбирай инструмент.

Мне лично для A/B тестов всегда хватало какого-то такого кода: isFeatureEnabled ? <ComponentA /> : <ComponentB />. Возможно, есть более сложные сценарии, но я почему-то сомневаюсь, что такая большая компания как Facebook сделала бы фреймворк, не способный к A/B тестированию

Ну да, для архитектуры не ориентированной на возможность экспериментирования без релиза приложения, такого кода достаточно.

Но вот на практике всегда все сложнее. Особенно когда нужно, и часто нужно, проверить хоть какой-то потенциал гипотезы, прежде чем выделять ресурсы на реализацию ее фич.
но я почему-то сомневаюсь, что такая большая компания как Facebook сделала бы фреймворк, не способный к A/B тестированию


С большим интересом посмотрю на фреймворк для эксперементирования от Facebook. Особенно на ту его часть, где будет решаться проблема внедрения в реакт-дерево.

Не совсем понятна задача. Что-то такое?


<A>
  <B> // B - меняем
    <C/> // C не трогаем
  </B>
<A/>

Вы не могли бы привести пример где это уже решено?

Следование принципам DOM актуально для кого? Для SEO'шника? Зачем вообще нужен React на странице, которая отдаётся в ранжирование?

prerender.io может формировать вëрстку для ботов.

Автор этой странички считает это хаком и настаивает на том, что поддержка должна быть встроена во фреймворк. Получается, что результаты этого теста основаны на субъективном мнении, а не технической возможности/невозможности решить задачу.

Все известные мне фреймворки так или иначе дают разработчику взможность работать напрямую с ДОМ-нодами. Следуя вашей логике — все они 100% дают техническую возможность решить задачу, если собственно ДОМ ее поддерживает. Такой подход лишает эту оценку совместимости всякого смысла.


Таким образом, необходимость создания оберток, из-за которой React влепили его 71% рейтинга, не помешала дать Angular 100%. Вот такой вот непредвзятый рейтинг.

Да нет же. Просто на событие с двоеточием автор не написал теста. Почему не написал — это уже другой вопрос: предвзятость или упущение или еще что. Но 100% у Ангуляра не потому, что "необходимость создания оберток" проигнорировали, а потому что все написанные тесты выполняются — вот и все.

Ещё до публикации статьи я отправил в их репозиторий вопрос о пропущенном тест-кейсе на события с двоеточием: https://github.com/webcomponents/custom-elements-everywhere/issues/986 ответа пока нет, но если он появится, обновлю пост.


Основная мысль остается той же: как вы справедливо замечаете, все фреймворки дают прямой доступ в ДОМ и непонятно, какой смысл измерять совместимость.

Просто в реакте хоть это и можно делать через прямой доступ, однако же веб компоненты использовать очень больно. Да реакт shadow root начал поддерживать то с 17 версии, до этого он вешал event listeners на document, из-за чего реакт приложение нельзя было заворачивать в shadow dom. (Ага, осталось дождаться поддержки от вебпака, я так и не смог заставить вебпак подключать стили внутрь shadow dom)

Отсутствие синтаксического сахара в JSX для поддержки свойств/событий это наименьшая из проблем. Как показывает опыт Stencil и других проектов, обертки генерируются простейшим образом, плюс дают дополнительные бонусы, вроде тайпингов и нормально работающего tree-shaking.


Гораздо больше проблем в самом косячном стандарте веб-компонентов.

Дискутировать с деврелами Chrome по-русски на Хабре — это конечно очень дерзко. Ох уж эта удивительная особенность русскоязычного сообщества жаловаться на браузеры в Твиттере, критиковать стандарты на Хабре — и всё по-русски. Чтобы наверняка никто не ответил, особенно автор тестов.

Я в твиттере Алексу Расселлу и другим гугловцам тоже отвечал. Более того, они всегда могут поговорить напрямую с командой. React, моё посредничество тут ни к чему.


Статья написана с другой целью — познакомить местное сообщество с этой историей, изложить альтернативную точку зрения

Если возможность добавления событий есть, то почему же тогда это не делается в тестах custom-elements-everywhere? Автор этой странички считает это хаком и настаивает на том, что поддержка должна быть встроена во фреймворк. Получается, что результаты этого теста основаны на субъективном мнении, а не технической возможности/невозможности решить задачу.

Гланды вырываются? Вырываются. Плевать, что через жопу. Ставим галку. А для жопы вазелин пропишем.


вот этот маленький модуль, который научит JSX работать и со свойствами, и с событиями как надо

Встаньте на табурет. Дотянулись? Отлично, ставим ещё одну галку. Пойдёте в баскетболисты.


А если серьёзно, то это какое-то бодание осла с козлом. Обе технологии довольно кривые. Обе 10 лет уже костыляют, а там до сих пор детские болезни.

Заинтересовали. А как обозначенные проблемы решаются в $mol фреймворке?

Как обычно, в $mol проблемы не решаются, они в нём просто не создаются. Например, в компонентах есть отдельные свойства, через которые задаются атрибуты (attr), поля (field), события (event) и стили (style). Соответственно, передавать туда можно всё, что сможет переварить браузер. Но работа с ними напрямую идёт относительно редко, основной метод коммуникации компонент — связывания свойств.

С явными секциями для свойств/атрибутов все понятно, по сути это вариант #4 из списка в первом комменте
А вот с этим моментом непонятно:


$my_widget $mol_view
    title \

Что будет в HTML, свойство или атрибут?

Sign up to leave a comment.

Articles