Статьи

Создание пользовательских веб-компонентов с помощью X-Tag

После решений Google и Mozilla для веб-компонентов теперь настала очередь Microsoft войти в это пространство со своим публичным выпуском библиотеки X-Tag . Официальный сайт определяет это следующим образом:

X-Tag — это поддерживаемая Microsoft библиотека JavaScript с открытым исходным кодом, которая объединяет семейство API-интерфейсов стандартных веб-компонентов W3C, предоставляя компактный многофункциональный интерфейс для быстрой разработки компонентов. Хотя X-Tag предлагает функциональные хуки для всех API веб-компонентов (пользовательских элементов, теневого DOM, шаблонов и импорта HTML), для работы ему требуется только поддержка пользовательских элементов. В отсутствие собственной поддержки пользовательских элементов X-Tag использует набор полифилов, совместно используемых с каркасом Polymer от Google.

Другими словами, X-Tag для Microsoft — это то же самое, что Polymer для Google . Единственное, что является общим для них обоих, — это базовый полифилл, который обеспечивает поддержку веб-компонентов в неподдерживаемых браузерах.

Чем X-Tag отличается от полимера?

Polymer объединяет все четыре технологии веб-компонентов, а именно: импорт HTML , пользовательские элементы , Shadow DOM и шаблоны HTML в одном пакете. Он предоставляет разработчику простой в использовании API для создания пользовательских веб-компонентов. С другой стороны, X-Tag предоставляет только API пользовательских элементов для создания пользовательских веб-компонентов. Конечно, вы также можете использовать другие API веб-компонентов вместе с библиотекой X-Tag.

Разве X-Tag не является проектом Mozilla?

Да, это было, но это больше не так. Немного покопавшись, мне удалось выяснить, что первоначальный разработчик проекта X-Tag Даниэль Бухнер когда-то работал в Mozilla, когда создавал библиотеку. Но с тех пор он перешел в Microsoft и продолжил проект. Кроме того, он был единственным вкладчиком в библиотеку с помощью бывшего Mozillian. Следовательно, теперь это проект, поддерживаемый Microsoft, основанный бывшим Mozillian.

Начало работы с X-Tag

В этой статье мы создадим пользовательский элемент с использованием библиотеки X-Tag для встраивания вида улиц карты Google с использованием следующей разметки:

<google-map latitude="40.7553231" longitude="-73.9752458"></google-map> 

Пользовательский элемент <google-map> будет иметь два атрибута, latitude и longitude , чтобы указать координаты местоположения. Поскольку эти атрибуты являются необязательными, мы также назначим значения по умолчанию для каждого из них на случай, если разработчик не сможет определить их в разметке.

Давайте начнем с включения библиотеки JavaScript X-Tag в <head> нашего документа.

 <!DOCTYPE html> <html> <head> <!-- X-Tag library including the polyfill --> <script src="https://rawgit.com/x-tag/core/master/dist/x-tag-core.min.js"></script> </head> <body> <!-- Custom element markup will appear here --> <script> <!-- The behavior of the custom element will be defined here --> </script> </body> </html> 

Важно включить библиотеку X-Tag в <head> документа. Это делается для того, чтобы он был загружен и полностью проанализирован до того, как механизм рендеринга обнаружит пользовательскую разметку элемента, которую мы будем использовать внутри <body> .

Определение пользовательского элемента

