Slide 1

Slide 1 text

Componentes 
 para a web uma visão sobre tudo aquilo
 que realmente importa

Slide 2

Slide 2 text

jcemer.com github.com/jcemer twitter.com/jcemer speakerdeck.com/jcemer

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

Elemento de software que encapsula uma série de funcionalidades relacionadas Componente Definição

Slide 5

Slide 5 text

Unidade independente que pode ser composta com outros componentes para formar um sistema mais complexo

Slide 6

Slide 6 text

• Independentes • Intercambiáveis • Reusáveis modularidade e coesão

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

Introducing the new UX and UI for Google News platform George Kvasnikov · 10/2014 http://googlenews.gkvasnikov.com

Slide 9

Slide 9 text

HTML JavaScript CSS

Slide 10

Slide 10 text

Coleção de padrões que permitem encapsular, compor e reusar código na plataforma web Web Components Definição

Slide 11

Slide 11 text

• Custom Elements • Templates • Shadow DOM • HTML Imports

Slide 12

Slide 12 text

Web Components are here to fundamentally change the way we think, build, and consume our web apps. Eric Bidelman
 Google

Slide 13

Slide 13 text

Web Components Debunked!

Slide 14

Slide 14 text

Daqui em adiante, você irá se frustrar um pouco, faz parte do processo

Slide 15

Slide 15 text

Permite estender e definir novos elementos de HTML Custom Elements

Slide 16

Slide 16 text


 Jim Kennedy What is the core of 
 Palestinian conflict? 26 312 216 HTML

Slide 17

Slide 17 text

Elementos HTML5 podem ser estilizados no Internet Explorer 6 porque nele é possível definir novos elementos https://github.com/afarkas/html5shiv

Slide 18

Slide 18 text

Semântica 1.

Slide 19

Slide 19 text

Acabamos de criar uma série de elementos sem valor semântico fora do escopo do nosso projeto

Slide 20

Slide 20 text

No content

Slide 21

Slide 21 text

Microformats acrescentam significado ao conteúdo HTML

Slide 22

Slide 22 text

Sabemos que não há nenhuma semântica a ser seguida quando atribuímos classes a um elemento http://nicolasgallagher.com/about-html- semantics-front-end-architecture

Slide 23

Slide 23 text

É muito mais flexível e prático utilizar classes com nomes relacionados a aparência para estilizar HTML

Slide 24

Slide 24 text

Utilizar classes e microformats é mais adequado sob a ótica de estilização e semântica que definir novos elementos

Slide 25

Slide 25 text


 Jim Kennedy
26
312
HTML

Slide 26

Slide 26 text

Função dos 
 elementos 2.

Slide 27

Slide 27 text

Alguns elementos possuem funções que ultrapassam a de atribuir semântica ao conteúdo

Slide 28

Slide 28 text

HTML

Slide 29

Slide 29 text

Option 1 Option 2 HTML

Slide 30

Slide 30 text

MacOS iPad iPhone

Slide 31

Slide 31 text

No content

Slide 32

Slide 32 text

No content

Slide 33

Slide 33 text

Vejamos um exemplo de elemento do projeto Polymer

Slide 34

Slide 34 text

https://www.polymer-project.org/docs/elements/paper- elements.html#paper-dropdown-menu

Slide 35

Slide 35 text

https://www.polymer-project.org/docs/elements/paper- elements.html#paper-dropdown-menu

Slide 36

Slide 36 text

https://www.polymer-project.org/docs/elements/paper- elements.html#paper-dropdown-menu

Slide 37

Slide 37 text

Não reinvente elementos que já existem, os usuários agradecem

Slide 38

Slide 38 text

Repositório para fragmentos de HTML a serem utilizados por código JavaScript Template

Slide 39

Slide 39 text

O panorama dos 
 templates na web (

Slide 40

Slide 40 text

{{name}}
Conteúdo será processado e a imagem será requisitada para o servidor HTML

Slide 41

Slide 41 text

<img src="image.png"> <div>{{name}}</div> Conteúdo é uma string que pode expor a aplicação a Cross-site scripting HTML

Slide 42

Slide 42 text

var userData = '' el.innerHTML = t.replace('{{name}}', userData) Assim é que sofremos um XSS attack JAVASCRIPT

Slide 43

Slide 43 text

)

Slide 44

Slide 44 text

{{name}}
var t = document.querySelector('template') t.content.querySelector('[data-name]') .textContent = userData document.body.appendChild( document.importNode(t.content, true)); HTML JAVASCRIPT

Slide 45

Slide 45 text

Templates no 
 HTML 3.

Slide 46

Slide 46 text

