60
Dublin, November 1, 2014 The Structure of Web Code A Case For Polymer v1

The Structure of Web Code: A Case For Polymer, November 1, 2014

Embed Size (px)

DESCRIPTION

About using Polymer (http://polymer-project.org/) to achieve better structure of the frontend code than with other tools. Part of the Dublin GDG Dev Fest.

Citation preview

Page 1: The Structure of Web Code: A Case For Polymer, November 1, 2014

Dublin, November 1, 2014

The Structureof Web Code

A CaseFor Polymer

v1

Page 2: The Structure of Web Code: A Case For Polymer, November 1, 2014

@polymer #itshackademic

Tommie Gannerttommie@

Page 3: The Structure of Web Code: A Case For Polymer, November 1, 2014

AgendaThe Structure of Web CodeWeb Components and ImplementationsPolymerTools

Page 4: The Structure of Web Code: A Case For Polymer, November 1, 2014

The Structure of Web Code

Page 5: The Structure of Web Code: A Case For Polymer, November 1, 2014
Page 6: The Structure of Web Code: A Case For Polymer, November 1, 2014

Imagine a traffic light

Page 7: The Structure of Web Code: A Case For Polymer, November 1, 2014

@polymer #itshackademichttp://jsbin.com/lefubayoha/4/

Document Style Behavior

BehaviorStyle

BehaviorStyle

Page 8: The Structure of Web Code: A Case For Polymer, November 1, 2014

@polymer #itshackademic

printf (_("For complete documentation, run: " "info coreutils '%s invocation'\n"), last_component (program_name));

Page 9: The Structure of Web Code: A Case For Polymer, November 1, 2014

@polymer #itshackademic

Contents of section .text:401c40: mov $0x404ae0,%esi401c45: callq 401180 <dcgettext@plt>401c4a: mov %rbp,%rdx401c4d: mov %rax,%rsi401c50: mov $0x1,%edi401c55: xor %eax,%eax401c57: callq 401330 <__printf_chk@plt>

Contents of section .rodata:404ae0: ascii "For complete documentation, run: " " info coreutils '%s invocation'\n"404b21: ascii "echo"404b26: ascii "Report %s …

Page 10: The Structure of Web Code: A Case For Polymer, November 1, 2014

Back To Basics

Page 11: The Structure of Web Code: A Case For Polymer, November 1, 2014

@polymer #itshackademichttp://jsbin.com/zoyapiheju/2/

Style

Behavior

Document light

app

Page 12: The Structure of Web Code: A Case For Polymer, November 1, 2014

@polymer #itshackademic

Style

traffic-app

Style

Behavior

Document

traffic-light

Behavior

Document

Web Components!

?

Page 13: The Structure of Web Code: A Case For Polymer, November 1, 2014

@polymer #itshackademic

I don't alwaysstructure my frontend code,

but when I do,I use web components.

https://imgflip.com/memegenerator/The-Most-Interesting-Man-In-The-World

Page 14: The Structure of Web Code: A Case For Polymer, November 1, 2014

Web Components?

Page 15: The Structure of Web Code: A Case For Polymer, November 1, 2014

Custom Elementsdefine new HTML/DOM elements

Page 16: The Structure of Web Code: A Case For Polymer, November 1, 2014

@polymer #itshackademic

<paper-tabs selected=“1”>

<paper-tab>Tab 1</paper-tab>

<paper-tab>Tab 2</paper-tab>

<paper-tab>Tab 3</paper-tab>

</paper-tabs>

declarative, readable

meaningful HTML

extensible → reusable

Custom Elementsdefine new HTML

Page 17: The Structure of Web Code: A Case For Polymer, November 1, 2014

@polymer #itshackademic

declarative, readable

meaningful HTML

extensible → reusable

Custom Elementsdefine new HTML

var tabs = document.querySelector('paper-tabs');

tabs.addEventListener('core-activate', function() {

console.log(this.selected);

});

Page 18: The Structure of Web Code: A Case For Polymer, November 1, 2014

Templatesnative client-side templating

Page 19: The Structure of Web Code: A Case For Polymer, November 1, 2014

@polymer #itshackademic

<template>

<div class=“comment”>

<img src=“image.png”>

</div>

<script>…</script>

</template>

use DOM to scaffold DOM → no XSS

content is inert until cloned/used

doc fragment → not part of the page

HTML Templatesnative client-side templates

parsed, not rendered

Page 20: The Structure of Web Code: A Case For Polymer, November 1, 2014

Shadow DOMDOM/CSS scoping

Page 21: The Structure of Web Code: A Case For Polymer, November 1, 2014

@polymer #itshackademic

<video src=“foo.webm” controls></video>

Page 22: The Structure of Web Code: A Case For Polymer, November 1, 2014

<video src=“foo.webm” controls></video>

Page 23: The Structure of Web Code: A Case For Polymer, November 1, 2014

Mutation/Object Observersdeclarative programming

Page 24: The Structure of Web Code: A Case For Polymer, November 1, 2014

@polymer #itshackademic

<template>

<img src=“{{src}}”>

</template>

<script>

… this.src = 'lolcat.jpg'; …

</script>

data-binding minimal DOM manipulation

two-way img.src = 'otherlolcat.jpg';

integrated use in document and code

Mutation Observersdeclarative programming

safe behind-the-scenes escaping

Page 25: The Structure of Web Code: A Case For Polymer, November 1, 2014

HTML Importsloading web components

Page 26: The Structure of Web Code: A Case For Polymer, November 1, 2014

@polymer #itshackademic

<link rel="stylesheet" href="bootstrap.css"><link rel="stylesheet" href="fonts.css"><script src="jquery.js"></script><script src="bootstrap.js"></script><script src="bootstrap-tooltip.js"></script><script src="bootstrap-dropdown.js"></script>

Page 27: The Structure of Web Code: A Case For Polymer, November 1, 2014

@polymer #itshackademic

<link rel="import" href="bootstrap.html">

Page 28: The Structure of Web Code: A Case For Polymer, November 1, 2014

● Custom Elements● Templates● Shadow DOM● Mutation/Object Observers● HTML Imports

Web Components

Page 29: The Structure of Web Code: A Case For Polymer, November 1, 2014

Good Designrequiresgood implementation

http://www.reddit.com/r/CrappyDesign/comments/2k1ima/would_it_make_it_weird_if_i_closed_the_stall_door/

Page 30: The Structure of Web Code: A Case For Polymer, November 1, 2014

@polymer #itshackademic

Browser supportNovember 2014

Page 31: The Structure of Web Code: A Case For Polymer, November 1, 2014

Polyfills Web Componentswith platform.js*

* soon to be called webcomponents.js

Page 32: The Structure of Web Code: A Case For Polymer, November 1, 2014

@polymer #itshackademic

Browser supportNovember 2014 (with Polymer)

Page 33: The Structure of Web Code: A Case For Polymer, November 1, 2014

polymer

Page 34: The Structure of Web Code: A Case For Polymer, November 1, 2014

@polymer #itshackademic

<link rel="import" href="../polymer/polymer.html"><polymer-element name="traffic-light">

…</polymer-element>

Page 35: The Structure of Web Code: A Case For Polymer, November 1, 2014

@polymer #itshackademic

<link rel="import" href="../polymer/polymer.html"><polymer-element name="traffic-light"> <template> <div></div> </template> …</polymer-element>

Page 36: The Structure of Web Code: A Case For Polymer, November 1, 2014

@polymer #itshackademic

<link rel="import" href="../polymer/polymer.html"><polymer-element name="traffic-light"> <template> <style> div { border-radius: 100px; height: 200px; width: 200px; } </style> <div></div> </template> …</polymer-element>

Page 37: The Structure of Web Code: A Case For Polymer, November 1, 2014

@polymer #itshackademic

<link rel="import" href="../polymer/polymer.html"><polymer-element name="traffic-light" attributes="color"> <template> <style> div { border-radius: 100px; height: 200px; width: 200px; } </style> <div style="background-color: {{ color }}"></div> </template> <script> Polymer({ color: 'blue' }); </script></polymer-element>

Page 38: The Structure of Web Code: A Case For Polymer, November 1, 2014

@polymer #itshackademic

<link rel="import" href="../traffic-light/traffic-light.html">

<traffic-light color="red"></traffic-light><traffic-light color="yellow"></traffic-light><traffic-light color="green"></traffic-light>

Page 39: The Structure of Web Code: A Case For Polymer, November 1, 2014

@polymer #itshackademic

<link rel="import" href="../traffic-light/traffic-light.html">

<polymer-element name="traffic-app" attributes="activeColor"> <template> <link rel="stylesheet" href="traffic-app.css"> <traffic-light color="red"></traffic-light> <traffic-light color="yellow"></traffic-light> <traffic-light color="green"></traffic-light> </template> <script name="traffic-app.js"></script></polymer-element>

Page 40: The Structure of Web Code: A Case For Polymer, November 1, 2014

@polymer #itshackademic

<link rel="import" href="../traffic-light/traffic-light.html">

<polymer-element name="traffic-app" attributes="activeColor"> <template> <link rel="stylesheet" href="traffic-app.css"> <template repeat="{{ color in lights }}"> <traffic-light color="{{ color }}"></traffic-light> </template> </template>

<script> Polymer({ activeColor: 'red', lights: [ 'red', 'yellow', 'green' ] }); </script></polymer-element>

Page 41: The Structure of Web Code: A Case For Polymer, November 1, 2014

@polymer #itshackademichttp://jsbin.com/kofowetapa/1/

Page 42: The Structure of Web Code: A Case For Polymer, November 1, 2014

APIs

Page 43: The Structure of Web Code: A Case For Polymer, November 1, 2014

APIs (as elements)

Page 44: The Structure of Web Code: A Case For Polymer, November 1, 2014

@polymer #itshackademic

I want to add a markerto a Google map.

Page 45: The Structure of Web Code: A Case For Polymer, November 1, 2014

@polymer #itshackademic

<style>

#map {

height: 400px;

}

