iamkulykov

9 ноября 2020, Turku, Finland

# Понедельник 60 твитов

Всем привет! С вами Сергей Куликов (@iamkulykov). Работаю в Vaadin, последние 4 года пишу на веб-компонентах.

7:00

Темы недели:

— Кастомные элементы: все еще не торт?
— Shadow DOM как средство изоляции
— Ванильные компоненты без… twitter.com/i/web/status/1…

7:02

В Vaadin занимаюсь разработкой и поддержкой нашей библиотеки компонентов на Polymer 2 и 3 (в будущем планируем пере… twitter.com/i/web/status/1…

7:06

До Vaadin работал в компании OWOX, где участвовал в поэтапной миграции приложения с Polymer 0.5 на 1.0. Застал все… twitter.com/i/web/status/1…

7:08

Тема первого дня — кастомные элементы. Как в узком смысле (часть стандарта HTML), так и в широком (framework-agnost… twitter.com/i/web/status/1…

7:11

Опрос: знакомы ли вы с кастомными элементами?

7:15

Если слышите впервые, советую эту главу в учебнике Ильи Кантора. Она небольшая, но хорошо описывает API и некоторые… twitter.com/i/web/status/1…

7:23

Поддержка браузерами — кроме IE11 и старого Edge. Многих наверняка смутит “partial support” в Safari, сейчас объясн… twitter.com/i/web/status/1…

7:32

Дело в том, что разработчики WebKit принципиально отказались внедрять модифицированные встроенные элементы (customi… twitter.com/i/web/status/1…

7:35

Использовать браузерные API, относительно которых не достигнут консенсус, я не советую. Так что дальше речь пойдет… twitter.com/i/web/status/1…

7:40

Автономные кастомные элементы сами по себе умеют немногое. По сути это те же span, у которых есть жизненный цикл и… twitter.com/i/web/status/1…

7:51

Пока главный плюс — сама способность определять свои HTML-теги и назначать им поведение с помощью JS. Это только пе… twitter.com/i/web/status/1…

7:59

В перспективе браузеры предоставят разработчикам контроль над рядом аспектов, доступных нативным элементам: поддерж… twitter.com/i/web/status/1…

8:07

Часть этих улучшений и базовое для них API Element internals уже добавлены в стандарт WHATWG. Но в стабильных верси… twitter.com/i/web/status/1…

8:15

Кстати, вы любите читать спецификации? Я обычно первым делом ищу в них разделы, отмеченные как “non-normative”. Там… twitter.com/i/web/status/1…

8:21

В не нормативных разделах спецификации кастомных элементов можно найти ответы на вопросы “зачем”, “как” и “чего пок… twitter.com/i/web/status/1…

8:32

Самый простой способ потестить кастомные элементы — сайт webcomponents.dev. Есть примеры разных библиотек и vanilla JS.

8:44

Возможны, вы заметили, что до сих пор я избегал термина “веб-компоненты”. Думаю, тред на эту тему будет не лишним.

13:09

Прежде всего, упоминания веб-компонентов ни в одном стандарте вы не найдете. Как и PWA, это "зонтичный термин", под… twitter.com/i/web/status/1…

13:11

В обоих случаях речь идет о технологиях, продвигаемых Google. Благодаря их, скажем так, агрессивной политике в этой… twitter.com/i/web/status/1…

13:15

Так или иначе, за последние несколько лет веб-компоненты собрали, пусть и не без оснований, слишком много негатива.… twitter.com/i/web/status/1…

13:25

Одна из причин негатива — вместе с полезными API, ставившими задачу объяснить устройство HTML, активно навязывались… twitter.com/i/web/status/1…

13:28

HTML Imports вместе со спорными аспектами Shadow DOM оказались камнями преткновения, по вине которых веб-компоненты… twitter.com/i/web/status/1…

13:35

Недостаткам ранней реализации, существовавшей только в Chrome и впоследствии печально известной как “версия 0”, пос… twitter.com/i/web/status/1…

13:44

Веб-компоненты "версии 0" были сложными, далекими от реальных проблем (таких, как стилизация select) и во всех брау… twitter.com/i/web/status/1…

13:49

Вместо того, чтобы сразу признать проблемы, некоторое время команда Chrome делала хорошую мину при плохой игре. Ста… twitter.com/i/web/status/1…

13:58

В разное время над DevRel в области веб-компонентов работали Addy Osmani, Eric Bidelman, Rob Dodson, Monica Dincule… twitter.com/i/web/status/1…

14:04

В 2015 году разработчики браузеров смогли достичь компромисса. Основные недостатки были устранены, и в процессе обс… twitter.com/i/web/status/1…

14:09

Jan Miksovsky, один из участников тех событий, написал статью с детальной хронологией и рассказал о том, как были р… twitter.com/i/web/status/1…

14:13

Но фальстарт, вызванный стремлением Chrome “причинять добро” путем проталкивания сырых API, уже сыграл свою роль. В… twitter.com/i/web/status/1…

14:17

В итоге до сих пор бытует мнение, что Custom Elements и Shadow DOM — детище Google, которое кроме продуктов этой ко… twitter.com/i/web/status/1…

14:22
I specialized in some losers: Cold Fusion, Flash, web components.

But I also got lucky and went big on React earl… twitter.com/i/web/status/1…

Некоторые вообще называют веб-компоненты мертворожденной технологией. Но особенно я был удивлен, увидев их упоминан… twitter.com/i/web/status/1…

I specialized in some losers: Cold Fusion, Flash, web components.

But I also got lucky and went big on React earl… twitter.com/i/web/status/1…

14:27

Ряд компаний, включая и те, где мне довелось поработать, в свое время все же поверили в светлое будущее с компонент… twitter.com/i/web/status/1…

14:36

Но личным опытом разработки на bleeding edge я поделюсь позже. Если, конечно, веселые истории из серии “мыши плакал… twitter.com/i/web/status/1…

14:39

Тред о применении кастомных элементов в 2020. С момента релиза Firefox 63 прошло почти два года, в Safari поддержка… twitter.com/i/web/status/1…

16:58

На сегодняшний день кастомные элементы используют Adobe, Apple, Esri, GitHub, Firefox, IBM, ING, Internet Archive,… twitter.com/i/web/status/1…

17:03

По данным Chrome Platform Status, уровень использования достигает 10% показов страниц. Их методика подсчета и прова… twitter.com/i/web/status/1…

17:10

Причина роста популярности — у ряда крупных компаний есть запрос на framework-agnostic. Типичный юзкейс: библиотека… twitter.com/i/web/status/1…

17:20

На самом деле, от фреймворков поддержка кастомных элементов требует определенных усилий. Набор тестов на совместимо… twitter.com/i/web/status/1…

17:28

Обращаю внимание на то, что с React все не так просто. Есть надежда, что полная совместимость появится в React 18.

github.com/facebook/react…

17:33

Возможно, поэтому некоторые компании поддерживают две реализации своей дизайн-системы — на React и на кастомных эле… twitter.com/i/web/status/1…

17:37

Для разработки в энтерпрайзе кастомные элементы привлекательны возможностью постепенно модернизировать существующий… twitter.com/i/web/status/1…

17:47

При этом стек может быть любым: свой фреймворк (LWC от Salesforce, UI5 от SAP, FAST от Microsoft), набор библиотек… twitter.com/i/web/status/1…

18:04

В Vaadin мы используем кастомные элементы как фундамент для Java-фреймворка, предыдущая версия которого была основа… twitter.com/i/web/status/1…

18:09

Все вышеперечисленное — примеры использования кастомных элементов для создания компонентов интерфейса. Это наиболее… twitter.com/i/web/status/1…

18:36

Интересный сценарий — инкрементальная миграция с помощью кастомных элементов. Этот подход описал Денис Мишунов в до… twitter.com/i/web/status/1…

18:41

Особенность “франкенштейн-миграции” в том, что кастомные элементы и Shadow DOM в данном случае — средство, а не цел… twitter.com/i/web/status/1…

18:46

К похожим юзкейсам я бы отнес микрофронтенды. Кастомные элементы упоминаются как один из элементов концепции, котор… twitter.com/i/web/status/1…

18:56

Раньше точечному использованию веб-компонентов в проектах на другом стеке мешали проблемы с производительностью пол… twitter.com/i/web/status/1…

19:00

Встраиваемые виджеты могли бы не засорять страницу своей разметкой, пряча ее за HTML-тегом. Также им пригодилась бы… twitter.com/i/web/status/1…

19:04

Но вообще использовать Shadow DOM вместе с кастомными элементами не обязательно. Это независимые части стандарта, н… twitter.com/i/web/status/1…

19:07

Разработчики GitHub следуют идее прогрессивного улучшения и используют кастомные элементы без Shadow DOM. Об этом о… twitter.com/i/web/status/1…

19:11

Кастомные элементы GitHub (в частности, меню и модальный диалог) сохраняют часть функций при выключенном JavaScript… twitter.com/i/web/status/1…

19:32

Но этот пример — исключение. Чаще кастомные элементы используют там, где о выключенном JS не заботятся. Это админки… twitter.com/i/web/status/1…

19:38

Среди примеров могу назвать инструменты для CMS от проекта HAX (редакторы для Drupal и Wordpress) и Joomla UI custo… twitter.com/i/web/status/1…

19:40

В концепцию генераторов статики кастомные элементы тоже вписываются (они же сами — часть HTML). Чаще других в этом… twitter.com/i/web/status/1…

19:45

Есть еще одна область, в которой потенциал кастомных элементов, на мой взгляд, далеко не раскрыт. Я имею в виду аль… twitter.com/i/web/status/1…

19:50

Плагины вроде Swiper обычно требуют HTML с определенными классами или атрибутами. Кастомный элемент с Shadow DOM мо… twitter.com/i/web/status/1…

19:57

Напоследок упомяну еще и про такой феномен, как “HTML framework” (термин предложил Paul Bakaus из команды AMP). При… twitter.com/i/web/status/1…

20:04

На этом на сегодня все. Завтра будет больше практических моментов из личного опыта. Еще поговорим о пока не решённы… twitter.com/i/web/status/1…

20:18

# Вторник 78 твитов

Первый тред на сегодня — о том, нужны ли кастомным элементам библиотеки и в каких случаях можно обойтись vanilla JS.

6:45

По моим наблюдениям, у статей о веб-компонентах есть общая проблема: библиотеки вроде lit-element и Stencil упомина… twitter.com/i/web/status/1…

6:48

В итоге возникает ассоциация "кастомные элементы = библиотека” и закономерный вопрос: так ли полезен стандарт, если… twitter.com/i/web/status/1…

6:52

В комментариях к статье Rob Dodson заметил, что веб-компоненты — набор низкоуровневых примитивов. Библиотеки и фрей… twitter.com/i/web/status/1…

7:03
@Rich_Harris @edsilv @FabianCook @justinfagnani However we simply don't see enough value to adopt WC as the foundat… twitter.com/i/web/status/1…

Так это выглядело на бумаге. Но на сегодняшний день реальность такова, что авторы фреймворков не видят смысла испо… twitter.com/i/web/status/1…

@Rich_Harris @edsilv @FabianCook @justinfagnani However we simply don't see enough value to adopt WC as the foundat… twitter.com/i/web/status/1…

7:10

Для начала стоит определиться, какие задачи мы решаем. В моем понимании, задача фреймворков — обновление представле… twitter.com/i/web/status/1…

7:14

Веб-компоненты эту задачу не решают от слова совсем. Они ничего не говорят нам о том, как и когда рендерить — они п… twitter.com/i/web/status/1…

7:17

Об этом, в частности, говорит один из разделов документации React. Изложенная там позиция лишена критики в адрес ве… twitter.com/i/web/status/1…

7:23

Здесь мне видится некоторое столкновение интересов: фреймворки и кастомные элементы реализуют одну и ту же абстракц… twitter.com/i/web/status/1…

7:29

Отсюда и вбросы вроде “web components will replace your framework”. По-моему, от таких заголовков больше вреда, чем… twitter.com/i/web/status/1…

7:32

В ответ на это сторонники фреймворков справедливо замечают, что одних только кастомных элементов в любом случае нед… twitter.com/i/web/status/1…

7:36

Но значит ли это, что библиотека / фреймворк нужны всегда? Я так не думаю. Бывают случаи, где тащить лишние килобай… twitter.com/i/web/status/1…

7:38

Пример: компонент рендерит DOM один раз, в дальнейшем нужно обновлять только атрибуты или CSS-свойства. Я не вижу с… twitter.com/i/web/status/1…

7:57

Когда-то у Polymer был слоган “jQuery для веб-компонентов” — то есть, набор костылей, потребность в которых со врем… twitter.com/i/web/status/1…

8:04

Библиотеки позволяют писать меньше бойлерплейт-кода и не думать о некоторых нюансах, но в чем-то и ограничивают. Не… twitter.com/i/web/status/1…

8:18

Я бы выделил три основных типа библиотек:

— основанные на классах (lit-element, FAST),
— основанные на функциях (H… twitter.com/i/web/status/1…

8:25

В этой статье перечислены более 40 способов написать один и тот же простой веб-компонент, с бенчмарками и сравнение… twitter.com/i/web/status/1…

8:31

Статья демонстрирует, что при использовании ванильных кастомных элементов размер бандла быстро разрастается, когда… twitter.com/i/web/status/1…

8:40

Мне этот факт напоминает расхожую фразу: начнешь писать на чистом JS — рано или поздно напишешь свой фреймворк. Что… twitter.com/i/web/status/1…

8:52

Если вы пишете на библиотеке — стоит понимать, как она работает. В этом помогает чтение исходников и особенно тесто… twitter.com/i/web/status/1…

9:01

О своем опыте применения этих знаний в написании кастомных элементов без зависимостей расскажу в следующем треде.

9:05

Тред про кастомные элементы без зависимостей, с примерами из личного опыта. И заодно немного о best practices.

11:03

Кастомные элементы без зависимостей писали еще 5 лет назад, на “версии 0”. Вот, например, популярный в то время ком… twitter.com/i/web/status/1…

11:06

Правда, долгое время была одна неявная зависимость: полифилл. Его нужно было подключать на страницу отдельным скрип… twitter.com/i/web/status/1…

11:11

Кроме “официального” полифилла от разработчиков Google, был еще document-register-element от Andrea Giammarchi. Он… twitter.com/i/web/status/1…

11:19

Еще один момент: кастомные элементы требуют нативных ES2015-классов. Это тоже своего рода зависимость. ES5-код, пол… twitter.com/i/web/status/1…

11:27

Решается эта проблема с помощью с помощью манки-патчинга HTMLElement с добавлением вызова Reflect.construct. В сост… twitter.com/i/web/status/1…

11:28

По вышеуказанной причине в сообществе веб-компонентов принято публиковать в npm исходный код кастомных элементов в… twitter.com/i/web/status/1…

11:32
@mlfrg У библиотеки одна зависимость — React :)

Итак, рассказываю о двух своих недавних пет-проектах. Это “клоны” React-компонентов, написанные на ванильных кастом… twitter.com/i/web/status/1…

@mlfrg У библиотеки одна зависимость — React :)

11:46

Так появился проект vanilla-colorful, порт колор-пикера react-colorful от @Omgovich (если пропустили его неделю, об… twitter.com/i/web/status/1…

11:50
@pepelsbey @mlfrg Переписал на Custom Elements. Вот теперь действительно ноль зависимостей 🙂

github.com/web-padawan/va…

От идеи до реализации прошло всего несколько дней. Замечу, что опыта разработки на React у меня нет. Исходный код r… twitter.com/i/web/status/1…

@pepelsbey @mlfrg Переписал на Custom Elements. Вот теперь действительно ноль зависимостей 🙂

github.com/web-padawan/va…

12:05

Подробнее можно узнать в 248 выпуске подкаста Веб-стандарты, где мы с @Omgovich обсуждали наши колор-пикеры и сравн… twitter.com/i/web/status/1…

12:07

Второй мой проект — vanilla-hamburger: набор гамбургер-кнопок с разными анимациями, порт библиотеки hamburger-react… twitter.com/i/web/status/1…

12:18

Оба проекта написаны на TypeScript и покрыты тестами. Об этом, пожалуй, сделаю чуть позже отдельный тред. А пока не… twitter.com/i/web/status/1…

12:25

Как и стандартные HTML элементы, кастомный элемент может иметь атрибуты и свойства. По умолчанию они не связаны меж… twitter.com/i/web/status/1…

12:34

В этом примере я использую Symbol, чтобы эмулировать приватное поле. Это полезно, поскольку иначе в автокомплите и… twitter.com/i/web/status/1…

12:43

В сеттерах свойств принято вызывать сайд-эффекты (например, обновлять DOM). Значения по умолчанию задаются в constr… twitter.com/i/web/status/1…

13:01

Свойство может быть установлено до того, как элемент связан с классом. При этом геттер и сеттер будут "затенены" (s… twitter.com/i/web/status/1…

13:10

С помощью пары строк кода реализуем простейший асинхронный рендеринг. Этот подход (batch updates) позволяет обновля… twitter.com/i/web/status/1…

13:20
Какой-то Angular первых версий twitter.com/jsunderhood/st…

Насчет сравнения с “Angular первых версий” — на самом деле, намного больше все это похоже на lit-element. Если точн… twitter.com/i/web/status/1…

Какой-то Angular первых версий twitter.com/jsunderhood/st…

13:26

Еще один интересный прием — встроенный метод handleEvent для обработчиков событий. Он позволяет обойтись без исполь… twitter.com/i/web/status/1…

13:35

Некоторые из описанных приемов можно увидеть в проекте HowTo: Components от авторов Web Fundamentals. Он не обновля… twitter.com/i/web/status/1…

13:43

Также на Web Fundamentals есть список best practices для кастомных элементов. Там достаточно подробно описаны атриб… twitter.com/i/web/status/1…

13:48

В качестве более обзорного чтения советую Gold Standard Checklist от Jan Miksovky, на чьи работы я часто ссылаюсь.… twitter.com/i/web/status/1…

13:54

И в завершение треда — еще один чеклист от Justin Fagnani о том, как публиковать кастомные элементы в npm. Есть пол… twitter.com/i/web/status/1…

13:59

Тред о кастомных элементах на TypeScript и тестировании.

17:10

Для начала о TypeScript. Прежде всего, кастомный элемент стоит добавить в интерфейс HTMLElementTagNameMap. Это сдел… twitter.com/i/web/status/1…

17:12

Если вы используете React, нужно также добавить определение кастомного элемента в специальный интерфейс JSX.Intrins… twitter.com/i/web/status/1…

17:23

Еще можно типизировать кастомные события, которые используются элементом, для вывода типа event.detail в addEventLi… twitter.com/i/web/status/1…

17:33

Поскольку кастомные элементы используют нативные классы, общая логика в них обычно выделяется в миксины. По сути ми… twitter.com/i/web/status/1…

17:54

Подробнее о том, как работают миксины в TypeScript, можно почитать в статье Николая Платонова. Кроме преимуществ, у… twitter.com/i/web/status/1…

18:05

Перейдем к тестированию. Кастомные элементы можно тестировать с помощью Jest с тех пор, как была добавлена их подде… twitter.com/i/web/status/1…

18:21

Пример конфига Jest с использованием TypeScript для тестирования проекта на lit-element можно найти в темплейте Hov… twitter.com/i/web/status/1…

18:24

В Vaadin мы тестируем наши веб-компоненты в реальных браузерах. Это помогает обнаружить баги, которые воспроизводят… twitter.com/i/web/status/1…

18:29

Раньше в экосистеме Polymer был свой тест-раннер: web-component-tester. Необходимость в нем была обусловлена исполь… twitter.com/i/web/status/1…

18:32

Сейчас мы переходим на Web Test Runner, который разрабатывает Lars den Bakker из ING. Он быстрый, поддерживает ES-м… twitter.com/i/web/status/1…

18:37
@jsunderhood А почему не получается использовать Mocha/Jest и другие классические инструменты?

Почему переходим не на Jest? Во-первых, нам часто приходится дебажить edge cases в конкретном браузере. Кроме того,… twitter.com/i/web/status/1…

@jsunderhood А почему не получается использовать Mocha/Jest и другие классические инструменты?

18:45

Также в Web Test Runner есть и экспериментальная поддержка тестирования скриншотами. До сих пор мы использовали Gem… twitter.com/i/web/status/1…

18:47

Для тестирования компонентов на TypeScript в Web Test Runner есть плагин на базе esbuild. Компиляция в esbuild зани… twitter.com/i/web/status/1…

18:55

Пример конфигурации Web Test Runner и собственно тесты для кастомных элементов можно найти в моих проектах vanilla-… twitter.com/i/web/status/1…

19:00

Я обещал рассказать о не решенных проблемах кастомных элементов. В этом треде перечислю основные из них.

19:12

В моем списке есть пробелы, требующие доработок и новых API в браузерах, но это еще полбеды. На мой взгляд, более с… twitter.com/i/web/status/1…

19:13

Проблема № 1: кастомные элементы не работают с выключенным JS. Это заметно ограничивает область их применения. Есть… twitter.com/i/web/status/1…

19:16

Проблема № 2: кастомные элементы не имеют кросс-браузерной поддержки форм. Form associated custom elements API уже… twitter.com/i/web/status/1…

19:20

Проблема № 3: кастомный элемент с одним и тем же тегом можно определить только один раз. Это значит, что на страниц… twitter.com/i/web/status/1…

19:23

Это одна из причин, почему Polymer долго использовал Bower: там плоское дерево и установить две версии одного пакет… twitter.com/i/web/status/1…

19:28

В Vaadin мы обходим эту проблему с помощью pnpm. Там есть возможность гибкой настройки с помощью pnpmfile.js. Верси… twitter.com/i/web/status/1…

19:32

Проблема № 4: поскольку переопределять кастомные элементы нельзя, hot module replacement не работает. Есть полифилл… twitter.com/i/web/status/1…

19:37

Проблема № 5: кастомные элементы регистрируются глобально. В сочетании с невозможностью их переопределения это крит… twitter.com/i/web/status/1…

19:40

Решить эту проблему призван черновик Scoped Custom Element Registries, над которым работают представители Google и… twitter.com/i/web/status/1…

19:43

Пробная реализация в виде миксина для lit-element есть в проекте Open Web Components. Имеется ряд ограничений, в ча… twitter.com/i/web/status/1…

19:47

Иногда базовые классы специально отделяют от определений кастомных элементов и выносят в отдельные файлы без сайд-э… twitter.com/i/web/status/1…

19:53
@jsunderhood Я бы в список добавил еще хаотичный порядок connectedCallback, из-за которого нельзя делать нормальную… twitter.com/i/web/status/1…

Из комментариев: проблема № 6, связанная с жизненным циклом. Мне с ней сталкиваться не приходилось, но реализованно… twitter.com/i/web/status/1…

@jsunderhood Я бы в список добавил еще хаотичный порядок connectedCallback, из-за которого нельзя делать нормальную… twitter.com/i/web/status/1…

20:00

Проект HowTo: Components для решения проблем с порядком загрузки использует Promise внутри connectedCallback. Как я… twitter.com/i/web/status/1…

20:10

Напоследок упомяну некоторые черновики новых API, которые в перспективе могут облегчить жизнь разработчикам кастомн… twitter.com/i/web/status/1…

20:13

Второй пример — кастомные псевдо-классы, доступные за флагом в Chrome 79+. Скорее всего они, как и кастомные CSS св… twitter.com/i/web/status/1…

20:21

Наконец, одно из недавних дополнений к стандарту — способность указывать ARIA-роли и поведение по умолчанию без исп… twitter.com/i/web/status/1…

20:27

На сегодня все. Завтра поговорим о Shadow DOM, о том, что значит его изоляция на практике и какие ограничения она накладывает.

20:31

# Среда 84 твита

Сегодняшняя тема — Shadow DOM, его возможности и ограничения. Начнем с треда о главной проблеме, которую Shadow DOM… twitter.com/i/web/status/1…

6:59

Этим летом я выступал на DevParty Russia с докладом “Shadow DOM: вдали от проторенных троп”. Тред отчасти написан п… twitter.com/i/web/status/1…

7:02

“Проторенной тропой” я называю способы инкапсуляции стилей, ставшие традиционными: БЭМ и другие методологии, CSS mo… twitter.com/i/web/status/1…

7:06

Сразу определимся с терминами: инкапсуляция = стили компонента не протекают наружу. Изоляция = то же самое плюс отс… twitter.com/i/web/status/1…

7:12

В теории изоляция кажется полезной. Но как показала практика, в качестве универсального решения этот подход не рабо… twitter.com/i/web/status/1…

7:16

В статье на Web Fundamentals есть фраза “Shadow DOM fixes CSS and DOM”. Я бы сказал, все обстоит наоборот: он ломае… twitter.com/i/web/status/1…

7:20

Пример: если на странице есть reset, normalize или глобальные стили для box-sizing, внутри shadow root они не приме… twitter.com/i/web/status/1…

7:28

Еще один момент: обычно, вне зависимости от выбранного способа инкапсуляции стилей, его принято строго придерживать… twitter.com/i/web/status/1…

7:33

Но повсеместное использование Shadow DOM чревато рядом последствий. Mattia Astorino приводит хорошую аналогию: заве… twitter.com/i/web/status/1…

7:37

Это ключевой момент: изоляция Shadow DOM подобна той, которой обладают встроенные HTML-элементы. О том, как это выг… twitter.com/i/web/status/1…

7:40

Кстати, заглянуть внутрь <input type=“range”> или <video> можно не только в браузерах на основе Chromium (галочка “… twitter.com/i/web/status/1…

7:50

Изоляция исключает конфликты из-за имен классов, селекторов по ID и тегам. Это полезно, но в реальных проектах регу… twitter.com/i/web/status/1…

7:58

Раньше в слаке Polymer регулярно звучал вопрос “как использовать Bootstrap внутри Shadow DOM” (стоп, а нужна ли тог… twitter.com/i/web/status/1…

7:59

Что примечательно, такие вопросы задают не только новички. То есть, причина не в отсутствии понимания принципов изо… twitter.com/i/web/status/1…

8:03

С одной стороны, Shadow DOM позволяет забыть об именовании классов. Но, устраняя одну из причин появления CSS-метод… twitter.com/i/web/status/1…

8:20

В результате у Material Web Components мы можем внутри shadow DOM увидеть классы, именуемые по БЭМ (правда, это свя… twitter.com/i/web/status/1…

8:23

Подытожим: изоляция Shadow DOM предлагает решение одной из важных проблем CSS, но при этом приносит новые. Иногда е… twitter.com/i/web/status/1…

8:34
Hey CSS friends, does this make sense to you?

@ scope (.airplane) end (.passenger_cabin, .cockpit, .luggage_compa… twitter.com/i/web/status/1…

Добавлю, что Nicole Sullivan из Google уже зондирует почву на предмет альтернативной инкапсуляции на CSS media quer… twitter.com/i/web/status/1…

Hey CSS friends, does this make sense to you?

@ scope (.airplane) end (.passenger_cabin, .cockpit, .luggage_compa… twitter.com/i/web/status/1…

8:38
@jsunderhood Я, кстати, недавно обратил внимание, что некоторые компании используют Shadow DOM для того, чтобы дела… twitter.com/i/web/status/1…

Встраиваемые виджеты — действительно один из тех случаев, где изоляция оправдана. Кстати, не знал, что Grammarly ис… twitter.com/i/web/status/1…

@jsunderhood Я, кстати, недавно обратил внимание, что некоторые компании используют Shadow DOM для того, чтобы дела… twitter.com/i/web/status/1…

9:10

Кроме изоляции стилей, Shadow DOM влияет и на то, каким образом они добавляются на страницу. Тред о том, что это зн… twitter.com/i/web/status/1…

9:16

Размещать стили внутри Shadow DOM обычно рекомендуется с помощью элемента <style>. Для тех, кто придерживается стро… twitter.com/i/web/status/1…

9:19

Современные браузеры кэшируют содержимое <style>, так что на производительность этот способ не влияет. Можно исполь… twitter.com/i/web/status/1…

9:21

Еще есть Constructable Stylesheets — эксперимент, реализованный только в Chrome и по их замерам более производитель… twitter.com/i/web/status/1…

9:29

По инициативе разработчиков WebKit идет обсуждение, каким образом устранить выявленные недостатки в этом API. В свя… twitter.com/i/web/status/1…

9:31

Важен этот черновик тем, что является одной из ступенек на пути к Cascading Stylesheet Module Scripts. В перспектив… twitter.com/i/web/status/1…

9:38

Рабочее название этого API — “CSS modules”. Хотя против него были возражения в связи с тем, что существует популярн… twitter.com/i/web/status/1…

9:40

Но черновики — вопрос будущего, а пока мы говорим об элементах <style>, добавление которых требует JS. Стоит ли пол… twitter.com/i/web/status/1…

9:45

Пример реализации для React — библиотека Cease, всего 30 строк и 500 байт без зависимостей. Советую заглянуть в ее… twitter.com/i/web/status/1…

9:47

Также рекомендую пример конфигурации webpack и style-loader для работы с Shadow DOM в проектах на React и Vue, прив… twitter.com/i/web/status/1…

9:50

Еще один важный аспект Shadow DOM — кастомизация стилей. При наличии изоляции это становится проблемой, поскольку н… twitter.com/i/web/status/1…

12:46

Первое, о чем стоит помнить: наследуемые свойства (color, font-family и другие) на элементе с shadow root проникают… twitter.com/i/web/status/1…

12:48

Кастомные свойства (CSS-переменные) являются наследуемыми по умолчанию и тоже пересекают границы Shadow DOM. Если о… twitter.com/i/web/status/1…

12:52

Кастомные свойства можно комбинировать с селектором :host() и устанавливать их значения в зависимости от атрибута н… twitter.com/i/web/status/1…

13:03

О селекторах :host и :host() можно почитать на MDN и в учебнике Ильи Кантора. Замечу, что :host-context() есть толь… twitter.com/i/web/status/1…

13:07

Долгое время кастомные свойства были единственным способом кастомизации в библиотеках веб-компонентов. Это было не… twitter.com/i/web/status/1…

13:11

Polymer и компоненты Paper Elements использовали механизм CSS-миксинов. Они так и не стали стандартом и не были реа… twitter.com/i/web/status/1…

13:18

При использовании кастомных элементов можно модифицировать стили с помощью наследования: класс-потомок переопределя… twitter.com/i/web/status/1…

13:31

Не так давно (Firefox 72, Safari 13.1) появились CSS Shadow Parts. На сегодняшний день это рекомендуемый способ кас… twitter.com/i/web/status/1…

13:32

Вкратце, псевдоэлемент ::part() позволяет переопределять стили отдельных элементов в Shadow DOM, имеющих атрибут pa… twitter.com/i/web/status/1…

13:36

Изначально вместе с ::part() предлагался также селектор ::theme() для решения проблемы темизации компонентов. На да… twitter.com/i/web/status/1…

13:44

Единственным механизмом темизации пока остаются кастомные CSS свойства. Cassondra Roberts из Red Hat предложила под… twitter.com/i/web/status/1…

13:49
@jsunderhood Вот здесь интересная штука получается.

Vaadin предоставляет компоненты для Enterprise-компаний, котор… twitter.com/i/web/status/1…

Вопрос о Shadow DOM и CSP в Vaadin: на самом деле клиент Java-фреймворка до сих пор использует GWT и поэтому там ну… twitter.com/i/web/status/1…

@jsunderhood Вот здесь интересная штука получается.

Vaadin предоставляет компоненты для Enterprise-компаний, котор… twitter.com/i/web/status/1…

14:06

Тред про ограничения Shadow DOM и связанные с ними проблемы.

17:43

Как и кастомные элементы, Shadow DOM имеет ряд ограничений, наиболее важные из которых обусловлены самим устройство… twitter.com/i/web/status/1…

17:44

Проблема № 1: та же, что и для кастомных элементов — Shadow DOM не работает с выключенным JS. Этот факт делает нево… twitter.com/i/web/status/1…

17:48

Кроме того, это также означает проблемы с SEO. В качестве решения в Google советуют Rendertron на базе Puppeteer, к… twitter.com/i/web/status/1…

17:50

Существует черновик API декларативного Shadow DOM, над которым работает Mason Freed из Google. Реализация есть в Ch… twitter.com/i/web/status/1…

18:04
Декларативный Shadow DOM для изоляции стилей на примере слайдов @shower_me! Развиваю старую идею, как имитировать п… twitter.com/i/web/status/1…

Видео с примером использования декларативного Shadow DOM для изоляции стилей недавно опубликовал Вадим Макеев.

Декларативный Shadow DOM для изоляции стилей на примере слайдов @shower_me! Развиваю старую идею, как имитировать п… twitter.com/i/web/status/1…

18:07

К стабильной версии декларативный Shadow DOM еще не готов. Идет обсуждение рисков, связанных с XSS и санитайзерами.… twitter.com/i/web/status/1…

18:11

Проблема № 2: изоляция Shadow DOM создает преграду для связей по ID. В итоге ARIA-атрибуты вроде aria-labelledby не… twitter.com/i/web/status/1…

18:14

О том, как эта проблема проявляется на практике, написал Devon Govett из Adobe. Он поделился выводами из своего экс… twitter.com/i/web/status/1…

18:17

Решением может стать Accessibility Object Model (AOM). Это целый набор экспериментальных API, которые пока находятс… twitter.com/i/web/status/1…

18:33

Одна из идей в рамках AOM — атрибут, позволяющий явно указывать ID элементов, к которым необходим доступ извне. Что… twitter.com/i/web/status/1…

18:41

Проблема № 3: изоляция затрагивает также и элемент <form>. Если кнопка в форме находится внутри shadow root, отправ… twitter.com/i/web/status/1…

18:47

Справедлива эта проблема и для элементов <input> внутри Shadow DOM. В прошлом Polymer предлагал компонент для сериа… twitter.com/i/web/status/1…

18:56

Проблема № 4: отсутствие API для работы с выделенным текстом внутри Shadow DOM при использовании window.getSelectio… twitter.com/i/web/status/1…

18:59

В Chrome этот метод реализован на shadow root, в Firefox работает глобальный метод. Но в Safari действует изоляция,… twitter.com/i/web/status/1…

19:03

Sam Thorogood из Google написал экспериментальный полифилл, позволяющий обойти это ограничение в Safari. Для одного… twitter.com/i/web/status/1…

19:12

Проблема № 5: проблемы с автозаполнением форм. В баг-трекере Chromium есть issue на эту тему, и ему уже больше трех… twitter.com/i/web/status/1…

19:16

Затрагивает эта проблема и браузерные расширения, прежде всего менеджеры паролей. Каждому из них потребуется соотве… twitter.com/i/web/status/1…

19:25

Проблема № 6: изоляция стилей не работает в случае с font-face и keyframes. Решение этой проблемы требует стандарти… twitter.com/i/web/status/1…

19:34

Проблема № 7: сторонние скрипты. Google Tag Manager, A/B тесты, аналитика и все, что так любят добавлять на сайт ма… twitter.com/i/web/status/1…

19:39
@jsunderhood Как тестировать страницу с ShadowDOM при помощи Selenium?

Вроде был /deep/ комбинатор, но он же deprecated?

Проблема № 8: тестирование. На сегодняшний день Shadow DOM уже поддерживается в Cypress, TestCafe, WebdriverIO и Pl… twitter.com/i/web/status/1…

@jsunderhood Как тестировать страницу с ShadowDOM при помощи Selenium?

Вроде был /deep/ комбинатор, но он же deprecated?

19:45
@jsunderhood Как может быть поддержка в WebdriverIO, но не в Selenium? У них же один и тот же webdriver protocol

Насчет WebdriverIO: поддержка Shadow DOM появилась в версии 5.5.0 и реализация у них своя (поскольку в протоколе We… twitter.com/i/web/status/1…

@jsunderhood Как может быть поддержка в WebdriverIO, но не в Selenium? У них же один и тот же webdriver protocol

19:51

Есть issue на эту тему, где в том числе поделился опытом Diego Ferreiro Val из Salesforce. Согласиться на добавлени… twitter.com/i/web/status/1…

19:53

Вроде бы, все основные проблемы перечислил. Есть и другие — например, в Chrome в Shadow DOM не работает перевод стр… twitter.com/i/web/status/1…

19:59

Еще есть баг на iOS, связанный с кнопками быстрого перехода между полями формы в Shadow DOM. Он был исправлен совсе… twitter.com/i/web/status/1…

20:03

В качестве заключения: проблем у Shadow DOM по-прежнему много, и о них желательно знать заранее (или придется город… twitter.com/i/web/status/1…

20:08
@jsunderhood @vergilyush Недавно обнаружил, что порнхаб использует Shadow DOM для рекламных блоков

Да, чуть не забыл: реклама же! Мне однажды тоже довелось встретить div с shadow root в рекламном баннере Яндекс-поч… twitter.com/i/web/status/1…

@jsunderhood @vergilyush Недавно обнаружил, что порнхаб использует Shadow DOM для рекламных блоков

20:10

Так или иначе, статистика показов страниц в Chrome Platform Status говорит сама за себя: по сравнению с кастомными… twitter.com/i/web/status/1…

20:13

В завершение темы Shadow DOM — небольшой тред о слотах и композиции, которые я как-то обошел стороной.

20:21

Элемент <slot> является частью Shadow DOM и включен в стандарт WHATWG. Во времена “версии 0” в Chrome ему предшеств… twitter.com/i/web/status/1…

20:22

Назначение <slot> — проекция контента из так называемого “light DOM” (снаружи) в определенную точку внутри Shadow D… twitter.com/i/web/status/1…

20:26

Компонент с Shadow DOM может применять стили к переданным в слоты элементам с помощью псевдоэлемента ::slotted(). В… twitter.com/i/web/status/1…

20:28

На практике это означает, что если внутрь слота передать элемент <ul>, то стили к самому списку с помощью ::slotted… twitter.com/i/web/status/1…

20:31

При добавлении или удалении элементов на элементе <slot> возникает событие slotchange. Оно не является синхронным и… twitter.com/i/web/status/1…

20:37

Кстати, лучший способ более детально ознакомиться с API, о которых я рассказываю (в том числе и слотами) — проект w… twitter.com/i/web/status/1…

20:45

Интересный факт: Svelte 3 отказался от нативных слотов, потому что контент в них попадает сразу, тогда как по мнени… twitter.com/i/web/status/1…

20:49

На мой взгляд, это достаточно показательный момент: фреймворки предпочитают свою модель композиции, поскольку она л… twitter.com/i/web/status/1…

20:52

Vue поддерживает компиляцию в кастомные элементы, используя при этом нативные слоты (но scoped slots не поддерживаю… twitter.com/i/web/status/1…

20:56

Одна из возможных перспектив применения слотов — кастомизация нативных элементов (в первую очередь, select). Этой т… twitter.com/i/web/status/1…

21:00

Этот проект находится в стадии прототипирования (intent to prototype был опубликован в августе этого года). Кроме с… twitter.com/i/web/status/1…

21:05

Заодно стоит упомянуть проект Open UI, в рамках которого разработчики Edge, Salesforce и Chrome обсуждают улучшения… twitter.com/i/web/status/1…

21:12

На сегодня все. Завтра поговорим про элемент <template> и его перспективы, а также о разработке на ES-модулях в браузере.

21:13

# Четверг 45 твитов

Сегодня начнем с треда про элемент <template>. Раньше он считался частью веб-компонентов, хотя сейчас о нем вспоминают реже.

7:27

Содержимое <template> является инертным: элементы не попадают в DOM, скрипты не выполняются, стили не применяются.… twitter.com/i/web/status/1…

7:30

Получить содержимое <template> можно с помощью свойства content, используя один из двух методов: content.cloneNode(… twitter.com/i/web/status/1…

7:34

На первый взгляд этот элемент прост, и появился он в браузерах намного раньше Custom Elements и Shadow DOM. Тем не… twitter.com/i/web/status/1…

7:52

Для IE11 есть полифилл, который имеет ограничения. Например, нельзя использовать <template> внутри элементов <table… twitter.com/i/web/status/1…

7:56

Темплейты в Polymer использовались с кастомным синтаксисом для data binding. Вместе с HTML Imports это позволяло пи… twitter.com/i/web/status/1…

8:01

Впрочем, создавать <template> можно и в JavaScript. Это полезно для ванильных кастомных элементов: по сравнению с и… twitter.com/i/web/status/1…

8:07

Именно этот способ использует библиотека lit-html от команды Polymer, синтаксис которой основан на tagged template… twitter.com/i/web/status/1…

8:26

Замечу, что lit-html в этом плане не уникальна. Более того, Andrea Giammarchi утверждает, что в hyperHTML он реализ… twitter.com/i/web/status/1…

8:30

Теперь о перспективах <template>. Недостаток этого элемента в том, что он не предоставляет API для интерполяции зна… twitter.com/i/web/status/1…

8:40

Наряду с AOM, это один из примеров инициативы со стороны WebKit. Из моих предыдущих твитов могло сложиться впечатле… twitter.com/i/web/status/1…

8:43

Развитием идеи Template instantiation является новый черновик DOM Parts за общим авторством разработчиков WebKit и… twitter.com/i/web/status/1…

8:51

В перспективе DOM Parts могут сделать манипуляции с DOM более эффективными и упростить написание библиотек вроде li… twitter.com/i/web/status/1…

8:58

Напоследок упомяну еще один черновик, предложенный после удаления HTML Imports. Он называется HTML modules и в теор… twitter.com/i/web/status/1…

9:00

Как и CSS-модули, которые я упоминал вчера, этот черновик долгое время был заблокирован, но теперь возобновление ра… twitter.com/i/web/status/1…

9:04

Возможно, в будущем <template> станет опорой для неких новых конструкций, меняющих наши представления об HTML. Но п… twitter.com/i/web/status/1…

9:11

Тред о разработке на ES-модулях в браузерах.

16:29

Небольшое предисловие: Polymer всегда продвигал идею bundler-free разработки и HTML Imports в нее хорошо вписывалис… twitter.com/i/web/status/1…

16:30

Polymer 1 был полностью написан на ES5, поэтому Babel тоже не требовался — достаточно было поднять nginx. Идиллию н… twitter.com/i/web/status/1…

16:39

Кстати, еще команда Polymer пыталась продвигать идею HTTP/2 server push с помощью prpl-server. Популярности этот по… twitter.com/i/web/status/1…

16:44

К моменту выхода Polymer 3 в 2017 году все основные браузеры реализовали поддержку ES-модулей. Переход на них был л… twitter.com/i/web/status/1…

16:46

На сегодняшний день ES-модули имеют более 90% поддержки. Они реализованы везде, кроме IE11 — для него многие совету… twitter.com/i/web/status/1…

16:49

Единственная проблема — отсутствие поддержки bare module specifiers, стиля импортов Node.js. Браузеры понимают толь… twitter.com/i/web/status/1…

16:54

В будущем эту проблему планируется решить с помощью Import Maps. Этот черновик предложил Domenic Denicola из Google… twitter.com/i/web/status/1…

16:57

Полифилл пропозала Import Maps для браузеров с поддержкой ES-модулей предоставляет пакет ES Module Shims.

npmjs.com/package/es-mod…

17:06

Две статьи о разработке на ES-модулях написал Lars Den Bakker из проекта Open Web Components. В первой из них он оп… twitter.com/i/web/status/1…

17:13

Вторая часть статьи посвящена проекту es-dev-server. Это сервер для локальной разработки на Koa, который поддержива… twitter.com/i/web/status/1…

17:19

es-dev-server пользуется популярностью среди разработчиков веб-компонентов на lit-element. Команда Polymer рекоменд… twitter.com/i/web/status/1…

17:25

Новая версия es-dev-server получила название Web Dev Server. Он поддерживает некоторые плагины Rollup, а также пред… twitter.com/i/web/status/1…

17:44

Есть и другие похожие инструменты. Пожалуй, самый известный — Snowpack, который разрабатывает Fred K. Schott. Между… twitter.com/i/web/status/1…

17:46

Идея Snowpack в двух словах — запустить Rollup один раз после npm install, скомпилировать все зависимости в папку w… twitter.com/i/web/status/1…

17:52

С выходом версии 2.0 Snowpack превратился в систему сборки с поддержкой TypeScript, JSX, React, Vue и Svelte и банд… twitter.com/i/web/status/1…

18:07

Кроме Snowpack, Fred K. Schott также запустил Skypack — поисковую систему и CDN для пакетов, поддерживающих ES-моду… twitter.com/i/web/status/1…

18:14

Опытом разработки на ES-модулях с использованием Snowpack поделился Bryan Braun. В статье описаны ряд аспектов: зав… twitter.com/i/web/status/1…

18:24
As I was going to bed, I had an idea about a no-bundler dev setup (using native browser ES imports), but with suppo… twitter.com/i/web/status/1…

Теперь еще об одном проекте. В апреле идеей разработки на ES-модулях загорелся Эван Ю. Отсчет можно вести с этого т… twitter.com/i/web/status/1…

As I was going to bed, I had an idea about a no-bundler dev setup (using native browser ES imports), but with suppo… twitter.com/i/web/status/1…

18:32
@youyuxi seems you got quite inspired by es-dev-server 🤗

is there maybe room to collaborate? having full support f… twitter.com/i/web/status/1…

Дальше, по-видимому, Эван увидел мой ретвит, где я упомянул es-dev-server. Вскоре в его проекте появились заимствов… twitter.com/i/web/status/1…

@youyuxi seems you got quite inspired by es-dev-server 🤗

is there maybe room to collaborate? having full support f… twitter.com/i/web/status/1…

18:34

Сегодня Vite находится в стадии release candidate. Его документация содержит упоминания es-dev-server и Snowpack с… twitter.com/i/web/status/1…

18:40

Кстати о HMR: авторы Vite и Snowpack при участии Jovi De Croock (Preact) работают над черновиком реализации соответ… twitter.com/i/web/status/1…

18:45

Замечу, что эта спецификация HMR имеет ряд отличий от реализации Hot Module Replacement в webpack. Их сравнение при… twitter.com/i/web/status/1…

18:51

Недавно экспериментальная поддержка HMR на основе этой спецификации появилась также и в Web Dev Server в качестве п… twitter.com/i/web/status/1…

18:59

До сих пор я говорил об инструментах. Но есть и еще один момент: многие пакеты в npm до сих пор не имеют ESM-версии… twitter.com/i/web/status/1…

19:06

В рамках esm-bundle для некоторых популярных пакетов настроена автоматическая публикация. Вот, например, версия Cha… twitter.com/i/web/status/1…

19:12

Также стоит упомянуть утилиту Dual Publish от Андрея Ситника. Она помогает настроить публикацию ESM и CommonJS верс… twitter.com/i/web/status/1…

19:21

Подводя итоги, скажу, что на сегодняшний день ES-модули можно использовать не только как compilation target, но и в… twitter.com/i/web/status/1…

19:33

На сегодня все. Завтра поделюсь опытом поддержки библиотеки компонентов в open source. Кроме того, в честь пятницы… twitter.com/i/web/status/1…

19:43

# Пятница 42 твита

@jsunderhood для всех интересующихся esm в браузерах, мы недавно создали канал на дискорде, приходите похоливарить: discord.gg/sDcJydJ

В комментариях поделились ссылкой на дискорд о ES-модулях.

@jsunderhood для всех интересующихся esm в браузерах, мы недавно создали канал на дискорде, приходите похоливарить: discord.gg/sDcJydJ

7:06

Кстати, пользуясь случаем, приглашаю в русскоязычный чат о веб-компонентах в Telegram (приходите холиварить и к нам… twitter.com/i/web/status/1…

7:08

В этом треде поделюсь опытом трех лет поддержки библиотеки веб-компонентов в open source и расскажу о превозмогании трудностей.

7:56

Как я уже упоминал, компоненты Vaadin написаны на Polymer. Почти весь код до сих пор на Polymer 2 и поэтому использ… twitter.com/i/web/status/1…

7:59

Для конвертации в Polymer 3 у нас есть CLI-утилита. Любая версия компонента доступна в Bower и npm одновременно, но… twitter.com/i/web/status/1…

8:05

Подход, где каждый компонент — отдельный npm пакет, имеет свои недостатки. Например, нужно следить за версиями, что… twitter.com/i/web/status/1…

8:11

Кроме того, мы поддерживаем несколько минорных версий и иногда бэкпортим фиксы. В таких случаях важно следить за np… twitter.com/i/web/status/1…

8:16

Количество репозиториев тоже создает сложности. Мажорные версии нужно релизить в правильном порядке, обновляя при э… twitter.com/i/web/status/1…

8:23

Надеюсь, в будущем удастся перевести разработку библиотеки в монорепу и унифицировать версии. Для API компонентов н… twitter.com/i/web/status/1…

8:28

Задача осложняется тем, что у Vaadin есть LTS-релизы и компоненты на Polymer 2 нашей команде предстоит поддерживать… twitter.com/i/web/status/1…

8:33

Много репозиториев = много билдов в CI. Мы пока используем Travis, а у него лимит 5 free jobs на организацию. Отпра… twitter.com/i/web/status/1…

8:40

Недавно в Travis объявили об изменении ценовой модели. Вкратце, безлимит для open source проектов заканчивается. До… twitter.com/i/web/status/1…

8:52

Мы постепенно переходим с Travis на GitHub Actions. Пока общее впечатление положительное. Огорчает отсутствие возмо… twitter.com/i/web/status/1…

9:02

Для тестирования мы используем SauceLabs. У них есть бесплатный план для open source по запросу. Правда, как-то раз… twitter.com/i/web/status/1…

9:07
@jsunderhood Как у вас работают скриншотные тесты? Визуальный дифф в консоль не вывести.

Как смотреть результаты с… twitter.com/i/web/status/1…

Насчет тестов скриншотами: с этим у нас пока все печально. Каждый раз приходится смотреть локально, что именно слом… twitter.com/i/web/status/1…

@jsunderhood Как у вас работают скриншотные тесты? Визуальный дифф в консоль не вывести.

Как смотреть результаты с… twitter.com/i/web/status/1…

9:14

При разработке на GitHub важен удобный project board. Несколько лет назад мы использовали Waffle, идеально подходив… twitter.com/i/web/status/1…

9:35

После Waffle пробовали GitHub Projects, там оказалось несколько недостатков: не было возможности связать issue и PR… twitter.com/i/web/status/1…

9:55

Разработка продукта в open source подразумевает коммуникацию с теми, кто его использует. Это полезно в смысле выявл… twitter.com/i/web/status/1…

11:16

Иногда коммуникация с сообществом позволяет найти кандидатов, которые впоследствии присоединятся к команде. Я сам б… twitter.com/i/web/status/1…

11:21

Для общения у нас есть канал в слаке Polymer Project. Там иногда появляются мейнтейнеры lit-html, в том числе Justi… twitter.com/i/web/status/1…

11:28

В прошлом мы в Vaadin также использовали Gitter. На мой взгляд, он был удобен только ссылками на issue. Никаких осо… twitter.com/i/web/status/1…

11:45

Немного о процессах. Раз в неделю мы просматриваем новые issue, стараемся на них отвечать и добавляем метки. Также… twitter.com/i/web/status/1…

12:09

Иногда бывает и так, что доходят руки до issue, висевшего без ответа несколько месяцев. Я в таких случаях всегда ис… twitter.com/i/web/status/1…

12:12

Когда issue много, они превращаются в груз, который производит угнетающее впечатление. Простой способ "решить" проб… twitter.com/i/web/status/1…

12:31

Единственный способ разгрести груду тикетов — постоянство и автоматизация. Помогает даже использование меток. Еще о… twitter.com/i/web/status/1…

12:47

Улучшения требуют времени. У нас в Vaadin для этого есть Community Friday: пятница в конце двухнедельного спринта.… twitter.com/i/web/status/1…

13:20
@jsunderhood @intercom Похоже у вас прямо гигантский тул.
Я записываю все такие интересные штуки, но по сравнивать… twitter.com/i/web/status/1…

Отвечаю на вопрос о визуальном конструкторе Vaadin: сейчас в разработке плагин для VSCode для приложений на lit-ele… twitter.com/i/web/status/1…

@jsunderhood @intercom Похоже у вас прямо гигантский тул.
Я записываю все такие интересные штуки, но по сравнивать… twitter.com/i/web/status/1…

13:58

Тред в честь пятницы 13-го. О человеческом факторе и багах.

18:33

Для начала простой факт: у фреймворка Vaadin есть версия 14.1.5. Следующая за ней имеет номер 14.1.16. К счастью, э… twitter.com/i/web/status/1…

18:35

В тот раз отличился не я, но в моей карьере тоже бывало всякое. До перехода во фронтенд я больше 7 лет работал в IT… twitter.com/i/web/status/1…

18:40

Работа включала в себя применение SQL-скриптов, присылаемых разработчиками по скайпу. Возможно, вы слышали шутку пр… twitter.com/i/web/status/1…

18:43
@jsunderhood Не очень понятен смысл твита. В чем баг? Версия же все равно выше

Смысл в том, что это могла быть и мажорная версия. Менеджмент вряд ли бы этому обрадовался. Как известно, из npm по… twitter.com/i/web/status/1…

@jsunderhood Не очень понятен смысл твита. В чем баг? Версия же все равно выше

18:52

Более 7 лет я нажимал .bat-файлы и вводил нужные даты. Утром, под конец 12-часовой ночной смены, это требует чуть б… twitter.com/i/web/status/1…

18:58

От человеческого фактора не застрахован никто. Я достаточно долго был подвержен такому риску, хотя это конечно же н… twitter.com/i/web/status/1…

19:06

Благодаря человеческому фактору мне случалось ехать в офис среди ночи, чтобы помогать коллеге поднимать базу из бэк… twitter.com/i/web/status/1…

19:12

Прошло почти 5 лет с тех пор, как я сменил профессию. Но и сейчас я каждый раз тщательно проверяю версии и на секун… twitter.com/i/web/status/1…

19:18

В целом фронтенд намного спокойнее. Хотя тут можно, например, ошибиться в названии переменной. Однажды я так и сдел… twitter.com/i/web/status/1…

19:24

По крайней мере, теперь мне не приходится чинить авралы. Хотя изредка они случаются по вине браузеров. Например, в… twitter.com/i/web/status/1…

19:30
@jsunderhood Не значит ли это что больше 2х месяцев это никого не интересовало?

Разумеется. Иногда бывает и такое. Это как раз то, к чему я клоню: если уж проблему не удалось предупредить, ее нуж… twitter.com/i/web/status/1…

@jsunderhood Не значит ли это что больше 2х месяцев это никого не интересовало?

19:37

А еще о проблемах надо говорить. Я упоминал, что часть проектов мои коллеги перенесли в монорепозиторий. До этого я… twitter.com/i/web/status/1…

19:42

Автоматизация занимает время, которого приходится добиваться с боем. Зато доля человеческого фактора снижается, а р… twitter.com/i/web/status/1…

19:48

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

20:02

# Суббота 11 твитов

Как и обещал, делюсь полезными материалами о веб-компонентах.

16:18

Доклад Jan Miksovsky “Creating Customizable Web Components” с описанием некоторых приемов из библиотеки компонентов… twitter.com/i/web/status/1…

16:20

Доклад “Web Component Styling & Theming” от Justin Fagnani. Советую тем, кому интересно больше узнать о приемах сти… twitter.com/i/web/status/1…

16:27

Shadow DOM in depth — неплохое чтиво, где некоторые моменты на мой взгляд изложены чуть более подробно и наглядно,… twitter.com/i/web/status/1…

16:35

Shipping Web Components in 2020 — довольно интересная статья, в которой Joe Pettersson из Banked.js делится опытом… twitter.com/i/web/status/1…

16:49

Looking back on five years of web components — еще более подробная статья от Joe Gregorio о том, как команда Skia п… twitter.com/i/web/status/1…

16:57

Web Components punch list — простой чеклист доступности для кастомных контролов (в том числе, веб-компонентов) от S… twitter.com/i/web/status/1…

17:28

Storybook for web components on steroids — статья от Thomas Allmer из проекта Open Web Components о создании storyb… twitter.com/i/web/status/1…

17:38

Очень подробная статья от David Lorenz о проблеме реализации изоморфного рендеринга веб-компонентов на примере Vue.

itnext.io/a-deep-analysi…

18:03

Статья от Jan Miksovsky о нюансах, которые нужно учитывать и о задачах, которые приходится решать, создавая свой co… twitter.com/i/web/status/1…

18:21

Много статей и примеров есть в подборке Web Components the Right Way — это awesome-list, который я мейнтейню уже по… twitter.com/i/web/status/1…

18:26

# Воскресенье 19 твитов

В завершение недели собираю все треды о веб-компонентах в один.

18:31
Тема первого дня — кастомные элементы. Как в узком смысле (часть стандарта HTML), так и в широком (framework-agnost… twitter.com/i/web/status/1…

Кастомные элементы: знакомство.

Тема первого дня — кастомные элементы. Как в узком смысле (часть стандарта HTML), так и в широком (framework-agnost… twitter.com/i/web/status/1…

18:31
Возможны, вы заметили, что до сих пор я избегал термина “веб-компоненты”. Думаю, тред на эту тему будет не лишним.

О том, почему не взлетели веб-компоненты.

Возможны, вы заметили, что до сих пор я избегал термина “веб-компоненты”. Думаю, тред на эту тему будет не лишним.

18:33
Тред о применении кастомных элементов в 2020. С момента релиза Firefox 63 прошло почти два года, в Safari поддержка… twitter.com/i/web/status/1…

О применении кастомных элементов в 2020.

Тред о применении кастомных элементов в 2020. С момента релиза Firefox 63 прошло почти два года, в Safari поддержка… twitter.com/i/web/status/1…

18:35
Первый тред на сегодня — о том, нужны ли кастомным элементам библиотеки и в каких случаях можно обойтись vanilla JS.

Нужны ли кастомным элементам библиотеки?

Первый тред на сегодня — о том, нужны ли кастомным элементам библиотеки и в каких случаях можно обойтись vanilla JS.

18:35
Тред про кастомные элементы без зависимостей, с примерами из личного опыта. И заодно немного о best practices.

Опыт написания кастомных элементов без зависимостей.

Тред про кастомные элементы без зависимостей, с примерами из личного опыта. И заодно немного о best practices.

18:36
Тред о кастомных элементах на TypeScript и тестировании.

Немного о TypeScript и тестировании кастомных элементов.

Тред о кастомных элементах на TypeScript и тестировании.

18:37
Я обещал рассказать о не решенных проблемах кастомных элементов. В этом треде перечислю основные из них.

Проблемы кастомных элементов.

Я обещал рассказать о не решенных проблемах кастомных элементов. В этом треде перечислю основные из них.

18:38
Сегодняшняя тема — Shadow DOM, его возможности и ограничения. Начнем с треда о главной проблеме, которую Shadow DOM… twitter.com/i/web/status/1…

Изоляция стилей в Shadow DOM.

Сегодняшняя тема — Shadow DOM, его возможности и ограничения. Начнем с треда о главной проблеме, которую Shadow DOM… twitter.com/i/web/status/1…

18:41
Кроме изоляции стилей, Shadow DOM влияет и на то, каким образом они добавляются на страницу. Тред о том, что это зн… twitter.com/i/web/status/1…

Особенности подключения CSS в Shadow DOM.

Кроме изоляции стилей, Shadow DOM влияет и на то, каким образом они добавляются на страницу. Тред о том, что это зн… twitter.com/i/web/status/1…

18:44
Еще один важный аспект Shadow DOM — кастомизация стилей. При наличии изоляции это становится проблемой, поскольку н… twitter.com/i/web/status/1…

Кастомизация и CSS Shadow Parts.

Еще один важный аспект Shadow DOM — кастомизация стилей. При наличии изоляции это становится проблемой, поскольку н… twitter.com/i/web/status/1…

18:45
Тред про ограничения Shadow DOM и связанные с ними проблемы.

Ограничения и проблемы Shadow DOM.

Тред про ограничения Shadow DOM и связанные с ними проблемы.

18:46
В завершение темы Shadow DOM — небольшой тред о слотах и композиции, которые я как-то обошел стороной.

Композиция и слоты в Shadow DOM.

В завершение темы Shadow DOM — небольшой тред о слотах и композиции, которые я как-то обошел стороной.

18:46
Сегодня начнем с треда про элемент <template>. Раньше он считался частью веб-компонентов, хотя сейчас о нем вспоминают реже.

Элемент <template> и его перспективы.

Сегодня начнем с треда про элемент <template>. Раньше он считался частью веб-компонентов, хотя сейчас о нем вспоминают реже.

18:46
Тред о разработке на ES-модулях в браузерах.

Разработка на ES-модулях в браузерах.

Тред о разработке на ES-модулях в браузерах.

18:47
Как и обещал, делюсь полезными материалами о веб-компонентах.

Полезные материалы о веб-компонентах.

Как и обещал, делюсь полезными материалами о веб-компонентах.

18:48
Веб компоненты должны были упростить веб, но:

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

Веб компоненты должны были упростить веб, но:

19:08

От себя могу только добавить, что погружение в эту сферу принесло мне интересный опыт, которого я мог бы и не получ… twitter.com/i/web/status/1…

19:11

С вами был @iamkulykov. Спасибо всем за внимание и комментарии. Напомню, что у меня есть и англоязычный аккаунт… twitter.com/i/web/status/1…

20:03

other