SlideShare une entreprise Scribd logo
1  sur  121
Télécharger pour lire hors ligne
Componentes 
para a web 
uma visão sobre tudo aquilo 
que realmente importa
jcemer.com 
github.com/jcemer 
twitter.com/jcemer 
speakerdeck.com/jcemer
Definição 
Componente 
Elemento de software que encapsula 
uma série de funcionalidades 
relacionadas
Unidade independente que pode ser 
composta com outros componentes 
para formar um sistema mais complexo
• Independentes 
• Intercambiáveis 
• Reusáveis 
modularidade 
e coesão
Introducing the new UX and UI for 
Google News platform 
George Kvasnikov · 10/2014 
http://googlenews.gkvasnikov.com
HTML 
JavaScript 
CSS
Definição 
Web Components 
Coleção de padrões que permitem 
encapsular, compor e reusar 
código na plataforma web
• Custom Elements 
• Templates 
• Shadow DOM 
• HTML Imports
Web Components are here to fundamentally 
change the way we think, build, and 
consume our web apps. 
Eric Bidelman 
Google
Web Components 
Debunked!
Daqui em adiante, você irá se 
frustrar um pouco, faz parte do 
processo
Custom Elements 
Permite estender e definir novos 
elementos de HTML
HTML 
<news> 
<author uid="jim-kennedy"> 
Jim Kennedy</author> 
<time>April 23</time> 
<title>What is the core of 
Palestinian conflict?</title> 
<news-stats> 
<stats-reads>26</stats-reads> 
<stats-shares>312</stats-shares> 
<stats-likes>216</stats-shares> 
</news-stats> 
</news>
Elementos HTML5 podem ser 
estilizados no Internet Explorer 6 
porque nele é possível definir 
novos elementos 
https://github.com/afarkas/html5shiv
1. Semântica
Acabamos de criar uma série de 
elementos sem valor semântico 
fora do escopo do nosso projeto
HTML 
<div itemscope 
itemtype="http://schema.org/NewsArticle"> 
<!-- --> 
</div> 
Microformats acrescentam 
significado ao conteúdo
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
HTML 
<div class="board-item 
board-item--hightlight"> 
<!-- --> 
</div> 
É muito mais flexível e prático utilizar 
classes com nomes relacionados a 
aparência para estilizar
Utilizar classes e microformats é mais 
adequado sob a ótica de estilização e 
semântica que definir novos elementos
HTML 
<div class="board-item" itemscope 
itemtype="http://schema.org/NewsArticle"> 
<div class="person" itemprop="author"> 
Jim Kennedy</div> 
<time itemprop="datePublished"> 
April 23</time> 
<div class="board-item__title" 
itemprop="name"><!-- --></div> 
<div class="board-stats"> 
<div class="board-stats__reads">26</div> 
<div class="board-stats__shares">312</div> 
<div class="board-stats__likes">216</div> 
</div> 
</div>
Função dos 
2. elementos
Alguns elementos possuem 
funções que ultrapassam a de 
atribuir semântica ao conteúdo
HTML 
<link href="style.css" rel="stylesheet"> 
<script src="application.js"></script> 
<iframe src="content.html"></iframe>
HTML 
<form> 
<input type="text"> 
<input type="password"> 
<select> 
<option>Option 1</option> 
<option>Option 2</option> 
</select> 
</form>
MacOS iPad iPhone
Vejamos um exemplo de 
elemento do projeto 
Polymer
https://www.polymer-project.org/docs/elements/paper-elements. 
html#paper-dropdown-menu
https://www.polymer-project.org/docs/elements/paper-elements. 
html#paper-dropdown-menu
https://www.polymer-project.org/docs/elements/paper-elements. 
html#paper-dropdown-menu
Não reinvente elementos que 
já existem, os usuários 
agradecem
Template 
Repositório para fragmentos de 
HTML a serem utilizados por 
código JavaScript
O panorama dos 
templates na web (
HTML 
<div data-template style="display:none"> 
<img src="image.png"> 
<div>{{name}}</div> 
</div> 
Conteúdo será processado e a imagem 
será requisitada para o servidor
HTML 
<script type="text/template"> 
<img src="image.png"> 
<div>{{name}}</div> 
</script> 
Conteúdo é uma string que 
pode expor a aplicação a 
Cross-site scripting
JAVASCRIPT 
var userData = '<script src="authstealer.js">' 
el.innerHTML = t.replace('{{name}}', userData) 
Assim é que sofremos um XSS attack
)
HTML 
<template> 
<img src="image.png"> 
<div data-name>{{name}}</div> 
</template> 
JAVASCRIPT 
var t = document.querySelector('template') 
t.content.querySelector('[data-name]') 
.textContent = userData 
document.body.appendChild( 
document.importNode(t.content, true));
Templates no 
3. HTML
Não há benefício em ter no documento 
templates acessíveis apenas pelo 
JavaScript
JAVASCRIPT / JSX 
/** @jsx React.DOM */ 
var Avatar = React.createClass({ 
render: function() { 
return <div> 
<img src="image.png"/> 
<div>{ this.props.name }</div> 
</div> 
} 
})
JAVASCRIPT 
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) 
) 
} 
})
JSX JavaScript XML syntax 
• 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
Shadow DOM 
Permite isolar código HTML o 
mantendo livre de interferências 
da página
I’m definitely not a fan of making your 
widget out of a <canvas>. It is reliable but it’s 
hostile to accessibility, indexing, composition, 
and resolution independence 
Dominic Cooney 
Google
Definição 
Widgets 
Pequena aplicação de terceiros que 
pode ser instalada em suas páginas
Shadow DOM de 
4. elementos nativos
Shadow Dom
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
CSS 
video /deep/ input[type="range"] { 
display: none; 
}
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
http://videos.clicrbs.com.br
Widgets não devem ser 
manipulados de maneiras 
escusas
Encapsulamento 
5. de CSS
HTML 
<div class="widget"></div> 
<p>Not blue content</p> 
<script> 
var root = document.querySelector('.widget') 
.createShadowRoot() 
root.innerHTML = '<style>' + 
'p { color: blue }</style>' 
</script> 
As regras definidas no Shadow DOM 
não surtem efeito na página
HTML 
<style> p { background: red } </style> 
<div class="widget"></div> 
<script> 
var root = document.querySelector('.widget') 
.createShadowRoot() 
root.innerHTML = '<p>Content</p>' 
</script> 
E as regras de CSS definidas na página 
não se aplicam ao Shadow DOM
O que faz todo sentido 
quando temos um widget
Mas perder a identidade da página 
a cada Shadow DOM geralmente 
não é a intenção
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
HTML 
<div class="widget"> 
<style scoped> 
p { color: red } 
</style> 
<p>Red content</p> 
</div> 
Scoped CSS poderia ser um recurso 
tão interessante (se não só o 
Firefox tivesse suporte)
HTML Imports 
Permite carregar documentos 
HTML de maneira assíncrona
6. Requests
Permite isolar as definições de 
componentes e templates as 
custas de requests
Escopo e 
7. dependências
Código JavaScript é executado 
no mesmo escopo de window
HTML 
<head> 
<title>My funny document</title> 
<link rel="import" href="dangerous.html"> 
</head> 
dangerous.html 
<script> 
document.getElementById = function () {} 
</script>
Dependendo da ordem das 
importações, dependências 
podem ser sobrescritas
HTML 
<script src="http://cdn/jquery.js"></script> 
<script> 
$.fn.myPlugin = function () {} 
</script> 
<link rel="import" href="overwrite.html"> 
overwrite.html 
<script src="http://cdn/jquery.js"></script>
Web Components 
The good parts
Web Components 
The good parts 
Aquilo que humildemente acho legal
A única alternativa para se 
criar widgets atualmente é 
através de iframes
Iframes não permitem gerenciar 
externamente seu conteúdo e 
nem aferir sua dimensão
Encapsulamento 
1. com interfaces
HTML 
<div data-widget> 
<h1 data-page-content>Personal Content</h1> 
</div> 
<script> 
document 
.querySelector('[data-widget]') 
.createShadowRoot() 
.innerHTML = 
'<div>My widget</div>' + 
'<content select="[data-page-content]">' + 
'</content>' 
</script>
My widget 
Personal Content
HTML 
.sign-up::part(login-label) { 
color: orange; 
} 
Shadow DOM permite definir 
elementos parts passíveis de 
estilização 
http://robdodson.me/blog/2013/08/29/shadow-dom- 
styles-cont-dot
Login
Shadow DOM permite definir 
widgets com interfaces
HTML 
♥ <twitter-timeline user="jcemer"> 
@jcemer
HTML 
<gmaps-address locale="Porto Alegre"> 
<div data-address-modal> 
Auditório do SENAC <!-- --> 
</div> 
</gmaps-address> 
♥
Componentes 
2. e dependências
HTML 
<script src="http://twitter.com/timeline.js"> 
</script> 
timeline.js 
document.registerElement('twitter-timeline') 
Elementos são registrados 
diretamente através de 
JavaScript
Nestes casos, um encapsulamento 
mais flexível pode ser interessante
HTML 
<link rel="import" 
href="http://twitter.com/timeline.html"> 
timeline.html 
<template> 
<!-- --> 
</template> 
<script> 
document.registerElement('twitter-timeline') 
</script>
Imports permitem melhor 
administrar dependências
HTML 
<link rel="import" href="jquery.html"> 
<link rel="import" href="timeline.html"> 
timeline.html 
<link rel="import" href="jquery.html"> 
Documentos indicados no import 
são incluídos uma única vez
HTML 
<link rel="import" href="jquery.html"> 
<link rel="import" 
src="http://twitter.com/timeline.html"> 
timeline.html 
<link rel="import" href="jquery.html"> 
Não resolve o problema em 
diferentes domínios
Imports e templates precisam 
evoluir para solucionar mais 
problemas
Atribuindo 
3. comportamento
Componentes não devem ser 
instanciados considerando a 
página em que estão
JAVASCRIPT 
if ($('body').is('.page-product')) { 
$('[data-draggable]').draggable() 
$('[data-comments]').comments() 
} 
if ($('body').is('.page-checkout')) { 
$('[data-draggable]').draggable() 
$('[data-datepicker]').datepicker() 
}
Angular.js e Dojo usam elementos 
HTML como referência para 
instanciar componentes
Custom Elements permitem assistir 
ao ciclo de vida de um elemento
HTML 
<img src="jcemer.jpg" alt="Tableless Guy">
HTML 
<img src="diego.jpg" alt="Tableless Guy"> 
<script> 
document.querySelector('img').src = 'diego.jpg' 
</script>
Nesta trincheira, Custom Elements é 
infinitamente melhor que tudo que 
temos até então
• Elemento criado 
createdCallback
• Adicionado ao DOM 
attachedCallback
• Removido do DOM 
detachedCallback
• Alterações nos atributos 
attributeChangedCallback
JAVASCRIPT 
var newsItemProto = 
Object.create(HTMLElement.prototype) 
newsItemProto.attributeChangedCallback = 
function (attr, oldValue, value) {} 
var newsItem = 
document.registerElement('news-item', { 
prototype: newsItemProto 
})
Podemos assistir mudanças 
nos atributos de um elemento
Novos elementos são úteis apenas 
para gerenciar comportamento
HTML 
<news-item class="board-item" itemscope 
itemtype="http://schema.org/NewsArticle"> 
<div class="person" itemprop="author"> 
Jim Kennedy</div> 
<time itemprop="datePublished"> 
April 23</time> 
<div class="board-item__title" 
itemprop="name"><!-- --></div> 
<div class="board-stats"> 
<div class="board-stats__reads">26</div> 
<div class="board-stats__shares">312</div> 
<div class="board-stats__likes">216</div> 
</div> 
</news-item>
HTML 
<article is="news-item" 
class="board-item" itemscope 
itemtype="http://schema.org/NewsArticle"> 
<div class="person" itemprop="author"> 
Jim Kennedy</div> 
<time itemprop="datePublished"> 
April 23</time> 
<div class="board-item__title" 
itemprop="name"><!-- --></div> 
<div class="board-stats"> 
<div class="board-stats__reads">26</div> 
<div class="board-stats__shares">312</div> 
<div class="board-stats__likes">216</div> 
</div> 
</article>
JAVASCRIPT 
document.registerElement('news-item', { 
prototype: newsItemProto, 
extends: 'article' 
})
Polymer 
Debunked!
Polymer é um projeto que 
utiliza Web Components
O Polymer não poderá ser retirado 
do projeto quando os navegadores 
derem suporte a Web Components
The good parts 
Polymer é uma das alternativas para 
utilizar Web Components hoje mesmo 
http://jonrimmer.github.io/are-we-componentized- 
yet
Why Web Components Aren’t Ready for 
Production… Yet 
TJ VanToll 
http://developer.telerik.com/featured/web-components-arent- 
ready-production-yet
• Independentes 
• Intercambiáveis 
• Reusáveis 
modularidade 
e coesão
• Sistema para escrita de CSS 
• Modularização no JavaScript 
• Ferramenta para build de código 
• Custom Elements e Shadow DOM
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
Cheers @jcemer

