Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Web Components - usando o melhor do navegador

Web Components - usando o melhor do navegador

The Developer Conference - POA - 2018. Pareando com Sarah Caixeta.

Existem diversos frameworks e bibliotecas para a criação de aplicações frontend, tanto que muitas vezes utilizamos sem pensar se realmente precisamos de todos os recursos que eles oferecem. As funcionalidades já entregues pelo navegador podem ser mais que suficientes para distintos contextos. Nessa palestra falamos como WebComponents podem fazer parte da solução para seu próximo, ou atual, projeto. Apresentamos as especificações envolvidas (Custom Elements, Shadow DOM, HTML Template), formas de uso, como compartilhamento de componentes, interoperabilidade entre distintos frameworks, aplicação em Micro Frontends e o que vem por aí na área.

Roberto Soares

December 06, 2018
Tweet

More Decks by Roberto Soares

Other Decks in Programming

Transcript

  1. Agenda O que são Web Components? Para que servem? Trabalhando

    com Web Components O que vem por aí? Web Components 2 / 27
  2. Exemplo <div class="profile-avatar"> <a href="..."> <img src="..." alt="..." /> <span

    class="name">...</span> </a> </div> <script> <!-- ainda tendo que indicar as informações a serem apresentadas --> </script> Web Components 5 / 27
  3. class ProfileAvatar extends HTMLElement { connectedCallback() { this.innerHTML = `

    <div class="profile-avatar"> <a href="..."> <img src="..." alt="..." /> <span class="name">...</span> </a> </div>` } } customElements.define('profile-avatar', ProfileAvatar) <profile-avatar></profile-avatar> Web Components 6 / 27
  4. HTML Templates <template id="profile-avatar"> <style> a { color: blue }

    </style> <a> <img src="..." alt="..." /> <span class="name">...</span> </a> </template> Web Components 7 / 27
  5. Usando o template class ProfileAvatar extends HTMLElement { constructor() {

    const template = document.getElementById('profile-avatar').content this.appendChild(template.cloneNode(true)); } connectedCallback() { this.querySelector('a').href = '/my-profile' // ... } } Web Components 8 / 27
  6. Shadow DOM class ProfileAvatar extends HTMLElement { connectedCallback() { const

    content = ... const shadow = this.attachShadow({mode: 'open'}) shadow.appendChild(content) } } Web Components 10 / 27
  7. Criar aplicações <ytd-app style="--ytd-masthead-height:56px;"> <yt-activity-manager class="style-scope ytd-app"> </yt-activity-manager> <yt-guide-manager id="guide-service"

    class="style-scope ytd-app"> </yt-guide-manager> <yt-gfeedback-manager class="style-scope ytd-app"> </yt-gfeedback-manager> </ytd-app> Web Components 14 / 27
  8. Vanilla Ecossistema JS Webpack Babel TypeScript Lifecycle constructor connectedCallback attributeChangedCallback

    (observedAttributes) disconnectedCallback Polyfills Web Components 17 / 27
  9. Outra versão? Sem previsão Custom Elements: 2 versões v0, v1

    Angular: 136 versões React: 173 versões 0.0.1, 0.0.2, 0.0.3, 0.2.0, ... 0.14.7, 15.0.0, ..., 16.7.0-alpha.2 Web Components 23 / 27
  10. Aumento do suporte Polymer lit-element lit-html Vue Wrapper Build target

    Svelte Componentes com opção tag Web Components 24 / 27