Top Banner
Scalable Vector Ember Death to HTML. Long live the DOM.
56

Scalable vector ember

Jul 13, 2015

Download

Technology

mixonic
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Scalable vector ember

Scalable Vector Ember

Death to HTML. Long live the DOM.

Page 3: Scalable vector ember

201 Created

We build õ-age apps with Ember.js. We take teams from £ to • in no time flat.

Page 4: Scalable vector ember

1 <svg>2 {{#each d in paths}}3 <path {{bind-attr d=d}} />4 {{/each}}5 </svg>

Page 5: Scalable vector ember

http://emberjs.jsbin.com/woxes/10/edit

1.7: http://emberjs.jsbin.com/woxes/9 !

1.8: http://emberjs.jsbin.com/woxes/10

Page 6: Scalable vector ember
Page 7: Scalable vector ember

Vector Graphics

Preamble

Page 8: Scalable vector ember
Page 9: Scalable vector ember

Raster Graphic (PNG)

w3.org

Page 10: Scalable vector ember

Benefits of Raster Graphics

• Small file-size (photos) • Computationally simple to

render

Page 11: Scalable vector ember

Vector Graphic (SVG)

1 <?xml version="1.0" standalone="no"?> 2 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 3 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 4 <svg width="12cm" height="4cm" viewBox="0 0 1200 400" 5 xmlns="http://www.w3.org/2000/svg" version="1.1"> 6 <desc>Example rect01 - rectangle with sharp corners</desc> 7 8 <rect x="400" y="100" width="400" height="200" 9 fill="yellow" stroke="navy" stroke-width="10" />10 </svg>

w3.org

Page 12: Scalable vector ember

Benefits of Vector Graphics

• Small file-size (graphics) • Arbitrary resolution

Page 13: Scalable vector ember

Scalable Vector Graphics

Part I

Page 14: Scalable vector ember

Why are we talking about this in 2014?

Page 15: Scalable vector ember

1998 Vector Markup Language proposed by Macromedia, Microsoft. PGML proposed by Adobe, Sun. W3C kick off SVG.

2001 SVG 1.02003 SVG 1.1

Page 16: Scalable vector ember

Benefits of SVG Standard

• Easy-to-parse metadata • Links • Animation

Page 17: Scalable vector ember

1998 Vector Markup Language proposed by Macromedia, Microsoft. PGML proposed by Adobe, Sun. W3C kick off SVG.

2001 SVG 1.02003 SVG 1.12004 Konqueror 3.2 support

2005 Gecko (Firefox) support

2006 WebKit (Chrome, Safari) support

Page 19: Scalable vector ember

1998 Vector Markup Language proposed by Macromedia, Microsoft. PGML proposed by Adobe, Sun. W3C kick off SVG.

2001 SVG 1.02003 SVG 1.1

2011 IE9 is the last platform to support SVG

2004 Konqueror 3.2 support

2005 Gecko (Firefox) support

2006 WebKit (Chrome, Safari) support

Page 20: Scalable vector ember

w3techs.com

0.5% Woo!(almost)

Page 21: Scalable vector ember

w3techs.com

( ๑‾◡̀‾́)σ»

(´⊙ω⊙`)

Page 22: Scalable vector ember

3 ways to use SVG

logo.svg<svg>

document.createElementNS

Page 23: Scalable vector ember

3 ways to use SVG

logo.svg<svg>

document.createElementNS

Page 24: Scalable vector ember

Creating elements with a namespace

1 var svg = document.createElementNS("http://www.w3.org/2000/svg", "svg"); 2 svg.setAttribute("viewBox", "0 0 1200 400"); 3 svg.setAttribute("width", "12cm"); 4 svg.setAttribute("height", "4cm"); 5 var path = document.createElementNS("http://www.w3.org/2000/svg", "path"); 6 path.setAttribute("x", "400"); 7 path.setAttribute("y", "100"); 8 path.setAttribute("width", "400"); 9 path.setAttribute("height", "200");10 path.setAttribute("fill", "yellow");11 path.setAttribute("stroke", "navy");12 path.setAttribute("stroke-width", "10");13 svg.appendChild(path);14 document.body.appendChild(svg);

Page 25: Scalable vector ember

Setting SVG attributes

• Attributes are case sensitive1 var div = document.createElement("div");2 div.setAttribute("someWacky", "foo");3 div.getAttribute("someWacky"); // => "foo"4 div.getAttribute("somewacky"); // => "foo"5 6 var svg = document.createElementNS(svgNS, "svg");7 svg.setAttribute("someWow", "boo")8 svg.getAttribute("someWow"); // => "boo"9 svg.getAttribute("somewow"); // => null

• Property values are not primitives1 svg.viewBox; // => SVGAnimatedRect {animVal: SVGRect, baseVal: SVGRect}2 var viewBox = new SVGAnimatedRect(); // => TypeError: Illegal constructor3 svg.viewBox = "0 0 100 100";4 svg.getAttribute("viewBox"); // => null

Page 26: Scalable vector ember

Changing namespaces

1 <div>2 <span></span>3 <svg>4 <path></path>5 <foreignObject>6 <div></div>7 </foreignObject>8 </svg>9 </div>

Entrance to namespace dictated by next element

Exit from namespace dictated by previous element

Page 27: Scalable vector ember

Old Man Ember, Young Man Ember

Part II

Page 28: Scalable vector ember

HTMLBars

Handlebars

Page 29: Scalable vector ember

THERE CAN ONLY BE ONE

Page 30: Scalable vector ember
Page 31: Scalable vector ember

THERE CAN ONLY BE DECK

Page 32: Scalable vector ember
Page 33: Scalable vector ember

1 <section>2 {{if isShowing}}3 <span>Howdy!</span>4 {{/if}}5 </section>

A template

Page 34: Scalable vector ember

Ember.js pre-1.8

1 var buffer = "<section>\n";2 buffer += "<script metamorph-0-start></script>";3 if (isShowing) {4 buffer += " <span>Howdy!</span>\n";5 }6 buffer += "<script metamorph-0-end></script>";7 buffer += "</section>";8 9 rootElement.innerHTML = buffer;

Page 35: Scalable vector ember

Ember.js pre-1.8

1 var2 buffer 3 if (isShowing) {4 buffer 5 }6 buffer 7 buffer 8 9 rootElement.innerHTML

STRINGS, INNERHTML

Page 36: Scalable vector ember

Ember.js 1.10

1 var outerChilden = [document.createElement('section')]; 2 3 var innerChildren; 4 if (isShowing) { 5 innerChildren = [document.createElement('span');] 6 innerChildren[0].appendChild(document.createTextNode('Howdy!')); 7 while (innerChildren[0]) { 8 outerChilden[0].appendChild(innerChildren[0]); 9 }10 }11 12 while (outerChilden[0]) {13 rootElement.appendChild(outerChilden[0]);14 }

Page 37: Scalable vector ember

Ember.js 1.10

1 var 2 3 var 4 if (isShowing) { 5 innerChildren 6 innerChildren[ 7 while (innerChildren[ 8 outerChilden[ 9 }10 }11 12 while (outerChilden[13 rootElement.appendChild(outerChilden[14 }

DOM! HTMLBARS! WOOOMG!

Page 38: Scalable vector ember

Ember.js 1.8-1.9

1 var buffer, parsingNode; 2 3 buffer = "<section>\n</section>"; 4 parsingNode = document.createElement('div'); 5 parsingNode.innerHTML = buffer; 6 var outerChilden = parsingNode.childNodes; 7 8 if (isShowing) { 9 buffer = " <span>Howdy!</span>\n";10 parsingNode.innerHTML = buffer;11 var innerChildren = parsingNode.childNodes;12 while (innerChildren[0]) {13 outerChilden[0].appendChild(innerChildren[0]);14 }15 }16 17 while (outerChilden[0]) {18 rootElement.appendChild(outerChilden[0]);19 }

Page 39: Scalable vector ember

Ember.js 1.8-1.9

1 var 2 3 buffer 4 parsingNode 5 parsingNode.innerHTML 6 var 7 8 if (isShowing) { 9 buffer 10 parsingNode.innerHTML 11 12 while (innerChildren[13 outerChilden[14 }15 }16 17 while (outerChilden[18 rootElement.appendChild(outerChilden[19 }

STRING TEMPLATES, DOM for stitching

Page 40: Scalable vector ember

Tricky stuff in 1.8+

• managing a context • detecting a namespace !

Page 41: Scalable vector ember

Tricky stuff in 1.8+

1 var string = handlebarsTemplate(context, options);2 var nodes = domHelper.parseHTML(string, morph.contextualElement);3 4 var node;5 while (node = nodes[0]) {6 rootElement.appendChild(node);7 }

Page 42: Scalable vector ember

Tricky stuff in 1.8+

1 var nodes = htmlbarsTemplate(context, env, morph.contextualElement);2 3 var node;4 while (node = nodes[0]) {5 rootElement.appendChild(node);6 }

HTMLBARS, 1.10

Page 43: Scalable vector ember

Tricky stuff in 1.8+

• managing a context • detecting a namespace !

Page 44: Scalable vector ember

1 var root = document.createElement('div'); 2 3 root.innerHTML = "<svg><foreignObject><div></div></foreignObject></svg>"; 4 5 var svg = div.firstChild; 6 var foreignObject = svg.firstChild; 7 var div = foreignObject.firstChild; 8 9 svg.namespaceURI; // http://www.w3.org/2000/svg10 foreignObject.namespaceURI; // http://www.w3.org/2000/svg11 div.namespaceURI; // undefined

Tricky stuff in 1.8+

Page 45: Scalable vector ember

Tricky stuff in 1.8+

1 var root = document.createElementNS(svgNs, 'svg');! 2 ! 3 root.innerHTML = "<foreignObject><div></div></foreignObject>";! 4 ! 5 var foreignObject = root.firstChild;! 6 var div = foreignObject.firstChild;! 7 !

8 svg.namespaceURI; // http://www.w3.org/2000/svg! 9 foreignObject.namespaceURI; // http://www.w3.org/2000/svg!10 div.namespaceURI; // undefined!

Page 46: Scalable vector ember

Tricky stuff in 1.8+HTMLBARS, 1.10

1 var template = htmlbarsCompile( 2 "<foreignObject><div></div></foreignObject>" 3 ); 4 // so long as contextualElement is an SVG tag... 5 var nodes = template(context, env, morph.contextualElement); 6 7 var foreignObject = nodes[0]; 8 var div = foreignObject.firstChild; 9 10 foreignObject.namespaceURI; // http://www.w3.org/2000/svg11 div.namespaceURI; // undefined

Page 47: Scalable vector ember

Death to HTML. Long live the DOM.

Part III

Page 48: Scalable vector ember

HTML is transmitted as a string.

Page 49: Scalable vector ember

• JS String (.jst, Ember <1.10) • HTML (Angular, Polymer) • JavaScript (React, Ember > 1.9,

Mithril)

Page 50: Scalable vector ember
Page 51: Scalable vector ember

But that doesn’t mean we should process it as a string.

Page 52: Scalable vector ember

• innerHTML (.jst, Ember <1.10) • DOM (Angular, React, Ember > 1.9,

Polymer, Mithril)

Page 53: Scalable vector ember

ACTIONS UP !

BINDINGS DOWN

Page 54: Scalable vector ember

transmit strings !

process DOM

Page 55: Scalable vector ember

CONTROLLERS LEFT !

YEHUDA’S RIGHT

Page 56: Scalable vector ember

Thank you