Contenu connexe

Tendances

Tendances (6)

Web Components
Web Components Web Components
Web Components
 
Angular JS, você precisa conhecer
Angular JS, você precisa conhecerAngular JS, você precisa conhecer
Angular JS, você precisa conhecer
 
Html dom, eventos, jquery
Html dom, eventos, jqueryHtml dom, eventos, jquery
Html dom, eventos, jquery
 
O Mágico mundo de Web Components
O Mágico mundo de Web ComponentsO Mágico mundo de Web Components
O Mágico mundo de Web Components
 
JQuery mobile
JQuery mobileJQuery mobile
JQuery mobile
 
Java script aula 07 - j-query
Java script   aula 07 - j-queryJava script   aula 07 - j-query
Java script aula 07 - j-query
 

Similaire à Componentes para a Web

Evento Front End SP - Arquitetura de Front
Evento Front End SP - Arquitetura de FrontEvento Front End SP - Arquitetura de Front
Evento Front End SP - Arquitetura de FrontMichel Ribeiro
 
Backbone.js nas trincheiras
Backbone.js nas trincheirasBackbone.js nas trincheiras
Backbone.js nas trincheirasLambda 3
 
Cobol Web com Net Express 3.1/4.0/5.x - Parte 2
Cobol Web com Net Express 3.1/4.0/5.x - Parte 2Cobol Web com Net Express 3.1/4.0/5.x - Parte 2
Cobol Web com Net Express 3.1/4.0/5.x - Parte 2Altair Borges
 