В отличие от Polymer, процесс создания пользовательского элемента с помощью X-Tag полностью основан на JavaScript. Библиотека X-Tag предоставляет кучу полезных методов, обратных вызовов и свойств для определения пользовательского поведения для нашего элемента. Типичный скелет для создания пользовательского элемента с X-Tag выглядит следующим образом:

 xtag.register('google-map', { content: '', lifecycle: { created : function(){ /* Called when the custom element is created */ }, inserted : function(){ /* Called when the custom element is inserted into the DOM */ }, removed : function(){ /* Called when the custom element is removed from the DOM */ }, attributeChanged: function(attrName, oldValue, newValue){ /* Called when the attribute of the custom element is changed */ } }, accessors : {}, methods : {}, events : {} }); 
  • register() — это самый важный метод в библиотеке. Он принимает имя пользовательского элемента в качестве первого аргумента, за которым следует определение объекта. Как следует из названия, это отвечает за регистрацию пользовательского элемента в DOM.
  • content — довольно часто, пользовательскому элементу может потребоваться дополнительная разметка для структуры или представления. Это принимает строку HTML или строку многострочного комментария для вставки разметки в DOM.
  • lifecycle — содержит полезные методы обратного вызова, предназначенные для различных этапов жизненного цикла пользовательского элемента.
  • accessors — предоставляет общий интерфейс для доступа к атрибутам объекта, установщикам и получателям и связывает их с соответствующими атрибутами HTML. Когда атрибуты связаны с получателем / установщиком, их состояния всегда остаются синхронизированными.
  • methods — пользовательскому элементу, вероятно, потребуются некоторые собственные уникальные методы для обеспечения желаемой функциональности. Просто добавьте объект methods объекту определения xtag.register() верхнего уровня и xtag.register() все определяемые пользователем методы.
  • events — Это ответственно за присоединение событий к пользовательскому элементу. Ключи этого объекта — это имена событий, которые вы хотите прикрепить к пользовательскому элементу, например, tap , focus и т. Д.

Основная идея заключается в том, чтобы встроить карту Google с помощью iframe и указать URL-адрес src в следующем формате:

 https://www.google.com/maps/embed/v1/streetview?key=<API_KEY>&location=<LATITUDE>,<LONGITUDE> 

Чтобы получить API_KEY , выполните шаги, описанные здесь . Как только вы получите API_KEY , мы создадим iframe внутри created метода обратного вызова объекта жизненного цикла и определим свойство src в указанном выше формате.

 // Insert your API key here var API_KEY = <API_KEY>; xtag.register('google-map', { lifecycle: { created: function() { var iframe = document.createElement('iframe'); iframe.width = 600; iframe.height = 600; iframe.frameBorder = 0; iframe.src = 'https://www.google.com/maps/embed/v1/streetview?key=' + API_KEY + '&location=40.7553231,35.3434'; this.appendChild(iframe); } } }); 

Приведенный выше код работает, но нам нужно избавиться от жестко закодированных значений координат в iframe.src и вместо этого iframe.src значения непосредственно из атрибутов пользовательских элементов. Для этого мы будем использовать объект accessors с именами атрибутов, формирующих ключи. Мы связываем их с атрибутами HTML, объявляя attributes: {} .

 accessors: { latitude: { attribute: {}, set: function(value) { this.xtag.data.latitude = value; }, get: function() { return this.getAttribute('latitude') || "40.7553231"; // Default value } }, longitude: { attribute: {}, set: function(value) { this.xtag.data.longitude = value; }, get: function() { return this.getAttribute('longitude') || "-73.9752458"; // Default value } } } 

Затем мы можем использовать эти переменные напрямую, указав URL-адрес src :

 iframe.src = 'https://www.google.com/maps/embed/v1/streetview?key=' + API_KEY+'&location=' + this.latitude+',' + this.longitude; 

Применяя последние штрихи

Стилизация пользовательского элемента аналогична стилизации любого другого тега HTML. Классы, идентификаторы и селекторы атрибутов работают должным образом с пользовательскими элементами. Например, мы добавим box-shadow и border-radius в наш недавно созданный пользовательский элемент <google-map> .

 google-map { display: inline-block; box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -2px rgba(0, 0, 0, 0.2); padding: 1em; border-radius: .25em; } 

Использовать пользовательский элемент теперь так же просто, как включить следующую разметку в <body> :

 <!-- Use the custom element --> <google-map latitude="40.7553231" longitude="-73.9752458"></google-map> 

Конечный результат виден в CodePen ниже:

Хотя поддержка браузеров для веб-компонентов немного поверхностна , наша демонстрация с использованием библиотеки X-Tag с полифилом должна работать во всех современных браузерах, включая IE9 и выше.

Последние мысли

По сравнению с Polymer, X-Tag предоставляет гораздо более простой API для понимания и реализации пользовательских элементов, в основном из-за отсутствия сложных функций, которыми обладает Polymer. Если вы намерены сохранять свою настройку легкой и гибкой, и у вас нет подходящего варианта использования для других API-интерфейсов веб-компонентов, то X-Tag наверняка будет подходящим кандидатом для этой работы.