</style>

<div id="map"></div>

<script src=“http://maps.googleapis.com/maps/api/js?callback=mapReady">

</script>

<script>

var marker = null;

function getCurrentLocation(callback) {

navigator.geolocation.watchPosition(callback);

}

function addMarker(opts, info) {

var marker = new google.maps.Marker(opts);

var infoWindow = new google.maps.InfoWindow({content: info});

google.maps.event.addListener(marker, 'click', function() {

infoWindow.open(opts.map, marker);

});

return marker;

}

function mapReady() {

var container = document.querySelector('#map');

var map = new google.maps.Map(container, {

zoom: 14, disableDefaultUI: true

});

getCurrentLocation(function(pos) {

var current = new google.maps.LatLng(pos.coords.latitude,

pos.coords.longitude);

map.setCenter(current);

// Re-position marker or create new one.

if (marker) {

marker.setPosition(map.getCenter());

} else {

marker = addMarker({

position: current, map: map, title: 'Your location'

}, '<b>Your location</b>');

}

});

}

</script>

So much code for one map marker!

Page 46: The Structure of Web Code: A Case For Polymer, November 1, 2014
Page 47: The Structure of Web Code: A Case For Polymer, November 1, 2014
Page 48: The Structure of Web Code: A Case For Polymer, November 1, 2014
Page 49: The Structure of Web Code: A Case For Polymer, November 1, 2014

