32
Build Reusable Web Components Using HTML5 Web Components Gil Fink CEO and Senior Consultant, sparXys

Build Reusable Web Components using HTML5 Web cComponents

Embed Size (px)

Citation preview

Build Reusable Web Components

Using HTML5 Web Components

Gil Fink CEO and Senior Consultant, sparXys

The Pyramid of Doom

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

1. Undescriptive Markup

Google+ Example

The Pyramid of Doom is Back

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

Let’s Drill Down

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);

Demo Templates

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;

Demo Imports

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

Demo Enabling Chrome to Show Shadow DOM Elements

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>’;

Demo Shadow DOM

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>

Demo Custom Elements

The Current State of Web Components

• Still W3C Working Drafts

• Browser support:

http://caniuse.com/#search=web%20components

• Main Polyfills:

Polymer X-Tag

Questions?

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

Thank You!