Javascript truquesmagicos
Javascript truquesmagicosJavascript truquesmagicos
Javascript truquesmagicosponto hacker
 
Otimize sua web page e web components
Otimize sua web page e web componentsOtimize sua web page e web components
Otimize sua web page e web componentsAndré Betiolo
 
Um futuro chamado Web Components
Um futuro chamado Web ComponentsUm futuro chamado Web Components
Um futuro chamado Web ComponentsZeno Rocha
 
[CLPE] Novidades do Asp.net mvc 2
[CLPE] Novidades do Asp.net mvc 2[CLPE] Novidades do Asp.net mvc 2
[CLPE] Novidades do Asp.net mvc 2Felipe Pimentel
 
Utilizando o Padrão Presentation Model em Aplicações Flex
Utilizando o Padrão Presentation Model em Aplicações FlexUtilizando o Padrão Presentation Model em Aplicações Flex
Utilizando o Padrão Presentation Model em Aplicações FlexEric Cavalcanti
 
Web components
Web componentsWeb components
Web componentsDiego Melo
 
Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkPablo Dall'Oglio
 
Windows Azure 5/8 - Recursos adicionais do Windows Azure
Windows Azure 5/8 - Recursos adicionais do Windows AzureWindows Azure 5/8 - Recursos adicionais do Windows Azure
Windows Azure 5/8 - Recursos adicionais do Windows AzureVitor Ciaramella
 
