Рубрики
Без рубрики

Давайте строим веб-компоненты! Часть 2: многолифики

Веб-компоненты – это будущее, но с небольшим уходом и некоторыми полезными многолификими, они также могут быть настоящим.

Автор оригинала: Benny Powers.

Этот пост изначально появился на dev.to

UI на основе компонентов – это ярость в наши дни. Знаете ли вы, что в Интернете есть свой собственный модуль нативного компонента, который не требует использования любых библиотек? Правдивая история! Вы можете написать, опубликовать и повторно использовать одно файловые компоненты, которые будут работать в любом * хороший браузер и В любых рамках (Если это ваша сумка).

В нашем Последнее сообщение Мы узнали о четырех веб-стандартах, которые мы пишете веб-компоненты: <Шаблон> , пользовательские элементы, тень DOM и JavaScript модули.

Сегодня мы узнаем немного о WebComponentsentsjs Polyfills которые позволяют нам написать приложения на основе веб-компонентов, которые работают на браузерах, которые не поддерживают спецификации.

  • Обзор
  • Загрузка полифилл
    • Расширенные сценарии загрузки
    • Асинхронная загрузка
  • Написание пользовательских элементов, которые работают с Sadycss Polyfill
    • Sadycss TL; DR
  • Пользовательские элементы полифилл
    • Поддержка IE11.

Обзор

Веб-компоненты действительно потрясающие. И если вы мой любимый бренд ботаника, обещание кросс-браузера, многоразовых, совместимых компонентов является застр. Это не мозжет, что библиотеки и приложения на основе веб-компонентов будут быстро расти в популярности, так как в конце октября 2018 года веб-компоненты будут втабочны в новейшие версии Chrome, Firefox и Safari. Сладкий!

Но веб-разработчики, которые были в этом суставе дольше минуты, знают, что это не всегда так просто. Иногда это похоже на охладительную функцию веб-платформы (я смотрю на вас, Scroll-Snap !), Тем менее вероятно, что он должен быть широко поддерживается.

Но не бойся, друзья! Сегодня вы можете погрузиться в Web Components сегодня, не опасаясь о выходе из пользователей на старших браузерах позади. Хорошие люди в Google Команда веб-компонентов имел в виду, когда они создали WebComponentsentsjs Polyfills , Что позволило вам нацелиться на ваши приложения к IE11, что я уверен, что причина, по которой вы просыпаетесь утром. Полифиллики также будут работать на более старых версиях Chrome и Firefox, а на краю Microsoft, пока они не просыпаются и не будут реализовывать два Самые популярные билеты на их доске США

Так что не просто сидеть там, читать дальше! Мы собираемся вместе, как загрузить полифимки, как писать пользовательские элементы, которые используют их правильно, и как избежать известных проблем и подводных камней с полифильмами.

Загрузка полифилл

Для большинства пользователей самая легкая вещь, которую нужно сделать, это поп-сценарий бирки Sourcing WebComponents-Loader.js Сценарий на вашу страницу голова перед загрузочным файлами компонентов. Этот скрипт проверяет ua ua ua


  
  
  
  

Вы можете загрузить скрипты через CDN, как мы сделали выше, или вы можете объединить их с остальной частью вашего кода приложения, установив в свой проект:

npm install --save @webcomponents/webcomponentsjs

  
  ;



  

<В сторону> Кстати, я только что обнаружил, что есть смазка Falafel emoji 🥙, который, я думаю, технически приносит мир на шаг ближе к совершенству.

Расширенные сценарии загрузки

Вы также можете загрузить определенные полифилики индивидуально, если вы точно знаете, что вам нужно:














Вы могли бы выбрать укусить пулю и загрузить расслоение или SD-CE Polyfills во всех случаях, которые сэкономят ваши пользователи круглую поездку на сервер, который является популярным выбором в производственных условиях. В самых простых случаях вы, вероятно, просто хотите использовать WebComponents-Loader.js скрипт

Полный комплект добавляет 94 КБ К вашим критическим пути загрузки, тогда как загрузчик добавляет только 5 КБ Отказ Вы должны сбалансировать потребности вероятного меньшинства ваших пользователей на старых браузерах с удобством вероятного большинства на вечнозеленых браузерах.

Асинхронная загрузка

В большинстве случаев вы захотите загрузить WebComponents-Loader.js Сценарий как рендеринг блокировки ресурса в верхней части вашего голова Отказ Но будут времена, которые вы захотите загрузить его асинхронно. Например: если ваше приложение реализует A Статическая приложение-оболочка Чтобы предоставить пользователям иллюзию производительности, вы хотите, чтобы этот статический HTML и CSS загружается как можно быстрее, что означает устранение рендеринга-блокирующих ресурсов. В этих случаях вам нужно будет использовать window.webcomponents.waitfor Способ для обеспечения нагрузки ваших компонентов после полифиллирования. Вот a безвозмездно поднял Слегка модифицированный пример из WebComponentsjs ПРОЧТИ МЕНЯ:










  
  

