Pull to refresh

Comments 29

А в чем проблема была использовать готовые решения, например Lit, Stenciljs или solidjs?

я был техлидом команды, которая делала ui-kit на Lit, мы использовали вторую версию

на тот момент там были проблемы с перерисовкой (целиком вызывается функция render при каждом изменении атрибута веб-компонента)

насколько я знаю, в 3-й версии добавили точечное обновление DOM, но другие проблемы остались

например, ленивая загрузка контента табов (слотов), это не так просто и удобно сделать на lit, solid, stencil, используя именно веб-компоненты

также не хотелось использовать jsx или шаблонные строки для создания компонента, хотелось получить реактивность, но без лишних оберток (это как раз описано в статье)

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

поддерживаю я + коллеги по работе

активно используем в компании на проде в одном из продуктов как основной инструмент для разработки фронтенда

А что за продукт? Можно его посмотреть на предмет тормозов

это b2b продукт, его нет в открытом доступе

мы сравнивали (в основном для больших списков и общее потребление памяти) с react/vue/angular, производительность выросла

но, чтобы не просто верить моим слова, а увидеть конкретные результаты, планировал выложить сюда https://krausest.github.io/js-framework-benchmark/ для сравнения производительности

Странно что нет сравнения со Svelte, ведь это первое что приходит на ум когда нужна реактивность без оверхеда

там еще суть в веб-компонентах

для svelte веб-компоненты далеко не основное направление развития

и всё-таки svelte это не совсем чистый js/ts, там свой компилятор

а я в статье написал, что хотелось что-то простое, но без лишних оберток

свой компилятор писать точно не хотел

Как по мне стоит выбирать только между html first и js first. За последнее время посмотрел достаточно много библиотек. Практически все выглядят как ужас. Удобней реакта в плане построения компонентов нет- это то когда jsx реально тащит. Чисто для html vue хорош. Сигналы есть preact/reef и тд. Даже типа построения шаблонов в виде функций есть но выглядит это все как вырви глаз. Мне допустим зашёл alphinejs. Я сразу вспомнил старый добрый angularjs, это как раз когда нужна лёгкая реактивность - без лишних оберток. Правда с компонентами там непонятки. Скучаю по старому angularjs. А так, что то хорошего прям нет. Svelte да хорош, но хотелось бы без сборщиков. надоеда эта магия и бандлеры.

Автор выдает себя за уверенного пользователя фронта, но слышал лишь про нестареющую троицу... печально

Выше упомянули про свелт, солид и тд, но автор что-то пытается бубнить про веб-компоненты, хотя данный эвангелизм канул в лету где-то в 2015м, когда нашлись очевидные проблемы. Упомяну ещё alpine.js, мб это автор желал. Но детская привычка сделать "все сам" продолжает непокидать умельца

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

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

странно, а вот ребята из reddit и microsoft с Вами не согласны

данный эвангелизм канул в лету где-то в 2015м

1-ая спецификация по веб-компонентам появилась в 2016, а поддержка браузерами появлялась с 2017 по 2020 (в 20-ом году начал поддерживать edge, а это очень важно, учитывая количество обычных пользователей на windows)

Веб компоненты гвоздями прибиты к DOM, что делает их мертворождёнными.

  • Хостовой объект, приаттаченый к документу - это крайне медленно. И JIT компилятор тут ничем помочь не может.

  • Значениями атрибутов могут быть лишь строки - нужны адовые не совместимые между либами костыли для передачи других типов значений.

  • Жизненный цикл компонента начинается лишь в момент аттача хостового элемента.

  • Перенос хостового элемента приводит к реаттачу всего поддерева компонент.

  • Легко словить конфликт имён компонент между разными либами. И механизмов разрешения этого конфликта нет.

  • Единожды зарегистрированный компонент уже нельзя удалить.

  • В теневом доме отваливаются все стили - их надо копипастить в каждый теневой дом отдельно. Надо ли говорить, что это тормоза на ровном месте?

  • Веб компоненты ничего не знают про пулл реактивность. Хочешь что-то им передать пуш по чём зря через атрибуты и слоты.

И вот на этой кривой архитектуре вы и сделали свой фреймворк, которого "как бы нет".

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

Когда вы создаёте элемент - под капотом создаётся два объекта: объект хоста и js обёртка над ним, через которую вы взаимодействуете с первым. Это не бесплатный интероп. И он не может быть оптимизирован компилятором, ибо JS рантайм владеет только этими самыми обёртками, а сами объекты хоста для него - чёрный ящик. Но это под беды. Когда элемент аттачится к документу, он начинает реагировать на события и сам их рассылать, участвовать в расчёте стилей и лейаута, инвалидировать кеши браузера и дёргать их актуализацию, и тд, и тп. Короче, создавать дом элемент, да ещё и в документе, если не собираешься его прямо сейчас рендерить, - крайне расточительно.

Под объектом хоста вы имеете в виду внутреннюю реализацию элемента в браузере? Разве это не касается любого элемента, который мы создаем в DOM?

Пока у нас в браузере HTML и DOM кажется этой цены избежать невозможно?

P.S. и можно пожалуйста не минусить карму за обычный вопрос?

О том и речь - веб-компоненты гвоздями прибиты к дому, хотя сами как правило не рендерятся. Рендерится их содержимое. Иногда.

И в чем тут проблема? Мы в любом фреймворке в итоге работаем с элементами DOM в конечно счете. Какая разница: веб-компонент это или стандартный элемент?

Да, в SSR веб-компоненты становятся проблемой, потому что нам надо тащить эмуляцию DOM в node.js. Однако чисто для клиентских сценариев - веб-компоненты это отличное решение.

Виртуальный рендеринг, отрисовка на холсте, 3д сцены, аудио графы, удаленное управление, и тд.

  • Виртуальный рендеринг - отлично работает. Взять тот же lit-virtualizer

  • При чем тут отрисовка на холсте, если мы используем canvas?

  • Просто оставлю это https://modelviewer.dev/

  • Это вообще что за зверь?

  • Про удаленное управление - слишком абстрактный наброс. Не понятно, что конкретно имеется в виду

Дмитрий, спуститесь до нас, простых смертных, и раскройте подробнее как Audio API связано с веб-компонетами? А также почему веб-компоненты мешают отрисовке на холсте?

И при чем тут вообще удаленное управление? Как remote desktop protocol связан с веб-компонетами? Честно у меня ощущение, что вы просто притягиваете за уши и бросаетесь умными словами.

Я пробежался по вашей статье, и не увидел сравнения с lit-virtualizer. Если что эта библиотека как раз отвечает за виртуализацию скролла, как и ваш $mol. Не исключаю, что ваша реализация может быть более эффективна. Однако, это не означает, что виртуализация в Lit ужасна и ее невозможно применять. Lit однозначно эффективнее большой тройки.

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

То есть вы не можете четко сформировать ключевую мысль в диалоге и предлагаете мне внимательно прочитать вашу статью, чтобы догадаться, что вы имели в виду?

UFO landed and left these words here

Классно объяснено! Хотя интересно, что при том, что вы называете RWC утилитками, (имхо) по стилю статья читается как описание небольшого фреймворка вокруг Web Components — с компонентами, реактивностью и архитектурой. Получилось даже чище, чем в Lit.

Sign up to leave a comment.

Articles