Web components: mais simples e produtivo com polymer!
Web components: mais simples e produtivo com polymer!Web components: mais simples e produtivo com polymer!
Web components: mais simples e produtivo com polymer!Andrew Willard
 
LambdaDay: Backbone.js
LambdaDay: Backbone.jsLambdaDay: Backbone.js
LambdaDay: Backbone.jsGiovanni Bassi
 

Similaire à Componentes para a Web (20)

Evento Front End SP - Arquitetura de Front
Evento Front End SP - Arquitetura de FrontEvento Front End SP - Arquitetura de Front
Evento Front End SP - Arquitetura de Front
 
Aplicacoes Rapidas Para Web Com Django
Aplicacoes Rapidas Para Web Com DjangoAplicacoes Rapidas Para Web Com Django
Aplicacoes Rapidas Para Web Com Django
 
Backbone.js nas trincheiras
Backbone.js nas trincheirasBackbone.js nas trincheiras
Backbone.js nas trincheiras
 
React js
React js React js
React js
 
Cobol Web com Net Express 3.1/4.0/5.x - Parte 2
Cobol Web com Net Express 3.1/4.0/5.x - Parte 2Cobol Web com Net Express 3.1/4.0/5.x - Parte 2
Cobol Web com Net Express 3.1/4.0/5.x - Parte 2
 