paper-elements

Page 50: The Structure of Web Code: A Case For Polymer, November 1, 2014

<paper-input floatinglabel

label="Type only numbers... (floating)"

validate="^[0-9]*$"

error="Input is not a number!">

</paper-input>

@polymer #itshackademic

Page 51: The Structure of Web Code: A Case For Polymer, November 1, 2014

Tools

Page 52: The Structure of Web Code: A Case For Polymer, November 1, 2014

Bower

$ bower install --save Polymer/polymer

bower init

Page 53: The Structure of Web Code: A Case For Polymer, November 1, 2014

Vulcanize$ vulcanize -o build.html --csp --strip \ index.html

npm install -g vulcanize

Page 54: The Structure of Web Code: A Case For Polymer, November 1, 2014

goo.gl/UjLvb2

Chrome Dev Editor

Page 58: The Structure of Web Code: A Case For Polymer, November 1, 2014

Summary and Conclusions

Page 59: The Structure of Web Code: A Case For Polymer, November 1, 2014

<slide-thankyou> Questions?</slide-thankyou>

Page 60: The Structure of Web Code: A Case For Polymer, November 1, 2014

○ https://www.polymer-project.org/○ https://www.polymer-project.org/docs/start/creatingelements.html○ https://www.polymer-project.org/tools/designer/○ https://github.com/Polymer/polymer-expressions○ http://itshackademic.com/codelabs○ http://www.w3.org/TR/custom-elements/○ http://www.w3.org/TR/shadow-dom/○ http://www.w3.org/TR/html5/scripting-1.html#the-template-element○ https://dom.spec.whatwg.org/#mutation-observers○ http://wiki.ecmascript.org/doku.php?id=harmony:observe○ www.w3.org/TR/html-imports/○ http://blog.stevensanderson.com/2014/08/18/knockout-3-2-0-released/○ http://www.x-tags.org/