Веб-компоненты и открытые стандарты
Рассказываем о том, как и когда применять веб-компоненты, а также о базовом подходе к их созданию. Завершит статью подборка фактов об открытых веб-стандартах. Обсудить Веб-компоненты – это набор технологий для создания и многоразового применения отличных от остального кода элементов, функциональность которых основана на принципе инкапсуляции. Большинство веб-разработчиков сходятся во мнении, что повторное использование кода является хорошей идеей. Раньше это было нелегким делом, особенно для сложных документов HTML, связанных с ними скриптов и стилевого оформления. Приходилось быть осторожным, чтобы многократно использовать написанный для отображения элементов интерфейса код: во многих случаях это приводило к хаосу на странице. Применение веб-компонентов нацелено на разрешение подобных конфликтов. Для их создания используются три технологии. Набор API для определения элементов и их поведения, которые пользователь может встраивать в любой документ. Описанные внутри определения класса функции обратного вызова, которые влияют на поведение настраиваемого элемента: Набор JavaScript API для прикрепления инкапсулированного теневого DOM-дерева к элементу, который отображается отдельно от основного DOM-документа, а также для контроля связанной с ним функциональности. Вы можете сохранить приватность функций элемента, чтобы он мог быть скриптовым и стилизованным, не опасаясь его влияния на другие части документа. Далее следуют методы и свойства для работы с этим компонентом: Расширения интерфейса Метод Свойство Дополнения к интерфейсу Метод Свойство Расширения интерфейса Элементы Многие разработчики выбирают подход с применением открытых стандартов и типовых решений, включающих веб-компоненты. Преимуществ у него множество: Все это выглядит логичным, но тут есть о чем задуматься. Чтобы стандарт считался открытым, необходимо согласие всех заинтересованных сторон. Результат должен удовлетворять, если не всех, то большинство разработчиков. Что мы можем увидеть в данном случае? Открываем стандарт на GitHub и смотрим его создателей: Все разработчики документа работают в одной корпорации. Похожая ситуация наблюдается и в истории коммитов в этом репозитории. Выходит, что все написано на 100% в Google. Google имеет огромное влияние на открытые стандарты и вносит в них новые фичи ни с кем не советуясь. Остальные создатели браузеров не способны тягаться с гигантом IT-индустрии и постепенно сходят с дистанции. Сначала перешла на Chromium и выбыла из борьбы Opera, а затем и Edge. В итоге мы наблюдаем ситуацию, когда на caniuse 3 из 6 основных браузеров не поддерживают некоторые особенности так называемого открытого стандарта. Поддержка в браузерах: Библиотеки и примеры использования: Однозначных рекомендаций по внедрению в проекты веб-компонентов эксперты не дают, а значит решение об использовании тех или иных стандартов придется принимать вам. Стоит однако учитывать, что время не стоит на месте, и рекомендованные сейчас к использованию технологии через несколько лет могут устареть.Концепции и использование
1. Пользовательские элементы
CustomElementRegistry
– содержит функции, связанные с настраиваемыми элементами. В первую очередь с методом CustomElementRegistry.define()
для регистрации новых настраиваемых элементов.Window.customElements
– возвращает ссылку на объект CustomElementRegistry
.connectedCallback
вызывается, когда настраиваемый элемент впервые подключается к DOM документа.disconnectedCallback
вызывается, когда пользовательский элемент отключается от DOM документа.adoptedCallback
вызывается, когда настраиваемый элемент перемещается в новый документ.attributeChangedCallback
вызывается при добавлении, удалении или изменении одного из атрибутов настраиваемого элемента.2. Shadow DOM
ShadowRoot
представляет корневой узел поддерева теневой модели DOM.DocumentOrShadowRooе
– миксин, определяющий функции, доступные для всех документов и теневых корневых узлов.Element
, связанные с Shadow DOM:Element.attachShadow()
прикрепляет теневое DOM-дерево к указанному элементу.Element.shadowRoot
возвращает теневой корневой узел, прикрепленный к указанному элементу или значение null
, если корневой узел не прикреплен.Node
, относящиеся к ShadowDOM:Node.getRootNode()
возвращает корень объекта контекста, который необязательно включает теневой корневой узел, если он доступен.Node.isConnected
возвращает логическое значение, указывающее, подключен ли узел (прямо или косвенно) к объекту контекста, например объект Document в случае обычного DOM или ShadowRoot
в случае теневого DOM.Event
, относящиеся к теневой модели DOM:Event.composed
возвращает значение типа Boolean, которое указывает, будет ли событие распространяться через границу теневого DOM в стандартное DOM-дерево (true) или нет (false).Event.composedPath
возвращает путь к событию (объекты, для которых будут вызваны обработчики событий). Сюда не включены узлы в теневых деревьях, если теневой корневой узел был создан с закрытым ShadowRoot.mode
.3. Шаблоны HTML
<template>
и <slot>
позволяют создавать шаблоны разметки, которых не видно на отображаемой странице. Затем они могут быть повторно использованы несколько раз в качестве основы структуры пользовательского элемента.<template>
содержит фрагмент HTML, который не отображается при первоначальной загрузке документа, но может отображаться во время выполнения сценария JavaScript. Он в основном используется в качестве основы для структур настраиваемых элементов. Связанный с ним интерфейс DOM – HTMLTemplateElement
.<slot>
– пространство внутри веб-компонента, которое можно заполнить собственной разметкой, что позволяет создавать отдельные DOM-деревья и представлять их вместе. Связанный с ним интерфейс DOM – HTMLSlotElement
. Основные действия по внедрению веб-компонента
Element.attachShadow()
. Добавляем дочерние элементы, обработчики событий и т.д. в Shadow DOM с помощью обычных методов DOM.<template>
и <slot>
. Снова используем обычные методы DOM для клонирования шаблона и прикрепления его к вашему Shadow DOM.Открытые стандарты
Поддержка браузерами и ссылки на популярные на сайты с примерами использования компонентов
Выводы
- 9 views
- 0 Comment