Javascript truquesmagicos
Javascript truquesmagicosJavascript truquesmagicos
Javascript truquesmagicos
 
Otimize sua web page e web components
Otimize sua web page e web componentsOtimize sua web page e web components
Otimize sua web page e web components
 
Mini curso de c#.net
Mini curso de c#.netMini curso de c#.net
Mini curso de c#.net
 
Um futuro chamado Web Components
Um futuro chamado Web ComponentsUm futuro chamado Web Components
Um futuro chamado Web Components
 
[CLPE] Novidades do Asp.net mvc 2
[CLPE] Novidades do Asp.net mvc 2[CLPE] Novidades do Asp.net mvc 2
[CLPE] Novidades do Asp.net mvc 2
 
Quick Form DataBase (QFDB)
Quick Form DataBase (QFDB)Quick Form DataBase (QFDB)
Quick Form DataBase (QFDB)
 
Django Módulo Básico Parte II
Django Módulo Básico Parte IIDjango Módulo Básico Parte II
Django Módulo Básico Parte II
 
Utilizando o Padrão Presentation Model em Aplicações Flex
Utilizando o Padrão Presentation Model em Aplicações FlexUtilizando o Padrão Presentation Model em Aplicações Flex
Utilizando o Padrão Presentation Model em Aplicações Flex
 
Front end - the right way
Front end - the right wayFront end - the right way
Front end - the right way
 
Web components
Web componentsWeb components
Web components
 
Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um Framework
 
Windows Azure 5/8 - Recursos adicionais do Windows Azure
Windows Azure 5/8 - Recursos adicionais do Windows AzureWindows Azure 5/8 - Recursos adicionais do Windows Azure
Windows Azure 5/8 - Recursos adicionais do Windows Azure
 
Web components: mais simples e produtivo com polymer!
Web components: mais simples e produtivo com polymer!Web components: mais simples e produtivo com polymer!
Web components: mais simples e produtivo com polymer!
 
LambdaDay: Backbone.js
LambdaDay: Backbone.jsLambdaDay: Backbone.js
LambdaDay: Backbone.js
 
Arquitetura CSS
Arquitetura CSSArquitetura CSS
Arquitetura CSS
 

Componentes para a Web