48
from 2010 to now... Client Side Rendering is Not So Easy

Client Side rendering Not so Easy

Embed Size (px)

DESCRIPTION

You can see the video of this talk here: http://www.youtube.com/watch?v=PuNh2kp8Zt8 Our early attempts at doing client side rendering in tuenti.com brought us many performance problems, not only for the usual offenders (IE6 and IE7) but also for fast browsers like Chrome. We tried to solve most of those using a technology to render client side that ended up being faster on IE7 than Chrome, but still, things were not working. We had to scrape most of our homegrown framework and start from the beginning. We realized that the first thing we needed to do to use Javascript successfully in our thick client was to have a Javascript dependency management system. YUI came to our rescue. We also learned that in our case we would not be able to work only with client-side rendering, having server-side rendering was a must. That brings the problem of what template engine to use and whether to render server side with PHP or rather use Javascript and node so you can truly share templates between server and client. We will talk about the mistakes we made early on so you can learn from those, but also about technologies and methodologies that have (and have not) worked for us.

Citation preview

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?