Transcript
Page 1: Client Side rendering Not so Easy

from 2010 to now...

Client Side Rendering is Not So Easy

Page 2: Client Side rendering Not so Easy

Nuria Ruiz

@pantojacoder

Page 3: Client Side rendering Not so Easy

What is client side rendering?

Page 4: Client Side rendering Not so Easy
Page 5: Client Side rendering Not so Easy

To move rendering to the client you need two things.

Page 6: Client Side rendering Not so Easy

A Template Engine

Templates

Page 7: Client Side rendering Not so Easy

<div class="entry"> <h1>{{title}}</h1> <div class="body"> {{{value}}} </div></div>

{ title : "Pretty Thing",value : "33"

}

Page 8: Client Side rendering Not so Easy

Loads of Javascript in the client.

Page 9: Client Side rendering Not so Easy

WARNING !!!!

Page 10: Client Side rendering Not so Easy

About 1 billion page requests every day.

10% on IE7

0.5% on IE6

Data from 2011

Page 11: Client Side rendering Not so Easy

We had a loading bar.

Page 12: Client Side rendering Not so Easy

We have a thick Javascript client.

Page 13: Client Side rendering Not so Easy

We offer several languages: Spanish, English, Catalan...

Page 14: Client Side rendering Not so Easy

Back to loads of Javascript in the client...

Remember that loading bar?

Page 15: Client Side rendering Not so Easy

500 K compressed, 23 requests ~

3300 K of Javascript !!!!

Page 16: Client Side rendering Not so Easy

Performance Problem #1

Eager loading of Javascript.

Async !=Lazy

Page 17: Client Side rendering Not so Easy

Templates were plain HTML documents.

Performance Problems #2 and #3

Page 18: Client Side rendering Not so Easy

<div class="footer"><div> <a class="hide" href="%sectionLink%"> <fw:translate id="Video.video_view_more">

%(video_view_more_link)View more... </fw:translate> </a> </div></div>

Page 19: Client Side rendering Not so Easy

We needed to do ajax to retrieve templates, which were HTML docs (cannot use <script>).

andLoads of walking the DOM to insert data.

Page 20: Client Side rendering Not so Easy
Page 21: Client Side rendering Not so Easy

StepBACK

Page 22: Client Side rendering Not so Easy

With as much Javascript we had in the client nothing is going to go fast.

Fact #1

We need to load Javascript lazily.

Page 23: Client Side rendering Not so Easy
Page 24: Client Side rendering Not so Easy

How does the YUI lazy loading work?

Page 25: Client Side rendering Not so Easy
Page 26: Client Side rendering Not so Easy

<a href="#m=Albums&amp;func=index" onclick= "Bootloader('t-albums','Request('?m=Albums&func=index')) ; return false; " title= "My photo albums"> … </a>

Each link does an HTTP request to retrieve the Javascript needed.

YUI().use('t-albums')

Page 27: Client Side rendering Not so Easy
Page 28: Client Side rendering Not so Easy

We can remove the loading bar.

Page 29: Client Side rendering Not so Easy

Fact #2

We need to start from scratch on the template engine.

Page 30: Client Side rendering Not so Easy
Page 31: Client Side rendering Not so Easy

Works using a Lexical Parser.

Based on Jison, a Javascript parser generator.

Page 32: Client Side rendering Not so Easy

<div class="entry"> <h1>{{title}}</h1> <div class="body"> {{{body}}} </div></div>

Template:

$ npm install handlebars$ /usr/bin/handlebars sample_template.js

Builds a grammar based on HTMLthat compiles to Javascript.

Compilation:

Page 33: Client Side rendering Not so Easy

(function() { var template = Handlebars.template; templates['sample_template.js'] = template(

function (Handlebars,depth0,helpers,partials,data) { helpers = helpers || Handlebars.helpers; var self = this; buffer += "<div class=\"entry\">\n <h1>"; stack1 = helpers.title || depth0.title;

..... } buffer += escapeExpression(stack1) + "</h1>\n <div class=\"body\">\n "; .... buffer += escapeExpression(stack1) + "\n </div>\n </div>\n"; return buffer;

});})()

Page 34: Client Side rendering Not so Easy

No MoreDOM manipulation

Page 35: Client Side rendering Not so Easy

Why Handlebars?

If-Else constructors Precompilation Actively Worked on.

Page 36: Client Side rendering Not so Easy

How do we download templates?

With YUI, just like anything else, templates now are Javascript.

<a href="#m=Photo&amp;func=index" onclick="Bootloader('t-photo','Request('?m=Photo&func=index'));return false;" title="My photos">…</a>

Page 37: Client Side rendering Not so Easy

YUI walks the dependency tree.

Page 38: Client Side rendering Not so Easy
Page 39: Client Side rendering Not so Easy

Translations client-side

{{{translate "Photos" "%(photo_save_title)Save"}}}

Page 40: Client Side rendering Not so Easy

Do we use Client Side Rendering for everything?

Page 41: Client Side rendering Not so Easy

No

Page 42: Client Side rendering Not so Easy

Features that exist ONLY client side, like overlays, autocomplete, spinners, chat UI.

Features for which there are significant CPU savings to be done, e.g. high traffic pages like photos.

Page 43: Client Side rendering Not so Easy

Last Thoughts.

Page 44: Client Side rendering Not so Easy

Do not think about problemsin isolation.

Page 45: Client Side rendering Not so Easy

Use the right tool for the job.

Page 46: Client Side rendering Not so Easy

Measure Everything.

Page 47: Client Side rendering Not so Easy

5 times faster

Page 48: Client Side rendering Not so Easy

Questions?


Top Related