С помощью веб-компонентов разработчики теперь имеют возможность создавать свои собственные HTML-элементы. В этом полном руководстве вы узнаете все, что вам нужно знать. На этой странице мы расскажем, что именно представляют собой веб-компоненты, преимущества их использования и элементы, из которых они состоят.
Затем вы узнаете, как создавать свои собственные компоненты, в двух коротких руководствах — на странице 2 вы узнаете, как создать компонент с помощью шаблонов HTML и API shadowDOM, а на странице 3 вы получите еще один шаг — и вы узнаете, как создать настраиваемый встроенный элемент.
Наконец, на странице 4 вы найдете несколько фреймворков и инструментов, которые помогут вам начать, и примеры существующих элементов, которые можно попробовать сегодня. (Дополнительные инструменты см. В нашем обзоре инструментов веб-дизайна .)
Пока вы здесь, вы также можете ознакомиться с нашим руководством по основным API-интерфейсам HTML и их использованию. , а также наши лучшие примеры параллаксной прокрутки.
Содержание статьи
Что такое веб-компоненты?
Разработчики любят компоненты. Они являются отличным способом определения блоков кода, которые можно вставлять и повторно использовать везде, где они требуются. За прошедшие годы было предпринято несколько попыток передать эту идею в Интернете, с разной степенью успеха.
Спецификации языка привязки XML Mozilla и компонентов HTML от Microsoft восходят к Internet Explorer 5 почти 20 много лет назад. К сожалению, обе попытки оказались громоздкими, не получили поддержки в других браузерах и в конечном итоге были удалены. Хотя их сегодня и нет, их концепции легли в основу используемых современных подходов.
Фреймворки JavaScript, такие как React, Vue или Angular, придерживаются аналогичного подхода. Одной из основных причин их успеха является способность содержать общую логику в легко разделяемом шаблоне в той или иной форме.
Хотя эти структуры могут улучшить опыт разработчиков, они делают это за счет затрат. Необходимо компилировать такие языковые функции, как JSX, и многие фреймворки полагаются на среду выполнения для управления всеми своими абстракциями. Разве не было бы проще, если бы был способ получить пользу без такого тяжелого веса? Веб-компоненты позволяют нам это делать.
Четыре столпа веб-компонентов
Концепция веб-компонента состоит из трех API — пользовательских элементов, HTML-шаблонов и теневой модели DOM — с модулями JavaScript, склеивающими их вместе. Объединив преимущества этих технологий, можно приступить к созданию пользовательских элементов HTML, которые выглядят и ведут себя так же, как их собственные аналоги.
Использование веб-компонента во многом похоже на использование любого другого существующего элемента HTML. Их можно настроить с помощью атрибутов, запросить с помощью JavaScript и даже стилизовать с помощью CSS. Пока браузер знает об их существовании, они не обрабатываются иначе.
Это также позволяет веб-компонентам хорошо взаимодействовать с другими фреймворками и библиотеками. Используя те же механизмы связи, что и любой другой элемент, их можно использовать вместе с любой структурой, существующей сегодня или в будущем.
Самое главное, что все они построены на веб-стандартах. Интернет построен на концепции обратной совместимости, и, создав веб-компонент сегодня, он будет работать еще долгие годы.
Но прежде чем идти дальше, мы должны взглянуть на то, что составляет эти спецификации, и как вы можете создать и использовать их сегодня.
01. Пользовательские элементы
Ключевые особенности:
- Определение поведения элемента
- Реагировать на изменения атрибутов
- Дополнить существующие элементы
Когда вы слышите, как люди говорят о «веб-компонентах», довольно часто они имеют в виду механизмы, лежащие в основе — API пользовательских элементов.
С помощью этого API можно создавать классы которые приводят в действие внутреннюю работу элемента. В них подробно описано, что делать при добавлении, обновлении или удалении элемента.
class ExampleElement extends HTMLElement {static gethibitedAttributes () {return […]; } attributeChangedCallback (name, oldValue, newValue) {} connectedCallback () {}} customElements.define ("example-element", ExampleElement);
Каждый настраиваемый элемент имеет аналогичную структуру. Они расширяют существующий класс HTMLElement который обеспечивает основу для того, как должен вести себя элемент.
Внутри есть несколько методов, называемых реакциями которые вызываются в ответ к чему-то об изменении этого элемента. Например, connectedCallback будет вызываться, когда на экране появится новый элемент. Они работают аналогично методам жизненного цикла, используемым в большинстве фреймворков JavaScript.
Обновление атрибутов элемента может изменить его поведение. Когда происходит обновление, срабатывает реакция attributeChangedCallback которая детализирует изменение. Это произойдет только для атрибута, который определен внутри массива ObservableAttributes.
Элемент должен быть определен, прежде чем браузер сможет что-либо с ним сделать. Метод define здесь принимает два аргумента — имя тега и класс, который он должен использовать. Все имена тегов должны содержать символы — чтобы избежать конфликтов с любыми будущими родными элементами.
Содержимое
Затем элемент можно записать в любом месте страницы как обычный тег HTML. Как только в браузере определен элемент, он находит любой из этих совпадающих тегов и связывает их поведение с классом в процессе, известном как «обновление».
Существует два типа настраиваемых элементов — «автономные» или «встроенный в индивидуальный». Автономные пользовательские элементы, которые были рассмотрены до сих пор, не связаны ни с одним существующим элементом. Как и
Настроенный встроенный элемент — как следует из названия — может улучшить существующий элемент с помощью новых функций. Они поддерживают нормальное семантическое поведение этого элемента, но при этом открыты для изменений. Если, например, был настроен элемент он все равно будет взят и отправлен как часть формы.
class CustomInput расширяет HTMLInputElement {} customElements.define ("custom-input", CustomInput, {extends: "input"});
Класс настраиваемого встроенного компонента расширяет класс настраиваемого элемента. Определение также должно определять тег этого элемента через его третий аргумент.
Они также используются немного по-другому. Вместо нового тега они расширяют существующий тег с помощью атрибута is . Браузер может читать это и обновлять их так же, как и автономный компонент.
Хотя большинство браузеров поддерживают автономные настраиваемые элементы, только Chrome и Firefox поддерживают настраиваемые встроенные элементы. Если они используются в браузере, который их не поддерживает, они вернутся к обычным версиям элементов, которые они настраивают, что может сделать их безопасными в использовании.
02. HTML-шаблоны
- Создавайте готовые структуры
- Неактивны до вызова
- Содержит HTML, CSS и JS
Исторически браузер Создание шаблонов на основе шаблонов включало сшивание строк в JavaScript или использование библиотеки, такой как Handlebars, для анализа специальной разметки блока. Совсем недавно спецификация HTML-шаблонов определила тег который может содержать все, что может быть повторно использовано.
Автор @
Сам по себе он не имеет внешнего вида и остается инертным, что означает, что ничего внутри не анализируется или выполняется до тех пор, пока не будет получено указание, включая запросы на внешние носители, такие как изображения или видео. JavaScript также не может запрашивать содержимое, поскольку браузеры будут видеть его только как пустой элемент.
const template = document. getElementById ("твит"); константный узел = документ. importNode (template.content, истина); document.body.appendChild (node);
Обычный запрос выбирает сам элемент . Метод importNode создает копию своего содержимого, при этом второй аргумент говорит ему сделать полную копию всего. Наконец, его можно добавить в документ как любой другой элемент.
Шаблоны могут содержать все, что может содержать HTML-страница, включая CSS и JavaScript. Как только элемент применяется к странице, эти стили применяются и скрипты выполняются. Имейте в виду, что они будут работать глобально и поэтому могут переопределять стили и значения, если не позаботиться о них.
Самое лучшее в шаблонах — это то, что они не ограничиваются только веб-компонентами. Приведенные здесь примеры применимы к любой веб-странице, но становятся особенно эффективными в сочетании с веб-компонентами, в частности с теневым DOM.
03. Shadow DOM
- Избегайте утечки стилей
- Именование становится проще
- Сохраняйте логику реализации внутри
Объектная модель документа — или ' DOM '- это то, как браузер интерпретирует структуру страницы. Читая HTML, он формирует представление о том, какие элементы на странице содержат какой контент, и использует это, чтобы решить, что показывать. При использовании чего-то вроде document.getElementById () браузер фактически просматривает DOM.
Это может быть приемлемым для макета страницы, но как насчет деталей реализации внутри элемента ? Страницы не должны беспокоиться о том, что составляет интерфейс, например, внутри элемента . Вот где появляется теневой DOM.
Теневая DOM создается при применении к элементу. Любой контент может быть добавлен в теневую DOM так же, как в обычную — или «легкую» — DOM, но это не влияет на то, что происходит за ее пределами. Точно так же ничто в светлой DOM не может напрямую обращаться к теневой DOM. Это означает, что мы можем добавлять классы, стили и сценарии в любом месте теневой модели DOM, не беспокоясь о конфликтах.
Наилучшее использование теневой модели DOM с веб-компонентами происходит в сочетании с настраиваемым элементом. Имея теневой DOM, отвечающий за контент, каждый раз, когда этот компонент используется повторно, его стили и структура не будут влиять на остальную часть страницы.
04. Модули ES и HTML
- Добавьте, где необходимо
- Нет требований к этапу сборки
- Храните все в одном месте
Хотя предыдущий У трех спецификаций были относительно простые пути к успеху, их упаковка и возможность повторного использования долгое время были камнем преткновения.
Первоначально спецификация импорта HTML определяла способ включения HTML-документов в браузеры, во многом как CSS или JavaScript уже сегодня. Это позволило бы настраиваемым элементам, вместе с их шаблонами и теневым DOM, существовать в другом месте и импортироваться по мере необходимости.
Firefox решил не реализовывать HTML-импорт в своем браузере, а вместо этого предпочел более новую спецификацию импорта модулей JavaScript.
класс экспорта ExampleElement расширяет HTMLElement {…}
импорт {ExampleElement} из «ExampleElement.js»;
Модули по умолчанию не применяют свой контент глобально. Помечая определенные переменные, функции или классы как экспортируемые, их можно затем импортировать всем, кому они нужны, и использовать, как если бы они были локальными.
Это очень помогает веб-компонентам, поскольку пользовательский элемент, содержащий шаблон и теневой DOM можно экспортировать из одного файла и добавить в другой. Если он определен где-то в строке, он готов к использованию.
import {ExampleElement} из "ExampleElement.html";
Расширение этого была предложена спецификация, чтобы вернуть некоторую легкость импорта HTML наряду с импортом модулей. Они позволят писать веб-компоненты с использованием декларативного и семантического HTML. Возглавляемая Microsoft, эта функция скоро появится в Chrome и браузере Edge на базе Chromium.
Следующая страница: Как создавать собственные компоненты