Или пример более типичный для шаблона статического приложения-приложения:


  
  


  
  
    

Написание пользовательских элементов, которые работают с полифильмами

Если вы используете библиотеку веб-компонентов, как Полимер , Litelement или Гибриды (Помимо прочего) Чтобы написать свои компоненты (что-то, что мы будем прикрывать в более позднем посте), ваши компоненты будут работать с полифильскими из коробки, поскольку эти библиотеки являются конкретно написано к использовать многолифики. Ваша работа сделана. Есть пиво.

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

Орел-глаза читатели, возможно, заметили несколько сложных линий JavaScript, пересыпанного в один из примеров, которые мы использовали в последнем посте:

const template = document.createElement('template')
template.innerHTML = /*...*/

// Let's give the polyfill a leg-up
window.ShadyCSS &&
window.ShadyCSS.prepareTemplate(template, 'awesome-button')

customElements.define('awesome-button', class AwesomeButton extends HTMLElement {
  constructor() {
    super()
    this.onclick = () => report('Clicked on Shadow DOM')
  }

  connectedCallback() {
    // Let's give the polyfill a leg-up
    window.ShadyCSS &&
    window.ShadyCSS.styleElement(this)
    const root = this.attachShadow({mode: 'open'});
    root.appendChild(template.content.cloneNode(true))
  }
})

Увидеть это Sadycss Справка? Это часть многолифики, которые эмулирует стиль-навес тени в браузерах, которые не поддерживают его. Для того, чтобы ваши стили были должным образом оценены, необходимо следовать несколько правил:

Правила Shadycss:

  1. Стили должны быть определены в <СТИЛЬ> элемент, который является прямым ребенком из <Шаблон> элемент.
  2. Что <СТИЛЬ> Тег должен быть единственным в этом шаблоне.
  3. Прежде чем ваш элемент прикрепляется, ассоциируйте свой шаблон с именем тега с Shadycss.prepretemplate (TemplateExent, Tagname)
  4. После того, как ваш пользовательский элемент прикрепляется к документу, но до создания корня тени, позвоните Shadycss.StyleELement На вашем пользовательском элементе рассчитать его стили.

Подготовка печати Оценивает правила в вашем стиле в тег в абстрактное синтаксическое дерево, а затем добавить сгенерированные родительские селекторы для их моделирования Scoping.

button {/*...*/}

становится …

.style-scope .awesome-button button {/*..*/}

Стильэмент Применяет Casoping Classes к вашему элементу, и это «тенистые» дети.


  #shadow-root
  

становится …


  

Shadycss также будут проводить пользовательские свойства CSS ( var (- foo) ) Если браузер не поддерживает их.

Динамические стили

Из-за того, как работает Sadycss Polyfill Works, авторы веб-компонентов, которым необходимо поддерживать край или худшие, рекомендуется не использовать динамически сгенерированные CSS, такие как:

const getTemplate = ({disabled}) => `
  
`

class AwesomeButton extends HTMLElement {
  set disabled(disabled) {
    this.render()
  }

  connectedCallback() {
    this.attachShadow({mode: 'open'})
    this.render()
  }

  render() {
    this.shadowRoot.innerHTML = getTemplate(this.disabled)
  }
}

Вместо этого примера (который плохо задумывался по многим разным причинам, а не только совместимость Sadycss), используют пользовательские свойства CSS, и когда происходит динамическое обновление, используйте Shadycss.stylesubtree или Shadycss.styledocument :

const template = document.createElement('template')
template.innerHTML = `
  
  
`;

class AwesomeButton extends HTMLElement {
  static get observedAttributes() {
    return ['disabled']
  }

  connectedCallback() {
    this.attachShadow({mode: 'open'})
    this.shadowRoot.appendChild(template.content.cloneNode(true))
  }

  attributesChangedCallback(name, oldVal, newVal) {
    name === 'disabled' &&
    ShadyCSS &&
    ShadyCSS.styleDocument({
      '--awesome-button-background' : newVal ? 'grey' : 'white',
    });
  }
}

Те, кто придумывают примеры. В реальном мире вы, скорее всего, решите проблему полностью с CSS, как:

:host { background: white; }
:host([disabled]) { background: grey; }

Но если вы хотите, скажем, поверните оттенок на основе сенсорных событий или преобразовать элемент на основе обновлений WebSocket, пользовательские свойства CSS – это путь.

Shadycss предоставляет некоторые другие функции, такие как прокладка для ныне уносенных @Apply CSS синтаксис, но мы не собираемся покрывать их, потому что этот спектр мертв в воде.

Есть также некоторые Известны ограничения на Sadycss Polyfill Отказ Спойлеры:

  • Поскольку Sadycss удаляет все <Слот> Элементы, вы не можете выбрать их напрямую, поэтому вы должны использовать контекстную обертку, как .Context:: Slieded (*) Отказ
  • Стили документов могут утерить в свои тенистые деревья, так как полифилл моделирует только инкапсуляцию.