Não há benefício em ter no documento templates acessíveis apenas pelo JavaScript

Slide 47

Slide 47 text

/** @jsx React.DOM */ var Avatar = React.createClass({ render: function() { return
{ this.props.name }
} }) JAVASCRIPT / JSX

Slide 48

Slide 48 text

var Avatar = React.createClass({ displayName: 'Avatar', render: function() { return React.DOM.div(null, React.DOM.img({src: "image.png"}), React.DOM.div(null, this.props.name) ) } }) JAVASCRIPT

Slide 49

Slide 49 text

• Fácil de visualizar a estrutura • Designers sentem-se confortáveis em fazer alterações • Previne Cross-site scripting http://facebook.github.io/react/docs/jsx-in-depth.html JSX JavaScript XML syntax

Slide 50

Slide 50 text

Permite isolar código HTML o mantendo livre de interferências da página Shadow DOM

Slide 51

Slide 51 text

I’m definitely not a fan of making your widget out of a . It is reliable but it’s hostile to accessibility, indexing, composition, and resolution independence Dominic Cooney
 Google

Slide 52

Slide 52 text

Pequena aplicação de terceiros que pode ser instalada em suas páginas Widgets Definição

Slide 53

Slide 53 text

Shadow DOM de elementos nativos 4.

Slide 54

Slide 54 text

Shadow Dom

Slide 55

Slide 55 text

Hiding Native HTML5 Video Controls in Full-Screen Mode Chris Coyier http://css-tricks.com/custom- controls-in-html5-video-full-screen Shadow DOM CSS Cheat Sheet Rob Dodson http://robdodson.me/blog/2014/04/10/ shadow-dom-css-cheat-sheet

Slide 56

Slide 56 text

video /deep/ input[type="range"] { display: none; } CSS

Slide 57

Slide 57 text

Maintainable JavaScript: Don’t modify objects you don’t own Nicholas C. Zakas http://www.nczonline.net/blog/2010/03/02/maintainable- javascript-dont-modify-objects-you-down-own

Slide 58

Slide 58 text

http://videos.clicrbs.com.br

Slide 59

Slide 59 text

Widgets não devem ser manipulados de maneiras escusas

Slide 60

Slide 60 text

Encapsulamento de CSS 5.

Slide 61

Slide 61 text

Not blue content

var root = document.querySelector('.widget') .createShadowRoot() root.innerHTML = '<style>' + 'p { color: blue }</style>' As regras definidas no Shadow DOM não surtem efeito na página HTML

Slide 62

Slide 62 text

p { background: red }
var root = document.querySelector('.widget') .createShadowRoot() root.innerHTML = '<p>Content</p>' E as regras de CSS definidas na página não se aplicam ao Shadow DOM HTML

Slide 63

Slide 63 text

O que faz todo sentido quando temos um widget

Slide 64

Slide 64 text

Mas perder a identidade da página a cada Shadow DOM geralmente não é a intenção

Slide 65

Slide 65 text

Não esqueça que conflitos de CSS podem ser evitados com a adoção de um sistema de escrita http://tableless.com.br/oocss-smacss-bem-dry- css-afinal-como-escrever-css

Slide 66

Slide 66 text

p { color: red }

Red content

Scoped CSS poderia ser um recurso tão interessante (se não só o Firefox tivesse suporte) HTML

Slide 67

Slide 67 text

Permite carregar documentos HTML de maneira assíncrona HTML Imports

Slide 68

Slide 68 text

Requests 6.

Slide 69

Slide 69 text

Permite isolar as definições de componentes e templates as custas de requests

Slide 70

Slide 70 text

Escopo e dependências 7.

Slide 71

Slide 71 text

Código JavaScript é executado no mesmo escopo de window

Slide 72

Slide 72 text

My funny document document.getElementById = function () {} dangerous.html HTML

Slide 73

Slide 73 text

Dependendo da ordem das importações, dependências podem ser sobrescritas

Slide 74

Slide 74 text


 $.fn.myPlugin = function () {} overwrite.html HTML

Slide 75

Slide 75 text

Web Components The good parts

Slide 76

Slide 76 text

Web Components The good parts Aquilo que humildemente acho legal

Slide 77

Slide 77 text

A única alternativa para se criar widgets atualmente é através de iframes

Slide 78

Slide 78 text

Iframes não permitem gerenciar externamente seu conteúdo e nem aferir sua dimensão

Slide 79

Slide 79 text

Encapsulamento 
 com interfaces 1.

Slide 80

Slide 80 text

Personal Content

document .querySelector('[data-widget]') .createShadowRoot() .innerHTML = '<div>My widget</div>' + '<content select="[data-page-content]">' + '</content>' HTML

