Este documento presenta sobre componentes web y el framework Polymer. Introduce los conceptos clave de la plataforma web orientada a componentes, incluyendo el modelo de encapsulamiento Shadow DOM, el modelo de renderizado utilizando templates, el modelo de extensión Custom Elements y el modelo de modularización HTML Imports. También describe los nuevos roles requeridos como diseñador de componentes, programador de componentes y maquetador de componentes.
2. @javiervelezreye 2
Presentación
Componentes Web y El Framework Polymer
Licenciado en informá2ca por la Universidad Politécnica de
Madrid (UPM) desde el año 2001 y doctor en informá2ca por la
Universidad Nacional de Educación a Distancia (UNED) desde el
año 2009, Javier es inves2gador y está especializado en el diseño
y análisis de la colaboración. Esta labor la compagina con
ac2vidades de evangelización, consultoría, mentoring y formación
especializada para empresas dentro del sector IT. Inquieto, ávido
lector y seguidor cercano de las innovaciones en tecnología.
I. ¿Quién Soy?
II. ¿A Qué Me Dedico?
Desarrollado Front/Back
Evangelización Web
Arquitectura SoVware
Formación & Consultoría IT
E-learning
Diseño de Sistemas de Colaboración
Learning Analy2cs
Gamificación Colabora2va
javier.velez.reyes@gmail.com
@javiervelezreye
linkedin.com/in/javiervelezreyes
gplus.to/javiervelezreyes
jvelez77
javiervelezreyes
youtube.com/user/javiervelezreyes
13. @javiervelezreye 13
Conceptos Esenciales
Componentes Web y El Framework Polymer
I. Introducción
El modelo de componentes para la Web definido por la W3C consiste en cuatro
especificaciones tecnológicamente independientes que cubren dis2ntos aspectos del proceso
construc2vo. A lo largo de este capítulo revisaremos los conceptos esenciales que se manejan
en relación a tales especificaciones
Shadow DOM
Ofrece un modelo de encapsulamiento
que permite aislar el contenido interno
del componente de aquél en la página
donde éste es renderizado
Templates
Ofrece un modelo de construcción
basado en planEllas inertes de código
HTML que sólo son acEvadas cuando
se renderiza el componente
HTML Imports
Ofrece un modelo de modularización
basado en la posibilidad de incluir
ficheros de código HTML dentro de
otros ficheros HTML
Custom Elements
Ofrece un modelo de extensibilidad
que permite a los desarrolladores
definir sus propias eEquetas o redefinir
semánEcamente las eEquetas del
estándar DOM
17. @javiervelezreye 17
Conceptos Esenciales
Componentes Web y El Framework Polymer
II. Modelo de Encapsulamiento. Shadow DOM
var host = this;
host.querySelector(‘.foo’);
...
JS
El componente es una eEqueta accesible desde
el DOM. Para navegar el light DOM se usan los
mecanismos convencionales
A. Acceso a Light DOM
Shadow DOM Light DOM
this
.shadowRoot
var root = this.shadowRoot;
root.querySelector(‘.foo’);
...
JS
El componente es una eEqueta accesible desde
el DOM. Para acceder al root se navega por la
propiedad shadowRoot
B. Acceso a Shadow DOM
Shadow DOM Light DOM
this
.shadowRoot
En resumen, el modelo de encapsulación no oculta nada truculento. Cada nodo host dispone
de un enlace a un árbol DOM paralelo que puede ser recorrido de forma habitual siempre que
se recuerde que su punto de acceso es el shadow root.
Shadow Host, Shadow Root & Shadow DOM Shadow.1.html
20. @javiervelezreye 20
Conceptos Esenciales
Componentes Web y El Framework Polymer
II. Modelo de Encapsulamiento. Shadow DOM
var ip = root.querySelector(‘#i’);
var dNodes = ip.getDistributedNodes ();
dNodes...
JS
Seleccionado un punto de inserción se pueden
localizar los nodos del Light DOM que son
distribuidos en el shadow DOM
A. Acceso a Nodos Distribuidos
var e = host.querySelector (‘#i’);
var ips = e.getDestinationInsertionPoints();
ips...
JS
Para saber los puntos de inserción desde donde
un determinado nodo del Light DOM es referido
se accede a los puntos de inserción de desEno
B. Acceso a Puntos de Inserción de DesSno
Shadow DOM Light DOM
this
.shadowRoot
<div id=‘i’>
Es posible consultar programá2camente la colección de nodos del light DOM que son referidos
desde un punto de inserción así como saber en qué puntos de inserción se distribuye un
determinado nodo del light DOM.
Puntos de Inserción & EYqueta Content
Shadow DOM Light DOM
this
.shadowRoot
<content id=‘i’>
Shadow.2.html
28. @javiervelezreye 28
Conceptos Esenciales
Componentes Web y El Framework Polymer
IV. Modelo de Extensión. Custom Elements
Ahora que tenemos los mecanismos necesarios para definir y encapsular comportamiento y
lógica de presentación personalizada necesitamos una manera de referirlo nominalmente
dentro de nuestra página Web en forma de e2quetas personalizadas. Esto permite dis2nguir
los componentes de las e2quetas estándar lo que aumenta la legibilidad de la página.
Creación de EYquetas Personalizadas. Custom Tags
Página Huésped
...
<wc-calendar>
<wc-calendar-day>12</wc-calendar-day>
<wc-calendar-month>06</wc-calendar-month>
<wc-calendar-year>2014</wc-calendar-year>
</wc-calendar>
...
Las eEquetas personalizadas son un Epo de
elementos personalizados que permite uElizar una
referencia nominal para instanciar un componente
ya construido dentro de una página. No obstante
existen dos reglas de nombrado
ESquetas Personalizadas
Los nombres de las eEquetas personalizadas
deben tener al menos un guión en el nodeName
para diferenciarlas de las eEquetas estándar.
Regla 1. Nombres con al menos un guión
<wc-calendar> ... </wc-calendar>
No pueden uElizarse como nombres de eEquetas
personalizadas cualquiera de las cadenas con
guión que se enumeran a conEnuación.
Regla 2. Nombres reservados
annotation-xml color-profile font-face
font-face-src font-face-uri font-face-format
font-face-name missing-glyph
29. @javiervelezreye 29
Conceptos Esenciales
Componentes Web y El Framework Polymer
IV. Modelo de Extensión. Custom Elements
Debemos preocuparnos, por un lado, de registrar cada componente construido como un nuevo
2po de e2queta dentro del sistema de e2quetas del navegador y después de instanciar
componentes tanto desde el lenguaje de marcado como a través de JS.
Creación de EYquetas Personalizadas. Custom Tags
Registro de un Componente
<polymer-element name=“wc-foo”>
<template>...</template>
<script>
Polymer (‘wc-foo’, {
// prototipo del componente (foo, bar...)
});
</script>
</polymer-element>
HTML/JS
var p = Object.create(HTMLElement.prototype);
p.foo = function (){...};
p.bar = 7;
var Foo = document.registerElement(
‘wc-foo’,
{prototype: p});
JS
Tanto los snippets de código de registro
como de instanciación son versiones
equivalentes y mutuamente excluyentes
Instanciación de un Componente
<wc-foo id=“a”>
...
</wc-foo>
<wc-foo id=“b”>
...
</wc-foo>
HTML
var a = new Foo ();
var b = document.createElement(‘wc-foo’);
document.body.appendChild (a);
document.body.appendChild (b);
JS
Custom.html
30. @javiervelezreye 30
Conceptos Esenciales
Componentes Web y El Framework Polymer
IV. Modelo de Extensión. Custom Elements
Por otro lado, resulta de interés extender las propias e2quetas del estándar HTML para
generar variantes que incluyan nuevo comportamiento o lógica presentacional cuando se
rendericen. Estas e2quetas man2enen, naturalmente, el nombre de la e2queta a la que
ex2enden pero incluyen un calificador is para indicar al navegador de que se trata de una
variante dis2nta
Extensión de EYquetas Estándar. Extended Element Types
Página Huésped
...
<button id=“btn” is=“fancy-button”>
Ok
</button>
<p is=“lorem-ipsum”><p>
...
<script>
var btn = document.querySelector(‘#btn’);
btn.addEventListener(‘click’, function(e){
...
});
</script>
Las eEquetas del estándar se exEenden con
variantes cualificadas nominalmente dentro del
atributo is. Estas eEquetas manEenen el nombre,
métodos y atributos de la eEqueta de la que
derivan pero pueden sobrescribir o agregar nuevas
capacidades
Extensión de ESquetas Estándar
La nueva variante de botón incluye, por herencia
todos los atributos, métodos y modelo de eventos
que Eene la eEqueta base de la que deriva
Herencia de Capacidades
31. @javiervelezreye 31
Conceptos Esenciales
Componentes Web y El Framework Polymer
IV. Modelo de Extensión. Custom Elements
De forma similar al caso anterior, comenzaremos por registrar cada componente construido
como una variante que ex2ende una e2queta del estándar y después nos ocuparemos de
instanciar componentes tanto desde el lenguaje de marcado como a través de JS.
Extensión de EYquetas Estándar. Extended Element Types
Extensión de una ESqueta
<polymer-element name=“fancy-button”
extends=“button”>
<template>...</template>
<script>
Polymer (‘fancy-button’, {
// prototipo de la etiqueta (foo, bar...)
});
</script>
</polymer-element>
HTML/JS
var p = Object.create(HTMLButtonElement.prototype);
p.foo = function (){...};
p.bar = 7;
Var FancyButton = document.registerElement(
‘fancy-button’,
{extends: ‘button’,
prototype: p});
JS
Tanto los snippets de código de registro
como de instanciación son versiones
equivalentes y mutuamente excluyentes
Instanciación de una ESqueta
<button is=“fancy-button”
id=“a”> Ok </button>
<button is=“fancy-button”
id=“b”> Ok </button>
HTML
var a = new FancyButton ();
Var b = document.createElement
(‘fancy-button’);
document.body.appendChild (a);
document.body.appendChild (b);
JS
32. @javiervelezreye 32
Conceptos Esenciales
Componentes Web y El Framework Polymer
IV. Modelo de Extensión. Custom Elements
Es importante recalcar que los Componentes Web, una vez establecidos como elementos
personalizados atraviesan dis2ntas fases a lo largo del proceso de construcción, inserción y
potencial borrado del árbol DOM de la página huésped. El estándar ofrece método
manejadores que permiten la interposición de código en respuesta a cada una de las fases que
caracterizan dicho ciclo de vida. A con2nuación describimos someramente las mismas.
CREATED READY ATTACHED
DOM_READY DETACHED ATRIBUTE_CHANGED
El componente se ha creado y ha
sido registrado con éxito como
una nueva eEqueta o extensión
El componente está preparado.
Shadow DOM creado. Observa-
dores establecidos. Manejadores
de eventos vinculados
Una nueva instancia de algún
componente creado se ha inser-
tado dentro de la página hués-
ped
Se garanEza que todos los
componentes anidados dentro
de éste están preparados
La instancia del componente se
ha eliminado de la página
huésped
Un atributo de la instancia del
componente fue añadido,
borrado o actualizado
registro
componente
Ok
Ok
X
!
33. @javiervelezreye 33
Conceptos Esenciales
Componentes Web y El Framework Polymer
V. Modelo de Modularización. HTML Imports
Página Huésped
<!doctype html>
<html lang=“es”>
<head>
<meta charset=“utf-8”>
<script src=“platform.js”></script>
<script src=“polymer.js”></script>
<link rel=“import” href=“wc-foo.html”>
</head>
<body>
<wc-foo></wc-foo>
</body>
</html>
wc-foo.html
<polymer-element name=“wc-foo”>
<template>...</template>
<script>
Polymer (‘wc-foo’, {
// prototipo del componente
});
</script>
</polymer>
La URL asociada a un import se llama import
locaEon. Para acceder a un documento hospedado
en otro dominio deben habilitarse los permisos
CORS.
Import LocaSon
Según lo expuesto, la implementación de un componente incluye un código de plan2lla inerte,
especificaciones de es2lo y no poca lógica de scrip2ng para especificar el modelo de
comportamiento del mismo. Parece necesario disponer de un mecanismo de modularización
que permita incluir todo ese contenido en un fichero de índice a parte HTML que pueda
importarte a la página huésped.
Importación de documentos HTML
34. @javiervelezreye 34
Conceptos Esenciales
Componentes Web y El Framework Polymer
V. Modelo de Modularización. HTML Imports
Página Huésped
<!doctype html>
<html lang=“es”>
<head>
<meta charset=“utf-8”>
<script src=“platform.js”></script>
<script src=“polymer.js”></script>
<link rel="import" href=“my-lib.html”>
</head>
<body>
...
</body>
</html>
my-lib.html
<!doctype html>
<html lang=“es”>
<head>
<link rel=“import” href=“tag-1.html”>
<link rel=“import” href=“tag-2.html”>
<link rel=“stylesheet” href=“style-1.html”>
<link rel="stylesheet" href=“style-2.html”>
<script src=“script-1.js”></script>
<script src=“script-2.js”></script>
</head>
<body>
<polymer-element>
...
</polymer-element>
</body>
</html>
Los mecanismos de modularización proporcionados por la direc2va import ofrecen
oportunidades para el empaquetamiento de colecciones de recursos y manera que éstos
puedan ser entregados al cliente final a través de una única import loca2on.
Empaquetamiento de Recursos
style-2.css
style-1.css
script-2.js
script-1.js
tag-2.html
tag-1.html
A través de la carga indirecta de un fichero de
índice se cargan en la página huésped todos los
recursos a los que éste apunta o conEene
Carga Indirecta
Import.html
35. @javiervelezreye 35
Conceptos Esenciales
Componentes Web y El Framework Polymer
V. Modelo de Modularización. HTML Imports
Para controlar programá2camente desde JavaScript los procesos de carga de recursos de
documentos HTML importados mediante la clausula import la plataforma proporciona sendos
eventos sobre los que se pueden inyectar manejadores.
Eventos de Carga y Error
Enlace a Texto
<script async>
function handleLoad(e) {
console.log(‘Loaded import:’ + e.target.href);
}
function handleError(e) {
console.log(‘Error loading import:’ + e.target.href);
}
</script>
<link rel=“import” href=“file.html”
onload=“handleLoad(event)” onerror=“handleError(event)”>
Enlace a Atributo
HTML/JS
El elemento link lanza un evento load cuando
un recurso HTML ha terminado su proceso de
carga de forma exitosa.
Si se produce algún error durante el proceso
de carga del recurso HTML, por ejemplo error
404, recurso no encontrado, la eEqueta link
lanzará un evento error
36. @javiervelezreye 36
Conceptos Esenciales
Componentes Web y El Framework Polymer
V. Modelo de Modularización. HTML Imports
Importar un recurso HTML mediante la cláusula import no supone un volcado tal cual del
contenido sino que requiere de un procesamiento del mismo. Esto implica que es
desarrollador 2ene la oportunidad de capturar programá2camente dicho el contenido y operar
sobre él a conveniencia.
Manipulación del Contenido de los Recursos Importados
<head>
<link id=“foo-link” rel=“import” href=“wc-foo.html”>
</head>
<body>
...
<script>
var link = document.querySelector(‘#foo-link’);
var content = link.import;
var el = content.querySelector(‘...’);
...
</script>
</body>
HTML/JS
37. @javiervelezreye 37
Conceptos Esenciales
Componentes Web y El Framework Polymer
V. Modelo de Modularización. HTML Imports
Debemos ser conscientes de que los ficheros importados, en tanto que son documentos HTML,
pueden incluir fragmentos de scrip2ng. Dentro de estos scripts es posible referir tanto al
documento HTML que los con2ene como al documento HTML donde son hospedados a través
de la direc2va de importación.
Acceso al Recurso Importado y a la Página Huésped
Página Huésped
<!doctype html>
<html lang=“es”>
<head>
<meta charset=“utf-8”>
<script src=“platform.js”></script>
<script src=“polymer.js”></script>
<link rel="import" href=“file.html”>
</head>
<body>
...
</body>
</html>
file.html
<!doctype html>
<html lang=“es”>
<head>
...
</head>
<body>
<script>
var f = document.currentScript.ownerDocument;
var h = document;
// f refiere a este documento HTML
// h refiere a la página huésped
</script>
</body>
</html>
Regla de importación 1.
El contexto en el que se evalúan los
script dentro de una página
importada es el de la página huésped
Regla de importación 2.
Las importaciones son no bloqueantes.
Sin embargo los script dentro de la
página importada se ejecutan en orden
Regla de importación 3.
Las importaciones desde una misma
URL son procesadas solo una vez con lo
que sus script sólo se ejecutan una vez
41. @javiervelezreye 41
Aplicaciones Web Basadas en Componentes
Componentes Web y El Framework Polymer
II. Modelos de Localización entre Componentes Web
Localización Explícita
Cada componente recibe una referencia
explícita nominal de los componentes con los
que Eene que establecer un ejercicio de
coordinación
Localización Implícita
Cada componente es responsable de localizar
(por rol) dentro del entorno a los demás
componentes con los que Eene que establecer
un ejercicio de coordinación
A
B
Inyección
explícita
C
A
E
D
B
A
Localización
por búsqueda
de roles
El modelo de localización está relacionado con la selección de los mecanismos adecuados para
el establecimiento efec2vo de conexiones semán2cas o funcionales entre componentes que
deben mantenerse en coordinación para ofrecer un servicio de valor añadido al contexto
donde habitan.
43. @javiervelezreye 43
Aplicaciones Web Basadas en Componentes
Componentes Web y El Framework Polymer
IV. Modelos Coordinación de Componentes Web
Coordinación Coreográfica
La coordinación coreográfica responde a
esquemas de parEcipación distribuida donde
cada componente es responsable de reaccionar
de manera autónoma de acuerdo a un consenso
preestablecido
Coordinación Orquestal
En los mecanismos por orquestación la lógica de
coordinación es ejecutada por un componente
central que dispone de un script que detalla el
proceso coordinaEvo que es necesario efectuar
entre los componentes parEcipantes
A
Coordinación
distribuida
C B
O A
B
C
Coordinación
centralizada
Asimismo, necesitamos establecer los mecanismos de coordinación que serán aplicados entre
los componentes implicados en aras a ofrecer servicios de valor añadido. En términos
generales, es posible establecer dos grandes familias de esquemas coordina2vos, los
coreográficos y los de orquestación en función de su carácter distribuido o centralizado.