Для низкоподходящих и грязных по известным ограничениям см. Readme Отказ

Sadycss TL; DR:

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

  • Определите стили вашего элемента в этом <Шаблон> элемент;
  • Фактор теневых слотов вашего элемента с учетом полифилл; Сделайте соответствующие заклинания в вашем элементе ConnectedCallback ; А также
  • Динамически обновлять CSS пользовательские свойства с Shadycss.styledocument или Shadycss.stylesubtree или избегайте проблемы, используя некоторые другие решения на основе CSS.

Пользовательские элементы полифилл

Пользовательские элементы Polyfill исправляет несколько конструкторов DOM с API от пользовательских элементов Spec:

  • Htmlelement Получает пользовательские обратные вызовы элементов, такие как ConnectedCallback и AttributeChangedCallback (Что мы обсудим в следующем посте более подробно). на его прототипе.
  • Элемент Получает Attachshadow и способы, как SetAttribute и innerhtml Установка исправлена для работы с помощью полифиртовых вызовов пользовательских элементов.
  • Дом API на Узел как Приложение аналогично исправлена
  • Документ # CreateeDement и другие. Получите аналогичное лечение.

Это также подвергает customelents Объект на окно Так что вы можете зарегистрировать свои компоненты.

Пользовательские элементы Polyfill обновляются после DomcontentLoaded Затем инициализирует МутацияОбсеревер Чтобы обновить любые пользовательские элементы, которые впоследствии прикреплены JavaScript.

Поддержка IE11.

клип из мозга конфеты

☝️ Как я чувствую, когда кто-то говорит мне, что им нужно поддерживать IE11.

Полифилл поддерживает IE11, но это не все солнечные лучи и радуги. IE11 больше не развивается MS, что означает его не должен использоваться. Решив для поддержки IE11 означает добавленную временем разработки, добавленную сложность, добавленную площадь поверхности для ошибок и разоблачение пользователей багги, устаревшим браузером. В любое время поддержки IE11 поднимается как требование, оно должно быть тщательно оценено. Не просто соедините его как «приятно иметь». Это не хорошо бы иметь. Если это не абсолютное требование, основанное на неизбежных обстоятельствах, лучше не поддерживать его вообще.

Феве Отказ Хорошо, на шоу.

Для спецификации пользовательские элементы должны быть определены с JavaScript Класс es, но IE11 никогда не будет поддерживать эту функцию ES6. Таким образом, мы должны транспортировать наши занятия на ES5 с Babel или некоторым таким инструментом. Если вы используете Polymer CLI Есть возможность трансировать JS до ES5.

В идеальном мире вы бы построили два или более версиях вашего сайта:

  1. Написано с использованием Класс Ключевое слово и ES2015 + Особенности для вечнозеленых/современных браузеров
  2. Транспортирован до ES5, используя Функция Ключевых слов
  3. И любые другие оттенки между вы хотите поддержать.

Ты бы тогда Дифференциально подавать ваше приложение , отправка быстрого, света, современного кода для способных пользовательских агентов и медленного, транспортированного, устаревшего кода в старые браузеры.

Но это не всегда вариант. Если у вас есть простой статический хостинг и необходимость построить один пакет для всех браузеров, вы будете вынуждены транпиливать на ES5, что не совместимо с родным customelents выполнение.

Для таких случаев, полифилл обеспечивает Шим для реализации собственных пользовательских средств, которые поддерживают стиль ES5 Функция Элементы ключевых слов Обязательно включите его в вашу сборку (не транпилируйте этот файл!) Если вы нацеливаетесь на старые и новые браузеры с тем же связью.



Участник сообщества Active Web-компоненты @ruphin предлагает аккуратный трюк Вы можете использовать для обеспечения своего рода дифференциал, обслуживающую даже на статическом хосте, – это использовать браузер Nomodule характерная черта:









Проверьте его легкие каркасы веб-компонентов, глюоны

https://github.com/ruphin/gluonjs

Заключение

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

В нашем следующем сообщении Бог-желание мы рассмотрим написание веб-компонентов с API ванильного браузера для максимального контроля и совместимости.

Ошибка

  • Предыдущая версия этой статьи рекомендовала импортировать полифилл в модуле, как: Импорт @ WebComponents/WebComponentsjs/WebComponents-loader.js '; Не делай этого. Вместо этого полифиллики должны быть загружены в документ голова до того, как любые другие модули загружены. Статья была исправлена с обновленным примером.
  • Предыдущая версия этой статьи рекомендуется для нагрузки специфических многолификов. Текущая версия обеспечивает большую глубину, почему и когда вы можете сделать это.
  • Предыдущая версия этой статьи использована this.shadowroot.append , который работает на поддержке браузеров. Предпочтительно использовать this.shadowroot.appendChild , который работает с полифиммами. нг здесь …