Slide 81

Slide 81 text

Personal Content My widget

Slide 82

Slide 82 text

.sign-up::part(login-label) { color: orange; } http://robdodson.me/blog/2013/08/29/shadow- dom-styles-cont-dot Shadow DOM permite definir elementos parts passíveis de estilização HTML

Slide 83

Slide 83 text

Login

Slide 84

Slide 84 text

Shadow DOM permite definir widgets com interfaces

Slide 85

Slide 85 text

♥ HTML @jcemer

Slide 86

Slide 86 text

Auditório do SENAC
♥ HTML

Slide 87

Slide 87 text

Componentes 
 e dependências 2.

Slide 88

Slide 88 text

document.registerElement('twitter-timeline') Elementos são registrados diretamente através de JavaScript timeline.js HTML

Slide 89

Slide 89 text

Nestes casos, um encapsulamento mais flexível pode ser interessante

Slide 90

Slide 90 text

document.registerElement('twitter-timeline') timeline.html HTML

Slide 91

Slide 91 text

Imports permitem melhor administrar dependências

Slide 92

Slide 92 text

timeline.html HTML Documentos indicados no import são incluídos uma única vez

Slide 93

Slide 93 text

timeline.html Não resolve o problema em diferentes domínios HTML

Slide 94

Slide 94 text

Imports e templates precisam evoluir para solucionar mais problemas

Slide 95

Slide 95 text

Atribuindo comportamento 3.

Slide 96

Slide 96 text

Componentes não devem ser instanciados considerando a página em que estão

Slide 97

Slide 97 text

if ($('body').is('.page-product')) { $('[data-draggable]').draggable() $('[data-comments]').comments() } if ($('body').is('.page-checkout')) { $('[data-draggable]').draggable() $('[data-datepicker]').datepicker() } JAVASCRIPT

Slide 98

Slide 98 text

Angular.js e Dojo usam elementos HTML como referência para instanciar componentes

Slide 99

Slide 99 text

Custom Elements permitem assistir ao ciclo de vida de um elemento

Slide 100

Slide 100 text

Tableless Guy HTML

Slide 101

Slide 101 text

Tableless Guy document.querySelector('img').src = 'diego.jpg' HTML

Slide 102

Slide 102 text

Nesta trincheira, Custom Elements é infinitamente melhor que tudo que temos até então

Slide 103

Slide 103 text

• Elemento criado 
 createdCallback

Slide 104

Slide 104 text

• Adicionado ao DOM 
 attachedCallback

Slide 105

Slide 105 text

• Removido do DOM 
 detachedCallback

Slide 106

Slide 106 text

• Alterações nos atributos 
 attributeChangedCallback

Slide 107

Slide 107 text

var newsItemProto = Object.create(HTMLElement.prototype) newsItemProto.attributeChangedCallback = 
 function (attr, oldValue, value) {} var newsItem = document.registerElement('news-item', { prototype: newsItemProto }) JAVASCRIPT

Slide 108

Slide 108 text

Podemos assistir mudanças nos atributos de um elemento

Slide 109

Slide 109 text

Novos elementos são úteis apenas para gerenciar comportamento

Slide 110

Slide 110 text

HTML

 Jim Kennedy
26
312

Slide 111

Slide 111 text

HTML

 Jim Kennedy
26
312

Slide 112

Slide 112 text

document.registerElement('news-item', { prototype: newsItemProto, extends: 'article' }) JAVASCRIPT

Slide 113

Slide 113 text

Polymer Debunked!

Slide 114

Slide 114 text

Polymer é um projeto que utiliza Web Components

Slide 115

Slide 115 text

O Polymer não poderá ser retirado do projeto quando os navegadores derem suporte a Web Components

Slide 116

Slide 116 text

Polymer é uma das alternativas para utilizar Web Components hoje mesmo http://jonrimmer.github.io/are-we- componentized-yet The good parts

Slide 117

Slide 117 text

Why Web Components Aren’t Ready for Production… Yet TJ VanToll http://developer.telerik.com/featured/web-components- arent-ready-production-yet

Slide 118

Slide 118 text

• Independentes • Intercambiáveis • Reusáveis modularidade e coesão

Slide 119

Slide 119 text

• Sistema para escrita de CSS • Modularização no JavaScript • Ferramenta para build de código • Custom Elements e Shadow DOM

Slide 120

Slide 120 text

Seja cético e questione o valor de cada nova tecnologia (mas não critique por pura preguiça) Jean Carlo
 não trabalha no Google

Slide 121

Slide 121 text

Cheers @jcemer