build reusable web components using html5 web ccomponents
TRANSCRIPT
Build Reusable Web Components
Using HTML5 Web Components
Gil Fink CEO and Senior Consultant, sparXys
Build Reusable Web Components
Using HTML5 Web Components
Gil Fink CEO and Senior Consultant, sparXys
About Me • sparXys CEO and Senior consultant
• ASP.NET/IIS Microsoft MVP
• Co-author of Pro Single Page Application
Development (Apress)
• Co-author of 4 Microsoft Official Courses (MOCs)
• Founder of Front-End.IL Meetup and co-organizer of
GDG Rashlatz Meetup
Agenda • The problems we face
• Web Components APIs o Templates
o Imports
o Shadow DOM
o Custom Elements
2. Poor Separation of Concerns
You want HTML, CSS and JavaScript to work together
You end up with a mess
The wiring gets in your way!
3. No Native Templates • Store HTML in hidden DOM element and show it
• Use script tag as a template holder:
<script id=”myTemplate” type=”text/template”> <div> … </div> </script>
4. No Bundling • You want to bundle a complex component
The component includes HTML, CSS and JavaScript
how would you do that? o Use a server side wrapping mechanism?
Web Components to the Rescue
• A set of standards designed to componentize the
web
• Some general goals:
Code Reuse Encapsulation Separation of
Concerns Composition Theming Expressive Semantic
The Web Components Standards
• Reusable DOM fragments Templates
• Load HTML declaratively Imports
• DOM encapsulation Shadow DOM
• Create your own elements Custom
Elements
Templates • A new HTML element – template
• Can be used to instantiate document fragments
• Can wrap HTML, style tags and script tags
• To use the template you need some JavaScript
magic
<template id=”myTemplate”> <div> … </div> </template>
Cloning a Template • Select the template and extract its content
o Using its content property
• Use the importNode function to get the cloned
content
• Only when the clone is appended to the DOM o The style and JavaScript are executed
o Resources like images are retrieved from the server
var template = document.querySelector(‘#myTemplate’); var clone = document.importNode(template.content, true);
Imports • Load additional HTML documents
o Without Ajax
• A new type of link tag
• Use the rel attribute with the import type:
<link rel=”import” href=”myImport.html”>
Imports and Bundling • Enable to bundle a full component into a HTML file
o The HTML can include scripts and CSS styles
• The whole bundle can be retrieved in a single call
Imports and The DOM • Importing a document doesn’t include it into the
DOM o It will parse it in memory and load all the additional resources
• Use the import property of the link tag:
var content = document.querySelector(‘link[rel=”import”]’).import;
Shadow DOM • Encapsulate DOM parts
o The browser will know how to present those parts
o The browser won’t show the encapsulated parts in the source code
• Creates a boundary between the component and
its user
Shadow DOM – Cont. • Use the createShadowRoot function to wrap an
element as a shadow DOM:
var host = document.querySelector(‘#shadowDOMHost’); var root = host.createShadowRoot(); root.innerHTML = ‘<div>Lurking in the shadows</div>’;
Custom Elements • Enable to extend or to create custom HTML
elements o The new element must inherit from HTMLElement
• Create a custom element using the registerElement
function:
• Extend an existing element:
var myElement = document.registerElement(‘my-element’);
var myInput = document.registerElement(‘my-input’, { prototype: Object.create(HTMLInputElement.prototype), extends: ‘input’ });
Custom Elements – Cont. • Use the element in your DOM:
or use the createElement function
• Custom elements have life cycle events.
For example: o createdCallback
o attributeChangedCallback
<my-input></my-input>
The Current State of Web Components
• Still W3C Working Drafts
• Browser support:
http://caniuse.com/#search=web%20components
• Main Polyfills:
Polymer X-Tag
Summary • Web Components are emerging standards that
enables: • Encapsulation
• Separation of Concerns
• Element portability
• And more
• They are still in working drafts
• Taking the web one step forward!
Resources • Download the slide deck:
• http://webcomponents.org/
• My Blog – http://www.gilfink.net
• Follow me on Twitter – @gilfink