69
Rendering Client-side Implications & philosophy of client-side rendering. Sunday, 20 May 12

Benefits of Clientside templating for Red Dot Ruby

Embed Size (px)

DESCRIPTION

Explore the implic­a­tions & philosophy of client-side ren­der­ing & templating.

Citation preview

Page 1: Benefits of Clientside templating for Red Dot Ruby

RenderingClient-side

Implications & philosophy of client-side rendering.

Sunday, 20 May 12

Page 2: Benefits of Clientside templating for Red Dot Ruby

Me

• Tim Oxley

• @secoif

• Freelance Node.js Consultant

• blog.timoxley.com

Sunday, 20 May 12

Page 3: Benefits of Clientside templating for Red Dot Ruby

Who should be listening?

Sunday, 20 May 12

Page 4: Benefits of Clientside templating for Red Dot Ruby

Anyone who calls themselves a “web master”

Sunday, 20 May 12

Page 5: Benefits of Clientside templating for Red Dot Ruby

“Javascript is just for validations & animations.”

Sunday, 20 May 12

Page 6: Benefits of Clientside templating for Red Dot Ruby

“My site is living in 2001, I have a pantry full of ajax powered spaghetti, and

basically everything is a new page refresh. How can I make

it slick?”

Sunday, 20 May 12

Page 7: Benefits of Clientside templating for Red Dot Ruby

What is Clientside

Templating?Sunday, 20 May 12

Page 8: Benefits of Clientside templating for Red Dot Ruby

What is Clientside Templating?

1. Server sends Client templates + ‘application code’.

2. Application code initialises the View

3. As user interacts with view, JSON data is transferred between client and server.

4. Application code applies templates to the data to update the view.

Sunday, 20 May 12

Page 9: Benefits of Clientside templating for Red Dot Ruby

Downsides of Server-side

Architecture

Sunday, 20 May 12

Page 10: Benefits of Clientside templating for Red Dot Ruby

Coupling

Sunday, 20 May 12

Page 11: Benefits of Clientside templating for Red Dot Ruby

Server-side Load

• Infrastructure

• Dynamic pages can be expensive.

• Caching

Sunday, 20 May 12

Page 12: Benefits of Clientside templating for Red Dot Ruby

<li class="uiUnifiedStory uiStreamStory genericStreamStory uiStreamBoulderHighlight aid_100000938073354 uiListItem uiListLight uiListVerticalItemBorder" data-ft="{&quot;qid&quot;:&quot;5741588654933905232&quot;,&quot;mf_story_key&quot;:&quot;6185231577928856054&quot;}" id="stream_story_4fae38784e6a97a91051591"><div class="storyHighlightIndicatorWrapper"></div><div class="storyContent"><div class="UIImageBlock clearfix"><a class="actorPhoto UIImageBlock_Image UIImageBlock_MED_Image" href="http://www.facebook.com/bonnie.felice" tabindex="-1" aria-hidden="true" data-ft="{&quot;type&quot;:60,&quot;tn&quot;:&quot;\u003C&quot;}" data-hovercard="/ajax/hovercard/hovercard.php?id=100000938073354"><img class="uiProfilePhoto profilePic uiProfilePhotoLarge img" src="http://profile.ak.fbcdn.net/hprofile-ak-snc4/573465_100000938073354_159540580_q.jpg" alt=""></a><div class="storyInnerContent UIImageBlock_Content UIImageBlock_MED_Content"><div class="uiInlineBlock mlm uiPopover highlightSelector uiStreamHide" data-ft="{&quot;type&quot;:55,&quot;tn&quot;:&quot;V&quot;}" id="uisj4x_119"><a class="highlightSelectorButton uiStreamContextButton uiPopoverTriggerElem" href="#" aria-haspopup="true" role="menu" rel="toggle" id="uisj4x_120">Options</a></div><div class="mainWrapper"><h6 class="uiStreamMessage uiStreamHeadline" data-ft="{&quot;tn&quot;:&quot;:&quot;}"><div class="actorDescription actorName" data-ft="{&quot;type&quot;:2,&quot;tn&quot;:&quot;:&quot;}"><a href="http://www.facebook.com/bonnie.felice" data-ft="{&quot;tn&quot;:&quot;;&quot;}" data-hovercard="/ajax/hovercard/user.php?id=100000938073354">Bonnie Felice Newman</a></div></h6><h6 class="uiStreamMessage" data-ft="{&quot;type&quot;:1,&quot;tn&quot;:&quot;K&quot;}"> <span class="messageBody" data-ft="{&quot;type&quot;:3}">Faces with beards &gt; faces without beards</span></h6><form rel="async" class="live_393867123987887_131325686911214 commentable_item autoexpand_mode" method="post" action="/ajax/ufi/modify.php" data-live="{&quot;seq&quot;:76754027}" onsubmit="return Event.__inlineSubmit(this,event)" id="uisj4x_153"><input type="hidden" name="charset_test" value="€,´,€,´,水,Д,Є"><input type="hidden"

name="fb_dtsg" value="AQB5BhPE" autocomplete="off"><input type="hidden" autocomplete="off" name="feedback_params" value="{&quot;actor&quot;:&quot;100000938073354&quot;,&quot;target_fbid&quot;:&quot;393867123987887&quot;,&quot;target_profile_id&quot;:&quot;100000938073354&quot;,&quot;type_id&quot;:&quot;22&quot;,&quot;assoc_obj_id&quot;:&quot;&quot;,&quot;source_app_id&quot;:&quot;0&quot;,&quot;extra_story_params&quot;:[],&quot;content_timestamp&quot;:&quot;1336804069&quot;,&quot;check_hash&quot;:&quot;AQCF-FbqG1g6gOoP&quot;,&quot;source&quot;:&quot;1&quot;}"><span class="uiStreamFooter"><span class="UIActionLinks UIActionLinks_bottom" data-ft="{&quot;tn&quot;:&quot;=&quot;,&quot;type&quot;:20}"><button class="like_link stat_elem as_link" title="Like this item" type="submit" name="like" onclick="fc_click(this, false); return true;" data-ft="{&quot;tn&quot;:&quot;&gt;&quot;,&quot;type&quot;:22}"><span class="default_message">Like</span><span class="saving_message">Unlike</span></button> · <label class="uiLinkButton comment_link" title="Leave a comment"><input data-ft="{&quot;type&quot;:24,&quot;tn&quot;:&quot;S&quot;}" type="button" value="Comment" onclick="return fc_click(this);"></label> · </span><span class="uiStreamSource" data-ft="{&quot;type&quot;:26,&quot;tn&quot;:&quot;N&quot;}"><a href="/bonnie.felice/posts/393867123987887"><abbr title="Saturday, 12 May 2012 at 16:27" data-utime="1336804069" class="timestamp livetimestamp">3 hours ago</abbr></a></span> · <a data-hover="tooltip" title="Shared with: Bonnie's friends of friends" class="uiStreamPrivacy inlineBlock fbStreamPrivacy fbPrivacyAudienceIndicator" href="#"><i class="lock img sp_66rfdh sx_eda74d"></i></a></span><div><ul class="uiList uiUfi focus_target fbUfi" data-ft="{&quot;type&quot;:30,&quot;tn&quot;:&quot;]&quot;}"><li class="ufiNub uiListItem uiListVerticalItemBorder"><i></i></li><li class="hidden_elem uiUfiLike uiListItem uiListVerticalItemBorder" data-ft="{&quot;type&quot;:31}"></li><li class="translateable_info hidden_elem uiListItem uiListVerticalItemBorder"><input type="hidden" autocomplete="off" name="translate_on_load" value=""></li><li class="uiUfiComments uiListItem uiListVerticalItemBorder" data-ft="{&quot;type&quot;:32}"><ul class="commentList"><li class="uiUfiComment comment_76754027 ufiItem ufiItem" data-ft="{&quot;tn&quot;:&quot;R&quot;}"><div class="UIImageBlock clearfix uiUfiActorBlock"><a class="actorPic UIImageBlock_Image UIImageBlock_SMALL_Image" href="http://www.facebook.com/bonnie.felice" tabindex="-1" data-ft="{&quot;type&quot;:34,&quot;tn&quot;:&quot;T&quot;}" data-hovercard="/ajax/hovercard/user.php?id=100000938073354"><img class="uiProfilePhoto uiProfilePhotoMedium img" src="http://profile.ak.fbcdn.net/hprofile-ak-snc4/573465_100000938073354_159540580_q.jpg" alt=""></a><a data-hover="tooltip" title="Hide as Spam" class="commentRemoverButton UIImageBlock_Ext uiCloseButton" href="#" role="button" rel="async-post" ajaxify="/ajax/ufi/one_click_remove?comment_id=76754027&amp;commenter_id=100000938073354&amp;profile_id=100000938073354&amp;post_fbid=393867517321181&amp;can_remove=0&amp;can_report=1&amp;can_edit=0&amp;is_spam=0&amp;report_link=%2Fajax%2Freport.php%3Fcontent_type%3D74%26cid%3D393867517321181%26rid%3D100000938073354%26cid2%3D0%26profile%3D100000938073354%26h%3DAfgqqM70GpkG7LcJ&amp;feedback_params=%7B%22actor%22%3A%22100000938073354%22%2C%22target_fbid%22%3A%22393867123987887%22%2C%22target_profile_id%22%3A%22100000938073354%22%2C%22type_id%22%3A%2222%22%2C%22assoc_obj_id%22%3A%22%22%2C%22source_app_id%22%3A%220%22%2C%22extra_story_params%22%3A%5B%5D%2C%22content_timestamp%22%3A%221336804069%22%2C%22check_hash%22%3A%22AQCF-FbqG1g6gOoP%22%2C%22source%22%3A%221%22%7D"></a><div class="commentContent UIImageBlock_Content UIImageBlock_SMALL_Content" data-ft="{&quot;type&quot;:33,&quot;tn&quot;:&quot;K&quot;}"><a class="actorName" href="http://www.facebook.com/bonnie.felice" data-ft="{&quot;type&quot;:35,&quot;tn&quot;:&quot;;&quot;}" data-hovercard="/ajax/hovercard/user.php?id=100000938073354">Bonnie Felice Newman</a> <span data-jsid="text" class="commentBody">Provided the faces are male, I suppose.</span><span></span><div class="commentActions fsm fwn fcg"><a class="uiLinkSubtle" href="/bonnie.felice/posts/393867123987887?comment_id=76754027&amp;offset=0&amp;total_comments=1" data-ft="{&quot;tn&quot;:&quot;N&quot;}"><abbr title="Saturday, 12 May 2012 at 16:29" data-utime="1336804155" class="timestamp livetimestamp">3 hours ago</abbr></a> · <span class="comment_like_76754027 fsm fwn fcg" data-ft="{&quot;type&quot;:36,&quot;tn&quot;:&quot;&gt;&quot;}"><button class="stat_elem as_link cmnt_like_link" type="submit" name="like_comment_id[76754027]" value="76754027" title="Like this comment"><span class="default_message">Like</span><span class="saving_message">Unlike</span></button></span></div></div></div></li></ul></li><li class="uiUfiAddComment clearfix uiUfiSmall ufiItem ufiItem uiListItem uiListVerticalItemBorder uiUfiAddCommentCollapsed" data-ft="{&quot;tn&quot;:&quot;[&quot;}"><div class="UIImageBlock clearfix mentionsAddComment"><img class="uiProfilePhoto actorPic UIImageBlock_Image UIImageBlock_ICON_Image uiProfilePhotoMedium img" src="http://profile.ak.fbcdn.net/hprofile-ak-snc4/41628_1245243750_9374_q.jpg" alt=""><div class="commentArea UIImageBlock_Content UIImageBlock_ICON_Content"><div class="commentBox"><div class="uiMentionsInput textBoxContainer" id="uisj4x_147"><div class="highlighter"><div><span class="highlighterContent"></span></div></div><div class="uiTypeahead mentionsTypeahead" id="uisj4x_149"><div class="wrap"><input type="hidden" autocomplete="off" class="hiddenInput"><div class="innerWrap"><textarea class="enter_submit DOMControl_placeholder uiTextareaNoResize uiTextareaAutogrow textBox mentionsTextarea textInput" title="Write a comment..." placeholder="Write a comment..." name="add_comment_text" onfocus="return wait_for_load(this, event, function() {JSCC.get('j5reBLCqEq0jyN8rnQ17').init(JSCC.get('j5reBLCqEq0jyN8rnQ18'));;JSCC.get('j5reBLCqEq0jyN8rnQ18').init([&quot;buildBestAvailableNames&quot;,&quot;hoistFriends&quot;]);JSCC.get('j5reBLCqEq0jyN8rnQ16').init({&quot;max&quot;:10}, null, JSCC.get('j5reBLCqEq0jyN8rnQ17'));;;});" id="uisj4x_148" autocomplete="off" aria-autocomplete="list" aria-expanded="false" aria-invalid="false" aria-owns="typeahead_list_uisj4x_149" role="textbox" onkeydown="Bootloader.loadComponents([&quot;control-textarea&quot;], function() { TextAreaControl.getInstance(this) }.bind(this)); ">Write a comment...</textarea></div></div></div><input type="hidden" autocomplete="off" class="mentionsHidden"></div></div><label class="mts commentBtn stat_elem hidden_elem optimistic_submit uiButton uiButtonConfirm" for="uisj4x_150"><input value="Comment" class="enter_submit_target" name="comment" type="submit" id="uisj4x_150"></label></div></div></li></ul></div><input type="hidden" name="link_data" value="{&quot;qid&quot;:&quot;5741588654933905232&quot;,&quot;mf_story_key&quot;:&quot;6185231577928856054&quot;}"></form></div></div></div></div></li>

Sunday, 20 May 12

Page 13: Benefits of Clientside templating for Red Dot Ruby

<li class="uiUnifiedStory uiStreamStory genericStreamStory uiStreamBoulderHighlight aid_100000938073354 uiListItem uiListLight uiListVerticalItemBorder" data-ft="{&quot;qid&quot;:&quot;5741588654933905232&quot;,&quot;mf_story_key&quot;:&quot;6185231577928856054&quot;}" id="stream_story_4fae38784e6a97a91051591"><div class="storyHighlightIndicatorWrapper"></div><div class="storyContent"><div class="UIImageBlock clearfix"><a class="actorPhoto UIImageBlock_Image UIImageBlock_MED_Image" href="http://www.facebook.com/bonnie.felice" tabindex="-1" aria-hidden="true" data-ft="{&quot;type&quot;:60,&quot;tn&quot;:&quot;\u003C&quot;}" data-hovercard="/ajax/hovercard/hovercard.php?id=100000938073354"><img class="uiProfilePhoto profilePic uiProfilePhotoLarge img" src="http://profile.ak.fbcdn.net/hprofile-ak-snc4/573465_100000938073354_159540580_q.jpg" alt=""></a><div class="storyInnerContent UIImageBlock_Content UIImageBlock_MED_Content"><div class="uiInlineBlock mlm uiPopover highlightSelector uiStreamHide" data-ft="{&quot;type&quot;:55,&quot;tn&quot;:&quot;V&quot;}" id="uisj4x_119"><a class="highlightSelectorButton uiStreamContextButton uiPopoverTriggerElem" href="#" aria-haspopup="true" role="menu" rel="toggle" id="uisj4x_120">Options</a></div><div class="mainWrapper"><h6 class="uiStreamMessage uiStreamHeadline" data-ft="{&quot;tn&quot;:&quot;:&quot;}"><div class="actorDescription actorName" data-ft="{&quot;type&quot;:2,&quot;tn&quot;:&quot;:&quot;}"><a href="http://www.facebook.com/bonnie.felice" data-ft="{&quot;tn&quot;:&quot;;&quot;}" data-hovercard="/ajax/hovercard/user.php?id=100000938073354">Bonnie Felice Newman</a></div></h6><h6 class="uiStreamMessage" data-ft="{&quot;type&quot;:1,&quot;tn&quot;:&quot;K&quot;}"> <span class="messageBody" data-ft="{&quot;type&quot;:3}">Faces with beards &gt; faces without beards</span></h6><form rel="async" class="live_393867123987887_131325686911214 commentable_item autoexpand_mode" method="post" action="/ajax/ufi/modify.php" data-live="{&quot;seq&quot;:76754027}" onsubmit="return Event.__inlineSubmit(this,event)" id="uisj4x_153"><input type="hidden" name="charset_test" value="€,´,€,´,水,Д,Є"><input type="hidden"

name="fb_dtsg" value="AQB5BhPE" autocomplete="off"><input type="hidden" autocomplete="off" name="feedback_params" value="{&quot;actor&quot;:&quot;100000938073354&quot;,&quot;target_fbid&quot;:&quot;393867123987887&quot;,&quot;target_profile_id&quot;:&quot;100000938073354&quot;,&quot;type_id&quot;:&quot;22&quot;,&quot;assoc_obj_id&quot;:&quot;&quot;,&quot;source_app_id&quot;:&quot;0&quot;,&quot;extra_story_params&quot;:[],&quot;content_timestamp&quot;:&quot;1336804069&quot;,&quot;check_hash&quot;:&quot;AQCF-FbqG1g6gOoP&quot;,&quot;source&quot;:&quot;1&quot;}"><span class="uiStreamFooter"><span class="UIActionLinks UIActionLinks_bottom" data-ft="{&quot;tn&quot;:&quot;=&quot;,&quot;type&quot;:20}"><button class="like_link stat_elem as_link" title="Like this item" type="submit" name="like" onclick="fc_click(this, false); return true;" data-ft="{&quot;tn&quot;:&quot;&gt;&quot;,&quot;type&quot;:22}"><span class="default_message">Like</span><span class="saving_message">Unlike</span></button> · <label class="uiLinkButton comment_link" title="Leave a comment"><input data-ft="{&quot;type&quot;:24,&quot;tn&quot;:&quot;S&quot;}" type="button" value="Comment" onclick="return fc_click(this);"></label> · </span><span class="uiStreamSource" data-ft="{&quot;type&quot;:26,&quot;tn&quot;:&quot;N&quot;}"><a href="/bonnie.felice/posts/393867123987887"><abbr title="Saturday, 12 May 2012 at 16:27" data-utime="1336804069" class="timestamp livetimestamp">3 hours ago</abbr></a></span> · <a data-hover="tooltip" title="Shared with: Bonnie's friends of friends" class="uiStreamPrivacy inlineBlock fbStreamPrivacy fbPrivacyAudienceIndicator" href="#"><i class="lock img sp_66rfdh sx_eda74d"></i></a></span><div><ul class="uiList uiUfi focus_target fbUfi" data-ft="{&quot;type&quot;:30,&quot;tn&quot;:&quot;]&quot;}"><li class="ufiNub uiListItem uiListVerticalItemBorder"><i></i></li><li class="hidden_elem uiUfiLike uiListItem uiListVerticalItemBorder" data-ft="{&quot;type&quot;:31}"></li><li class="translateable_info hidden_elem uiListItem uiListVerticalItemBorder"><input type="hidden" autocomplete="off" name="translate_on_load" value=""></li><li class="uiUfiComments uiListItem uiListVerticalItemBorder" data-ft="{&quot;type&quot;:32}"><ul class="commentList"><li class="uiUfiComment comment_76754027 ufiItem ufiItem" data-ft="{&quot;tn&quot;:&quot;R&quot;}"><div class="UIImageBlock clearfix uiUfiActorBlock"><a class="actorPic UIImageBlock_Image UIImageBlock_SMALL_Image" href="http://www.facebook.com/bonnie.felice" tabindex="-1" data-ft="{&quot;type&quot;:34,&quot;tn&quot;:&quot;T&quot;}" data-hovercard="/ajax/hovercard/user.php?id=100000938073354"><img class="uiProfilePhoto uiProfilePhotoMedium img" src="http://profile.ak.fbcdn.net/hprofile-ak-snc4/573465_100000938073354_159540580_q.jpg" alt=""></a><a data-hover="tooltip" title="Hide as Spam" class="commentRemoverButton UIImageBlock_Ext uiCloseButton" href="#" role="button" rel="async-post" ajaxify="/ajax/ufi/one_click_remove?comment_id=76754027&amp;commenter_id=100000938073354&amp;profile_id=100000938073354&amp;post_fbid=393867517321181&amp;can_remove=0&amp;can_report=1&amp;can_edit=0&amp;is_spam=0&amp;report_link=%2Fajax%2Freport.php%3Fcontent_type%3D74%26cid%3D393867517321181%26rid%3D100000938073354%26cid2%3D0%26profile%3D100000938073354%26h%3DAfgqqM70GpkG7LcJ&amp;feedback_params=%7B%22actor%22%3A%22100000938073354%22%2C%22target_fbid%22%3A%22393867123987887%22%2C%22target_profile_id%22%3A%22100000938073354%22%2C%22type_id%22%3A%2222%22%2C%22assoc_obj_id%22%3A%22%22%2C%22source_app_id%22%3A%220%22%2C%22extra_story_params%22%3A%5B%5D%2C%22content_timestamp%22%3A%221336804069%22%2C%22check_hash%22%3A%22AQCF-FbqG1g6gOoP%22%2C%22source%22%3A%221%22%7D"></a><div class="commentContent UIImageBlock_Content UIImageBlock_SMALL_Content" data-ft="{&quot;type&quot;:33,&quot;tn&quot;:&quot;K&quot;}"><a class="actorName" href="http://www.facebook.com/bonnie.felice" data-ft="{&quot;type&quot;:35,&quot;tn&quot;:&quot;;&quot;}" data-hovercard="/ajax/hovercard/user.php?id=100000938073354">Bonnie Felice Newman</a> <span data-jsid="text" class="commentBody">Provided the faces are male, I suppose.</span><span></span><div class="commentActions fsm fwn fcg"><a class="uiLinkSubtle" href="/bonnie.felice/posts/393867123987887?comment_id=76754027&amp;offset=0&amp;total_comments=1" data-ft="{&quot;tn&quot;:&quot;N&quot;}"><abbr title="Saturday, 12 May 2012 at 16:29" data-utime="1336804155" class="timestamp livetimestamp">3 hours ago</abbr></a> · <span class="comment_like_76754027 fsm fwn fcg" data-ft="{&quot;type&quot;:36,&quot;tn&quot;:&quot;&gt;&quot;}"><button class="stat_elem as_link cmnt_like_link" type="submit" name="like_comment_id[76754027]" value="76754027" title="Like this comment"><span class="default_message">Like</span><span class="saving_message">Unlike</span></button></span></div></div></div></li></ul></li><li class="uiUfiAddComment clearfix uiUfiSmall ufiItem ufiItem uiListItem uiListVerticalItemBorder uiUfiAddCommentCollapsed" data-ft="{&quot;tn&quot;:&quot;[&quot;}"><div class="UIImageBlock clearfix mentionsAddComment"><img class="uiProfilePhoto actorPic UIImageBlock_Image UIImageBlock_ICON_Image uiProfilePhotoMedium img" src="http://profile.ak.fbcdn.net/hprofile-ak-snc4/41628_1245243750_9374_q.jpg" alt=""><div class="commentArea UIImageBlock_Content UIImageBlock_ICON_Content"><div class="commentBox"><div class="uiMentionsInput textBoxContainer" id="uisj4x_147"><div class="highlighter"><div><span class="highlighterContent"></span></div></div><div class="uiTypeahead mentionsTypeahead" id="uisj4x_149"><div class="wrap"><input type="hidden" autocomplete="off" class="hiddenInput"><div class="innerWrap"><textarea class="enter_submit DOMControl_placeholder uiTextareaNoResize uiTextareaAutogrow textBox mentionsTextarea textInput" title="Write a comment..." placeholder="Write a comment..." name="add_comment_text" onfocus="return wait_for_load(this, event, function() {JSCC.get('j5reBLCqEq0jyN8rnQ17').init(JSCC.get('j5reBLCqEq0jyN8rnQ18'));;JSCC.get('j5reBLCqEq0jyN8rnQ18').init([&quot;buildBestAvailableNames&quot;,&quot;hoistFriends&quot;]);JSCC.get('j5reBLCqEq0jyN8rnQ16').init({&quot;max&quot;:10}, null, JSCC.get('j5reBLCqEq0jyN8rnQ17'));;;});" id="uisj4x_148" autocomplete="off" aria-autocomplete="list" aria-expanded="false" aria-invalid="false" aria-owns="typeahead_list_uisj4x_149" role="textbox" onkeydown="Bootloader.loadComponents([&quot;control-textarea&quot;], function() { TextAreaControl.getInstance(this) }.bind(this)); ">Write a comment...</textarea></div></div></div><input type="hidden" autocomplete="off" class="mentionsHidden"></div></div><label class="mts commentBtn stat_elem hidden_elem optimistic_submit uiButton uiButtonConfirm" for="uisj4x_150"><input value="Comment" class="enter_submit_target" name="comment" type="submit" id="uisj4x_150"></label></div></div></li></ul></div><input type="hidden" name="link_data" value="{&quot;qid&quot;:&quot;5741588654933905232&quot;,&quot;mf_story_key&quot;:&quot;6185231577928856054&quot;}"></form></div></div></div></div></li>

Facebook Post + Comment =

9.1K of Markup

Sunday, 20 May 12

Page 14: Benefits of Clientside templating for Red Dot Ruby

Sunday, 20 May 12

Page 15: Benefits of Clientside templating for Red Dot Ruby

<li class="uiUnifiedStory uiStreamStory genericStreamStory uiStreamBoulderHighlight aid_100000938073354 uiListItem uiListLight uiListVerticalItemBorder" data-ft="{&quot;qid&quot;:&quot;5741588654933905232&quot;,&quot;mf_story_key&quot;:&quot;6185231577928856054&quot;}" id="stream_story_4fae38784e6a97a91051591"><div class="storyHighlightIndicatorWrapper"></div><div class="storyContent"><div class="UIImageBlock clearfix"><a class="actorPhoto UIImageBlock_Image UIImageBlock_MED_Image" href="http://www.facebook.com/bonnie.felice" tabindex="-1" aria-hidden="true" data-ft="{&quot;type&quot;:60,&quot;tn&quot;:&quot;\u003C&quot;}" data-hovercard="/ajax/hovercard/hovercard.php?id=100000938073354"><img class="uiProfilePhoto profilePic uiProfilePhotoLarge img" src="http://profile.ak.fbcdn.net/hprofile-ak-snc4/573465_100000938073354_159540580_q.jpg" alt=""></a><div class="storyInnerContent UIImageBlock_Content UIImageBlock_MED_Content"><div class="uiInlineBlock mlm uiPopover highlightSelector uiStreamHide" data-ft="{&quot;type&quot;:55,&quot;tn&quot;:&quot;V&quot;}" id="uisj4x_119"><a class="highlightSelectorButton uiStreamContextButton uiPopoverTriggerElem" href="#" aria-haspopup="true" role="menu" rel="toggle" id="uisj4x_120">Options</a></div><div class="mainWrapper"><h6 class="uiStreamMessage uiStreamHeadline" data-ft="{&quot;tn&quot;:&quot;:&quot;}"><div class="actorDescription actorName" data-ft="{&quot;type&quot;:2,&quot;tn&quot;:&quot;:&quot;}"><a href="http://www.facebook.com/bonnie.felice" data-ft="{&quot;tn&quot;:&quot;;&quot;}" data-hovercard="/ajax/hovercard/user.php?id=100000938073354">Bonnie Felice Newman</a></div></h6><h6 class="uiStreamMessage" data-ft="{&quot;type&quot;:1,&quot;tn&quot;:&quot;K&quot;}"> <span class="messageBody" data-ft="{&quot;type&quot;:3}">Faces with beards &gt; faces without beards</span></h6><form rel="async" class="live_393867123987887_131325686911214 commentable_item autoexpand_mode" method="post" action="/ajax/ufi/modify.php" data-live="{&quot;seq&quot;:76754027}" onsubmit="return Event.__inlineSubmit(this,event)" id="uisj4x_153"><input type="hidden" name="charset_test" value="€,´,€,´,水,Д,Є"><input type="hidden" name="fb_dtsg" value="AQB5BhPE" autocomplete="off"><input type="hidden" autocomplete="off" name="feedback_params" value="{&quot;actor&quot;:&quot;

100000938073354&quot;,&quot;target_fbid&quot;:&quot;393867123987887&quot;,&quot;target_profile_id&quot;:&quot;100000938073354&quot;,&quot;type_id&quot;:&quot;22&quot;,&quot;assoc_obj_id&quot;:&quot;&quot;,&quot;source_app_id&quot;:&quot;0&quot;,&quot;extra_story_params&quot;:[],&quot;content_timestamp&quot;:&quot;1336804069&quot;,&quot;check_hash&quot;:&quot;AQCF-FbqG1g6gOoP&quot;,&quotot;source&quot;:&quot;1&quot;}"><span class="uiStreamFooter"><span class="UIActionLinks UIActionLinks_bottom" data-ft="{&quot;tn&quot;:&quot;=&quot;,&quot;type&quot;:20}"><button class="like_link stat_elem as_link" title="Like this item" type="submit" name="like" onclick="fc_click(this, false); return true;" data-ft="{&quot;tn&quot;:&quot;&gt;&quot;,&quot;type&quot;:22}"><span class="default_message">Like</span><span class="saving_message">Unlike</span></button> · <label class="uiLinkButton comment_link" title="Leave a comment"><input data-ft="{&quot;type&quot;:24,&quot;tn&quot;:&quot;S&quot;}" type="button" value="Comment" onclick="return fc_click(this);"></label> · </span><span class="uiStreamSource" data-ft="{&quot;type&quot;:26,&quot;tn&quot;:&quot;N&quot;}"><a href="/bonnie.felice/posts/393867123987887"><abbr title="Saturday, 12 May 2012 at 16:27" data-utime="1336804069" class="timestamp livetimestamp">3 hours ago</abbr></a></span> · <a data-hover="tooltip" title="Shared with: Bonnie's friends of friends" class="uiStreamPrivacy inlineBlock fbStreamPrivacy fbPrivacyAudienceIndicator" href="#"><i class="lock img sp_66rfdh sx_eda74d"></i></a></span><div><ul class="uiList uiUfi focus_target fbUfi" data-ft="{&quot;type&quot;:30,&quot;tn&quot;:&quot;]&quot;}"><li class="ufiNub uiListItem uiListVerticalItemBorder"><i></i></li><li class="hidden_elem uiUfiLike uiListItem uiListVerticalItemBorder" data-ft="{&quot;type&quot;:31}"></li><li class="translateable_info hidden_elem uiListItem uiListVerticalItemBorder"><input type="hidden" autocomplete="off" name="translate_on_load" value=""></li><li class="uiUfiComments uiListItem uiListVerticalItemBorder" data-ft="{&quot;type&quot;:32}"><ul class="commentList"><li class="uiUfiComment comment_76754027 ufiItem ufiItem" data-ft="{&quot;tn&quot;:&quot;R&quot;}"><div class="UIImageBlock clearfix uiUfiActorBlock"><a class="actorPic UIImageBlock_Image UIImageBlock_SMALL_Image" href="http://www.facebook.com/bonnie.felice" tabindex="-1" data-ft="{&quot;type&quot;:34,&quot;tn&quot;:&quot;T&quot;}" data-hovercard="/ajax/hovercard/user.php?id=100000938073354"><img class="uiProfilePhoto uiProfilePhotoMedium img" src="http://profile.ak.fbcdn.net/hprofile-ak-snc4/573465_100000938073354_159540580_q.jpg" alt=""></a><a data-hover="tooltip" title="Hide as Spam" class="commentRemoverButton UIImageBlock_Ext uiCloseButton" href="#" role="button" rel="async-post" ajaxify="/ajax/ufi/one_click_remove?comment_id=76754027&amp;commenter_id=100000938073354&amp;profile_id=100000938073354&amp;post_fbid=393867517321181&amp;can_remove=0&amp;can_report=1&amp;can_edit=0&amp;is_spam=0&amp;report_link=%2Fajax%2Freport.php%3Fcontent_type%3D74%26cid%3D393867517321181%26rid%3D100000938073354%26cid2%3D0%26profile%3D100000938073354%26h%3DAfgqqM70GpkG7LcJ&amp;feedback_params=%7B%22actor%22%3A%22100000938073354%22%2C%22target_fbid%22%3A%22393867123987887%22%2C%22target_profile_id%22%3A%22100000938073354%22%2C%22type_id%22%3A%2222%22%2C%22assoc_obj_id%22%3A%22%22%2C%22source_app_id%22%3A%220%22%2C%22extra_story_params%22%3A%5B%5D%2C%22content_timestamp%22%3A%221336804069%22%2C%22check_hash%22%3A%22AQCF-FbqG1g6gOoP%22%2C%22source%22%3A%221%22%7D"></a><div class="commentContent UIImageBlock_Content UIImageBlock_SMALL_Content" data-ft="{&quot;type&quot;:33,&quot;tn&quot;:&quot;K&quot;}"><a class="actorName" href="http://www.facebook.com/bonnie.felice" data-ft="{&quot;type&quot;:35,&quot;tn&quot;:&quot;;&quot;}" data-hovercard="/ajax/hovercard/user.php?id=100000938073354">Bonnie Felice Newman</a> <span data-jsid="text" class="commentBody">Provided the faces are male, I suppose.</span><span></span><div class="commentActions fsm fwn fcg"><a class="uiLinkSubtle" href="/bonnie.felice/posts/393867123987887?comment_id=76754027&amp;offset=0&amp;total_comments=1" data-ft="{&quot;tn&quot;:&quot;N&quot;}"><abbr title="Saturday, 12 May 2012 at 16:29" data-utime="1336804155" class="timestamp livetimestamp">3 hours ago</abbr></a> · <span class="comment_like_76754027 fsm fwn fcg" data-ft="{&quot;type&quot;:36,&quot;tn&quot;:&quot;&gt;&quot;}"><button class="stat_elem as_link cmnt_like_link" type="submit" name="like_comment_id[76754027]" value="76754027" title="Like this comment"><span class="default_message">Like</span><span class="saving_message">Unlike</span></button></span></div></div></div></li></ul></li><li class="uiUfiAddComment clearfix uiUfiSmall ufiItem ufiItem uiListItem uiListVerticalItemBorder uiUfiAddCommentCollapsed" data-ft="{&quot;tn&quot;:&quot;[&quot;}"><div class="UIImageBlock clearfix mentionsAddComment"><img class="uiProfilePhoto actorPic UIImageBlock_Image UIImageBlock_ICON_Image uiProfilePhotoMedium img" src="http://profile.ak.fbcdn.net/hprofile-ak-snc4/41628_1245243750_9374_q.jpg" alt=""><div class="commentArea UIImageBlock_Content UIImageBlock_ICON_Content"><div class="commentBox"><div class="uiMentionsInput textBoxContainer" id="uisj4x_147"><div class="highlighter"><div><span class="highlighterContent"></span></div></div><div class="uiTypeahead mentionsTypeahead" id="uisj4x_149"><div class="wrap"><input type="hidden" autocomplete="off" class="hiddenInput"><div class="innerWrap"><textarea class="enter_submit DOMControl_placeholder uiTextareaNoResize uiTextareaAutogrow textBox mentionsTextarea textInput" title="Write a comment..." placeholder="Write a comment..." name="add_comment_text" onfocus="return wait_for_load(this, event, function() {JSCC.get('j5reBLCqEq0jyN8rnQ17').init(JSCC.get('j5reBLCqEq0jyN8rnQ18'));;JSCC.get('j5reBLCqEq0jyN8rnQ18').init([&quot;buildBestAvailableNames&quot;,&quot;hoistFriends&quot;]);JSCC.get('j5reBLCqEq0jyN8rnQ16').init({&quot;max&quot;:10}, null, JSCC.get('j5reBLCqEq0jyN8rnQ17'));;;});" id="uisj4x_148" autocomplete="off" aria-autocomplete="list" aria-expanded="false" aria-invalid="false" aria-owns="typeahead_list_uisj4x_149" role="textbox" onkeydown="Bootloader.loadComponents([&quot;control-textarea&quot;], function() { TextAreaControl.getInstance(this) }.bind(this)); ">Write a comment...</textarea></div></div></div><input type="hidden" autocomplete="off" class="mentionsHidden"></div></div><label class="mts commentBtn stat_elem hidden_elem optimistic_submit uiButton uiButtonConfirm" for="uisj4x_150"><input value="Comment" class="enter_submit_target" name="comment" type="submit" id="uisj4x_150"></label></div></div></li></ul></div><input type="hidden" name="link_data" value="{&quot;qid&quot;:&quot;5741588654933905232&quot;,&quot;mf_story_key&quot;:&quot;6185231577928856054&quot;}"></form></div></div></div></div></li>

Sunday, 20 May 12

Page 16: Benefits of Clientside templating for Red Dot Ruby

<li class="uiUnifiedStory uiStreamStory genericStreamStory uiStreamBoulderHighlight aid_100000938073354 uiListItem uiListLight uiListVerticalItemBorder" data-ft="{&quot;qid&quot;:&quot;5741588654933905232&quot;,&quot;mf_story_key&quot;:&quot;6185231577928856054&quot;}" id="stream_story_4fae38784e6a97a91051591"><div class="storyHighlightIndicatorWrapper"></div><div class="storyContent"><div class="UIImageBlock clearfix"><a class="actorPhoto UIImageBlock_Image UIImageBlock_MED_Image" href="http://www.facebook.com/bonnie.felice" tabindex="-1" aria-hidden="true" data-ft="{&quot;type&quot;:60,&quot;tn&quot;:&quot;\u003C&quot;}" data-hovercard="/ajax/hovercard/hovercard.php?id=100000938073354"><img class="uiProfilePhoto profilePic uiProfilePhotoLarge img" src="http://profile.ak.fbcdn.net/hprofile-ak-snc4/573465_100000938073354_159540580_q.jpg" alt=""></a><div class="storyInnerContent UIImageBlock_Content UIImageBlock_MED_Content"><div class="uiInlineBlock mlm uiPopover highlightSelector uiStreamHide" data-ft="{&quot;type&quot;:55,&quot;tn&quot;:&quot;V&quot;}" id="uisj4x_119"><a class="highlightSelectorButton uiStreamContextButton uiPopoverTriggerElem" href="#" aria-haspopup="true" role="menu" rel="toggle" id="uisj4x_120">Options</a></div><div class="mainWrapper"><h6 class="uiStreamMessage uiStreamHeadline" data-ft="{&quot;tn&quot;:&quot;:&quot;}"><div class="actorDescription actorName" data-ft="{&quot;type&quot;:2,&quot;tn&quot;:&quot;:&quot;}"><a href="http://www.facebook.com/bonnie.felice" data-ft="{&quot;tn&quot;:&quot;;&quot;}" data-hovercard="/ajax/hovercard/user.php?id=100000938073354">Bonnie Felice Newman</a></div></h6><h6 class="uiStreamMessage" data-ft="{&quot;type&quot;:1,&quot;tn&quot;:&quot;K&quot;}"> <span class="messageBody" data-ft="{&quot;type&quot;:3}">Faces with beards &gt; faces without beards</span></h6><form rel="async" class="live_393867123987887_131325686911214 commentable_item autoexpand_mode" method="post" action="/ajax/ufi/modify.php" data-live="{&quot;seq&quot;:76754027}" onsubmit="return Event.__inlineSubmit(this,event)" id="uisj4x_153"><input type="hidden" name="charset_test" value="€,´,€,´,水,Д,Є"><input type="hidden" name="fb_dtsg" value="AQB5BhPE" autocomplete="off"><input type="hidden" autocomplete="off" name="feedback_params" value="{&quot;actor&quot;:&quot;

100000938073354&quot;,&quot;target_fbid&quot;:&quot;393867123987887&quot;,&quot;target_profile_id&quot;:&quot;100000938073354&quot;,&quot;type_id&quot;:&quot;22&quot;,&quot;assoc_obj_id&quot;:&quot;&quot;,&quot;source_app_id&quot;:&quot;0&quot;,&quot;extra_story_params&quot;:[],&quot;content_timestamp&quot;:&quot;1336804069&quot;,&quot;check_hash&quot;:&quot;AQCF-FbqG1g6gOoP&quot;,&quotot;source&quot;:&quot;1&quot;}"><span class="uiStreamFooter"><span class="UIActionLinks UIActionLinks_bottom" data-ft="{&quot;tn&quot;:&quot;=&quot;,&quot;type&quot;:20}"><button class="like_link stat_elem as_link" title="Like this item" type="submit" name="like" onclick="fc_click(this, false); return true;" data-ft="{&quot;tn&quot;:&quot;&gt;&quot;,&quot;type&quot;:22}"><span class="default_message">Like</span><span class="saving_message">Unlike</span></button> · <label class="uiLinkButton comment_link" title="Leave a comment"><input data-ft="{&quot;type&quot;:24,&quot;tn&quot;:&quot;S&quot;}" type="button" value="Comment" onclick="return fc_click(this);"></label> · </span><span class="uiStreamSource" data-ft="{&quot;type&quot;:26,&quot;tn&quot;:&quot;N&quot;}"><a href="/bonnie.felice/posts/393867123987887"><abbr title="Saturday, 12 May 2012 at 16:27" data-utime="1336804069" class="timestamp livetimestamp">3 hours ago</abbr></a></span> · <a data-hover="tooltip" title="Shared with: Bonnie's friends of friends" class="uiStreamPrivacy inlineBlock fbStreamPrivacy fbPrivacyAudienceIndicator" href="#"><i class="lock img sp_66rfdh sx_eda74d"></i></a></span><div><ul class="uiList uiUfi focus_target fbUfi" data-ft="{&quot;type&quot;:30,&quot;tn&quot;:&quot;]&quot;}"><li class="ufiNub uiListItem uiListVerticalItemBorder"><i></i></li><li class="hidden_elem uiUfiLike uiListItem uiListVerticalItemBorder" data-ft="{&quot;type&quot;:31}"></li><li class="translateable_info hidden_elem uiListItem uiListVerticalItemBorder"><input type="hidden" autocomplete="off" name="translate_on_load" value=""></li><li class="uiUfiComments uiListItem uiListVerticalItemBorder" data-ft="{&quot;type&quot;:32}"><ul class="commentList"><li class="uiUfiComment comment_76754027 ufiItem ufiItem" data-ft="{&quot;tn&quot;:&quot;R&quot;}"><div class="UIImageBlock clearfix uiUfiActorBlock"><a class="actorPic UIImageBlock_Image UIImageBlock_SMALL_Image" href="http://www.facebook.com/bonnie.felice" tabindex="-1" data-ft="{&quot;type&quot;:34,&quot;tn&quot;:&quot;T&quot;}" data-hovercard="/ajax/hovercard/user.php?id=100000938073354"><img class="uiProfilePhoto uiProfilePhotoMedium img" src="http://profile.ak.fbcdn.net/hprofile-ak-snc4/573465_100000938073354_159540580_q.jpg" alt=""></a><a data-hover="tooltip" title="Hide as Spam" class="commentRemoverButton UIImageBlock_Ext uiCloseButton" href="#" role="button" rel="async-post" ajaxify="/ajax/ufi/one_click_remove?comment_id=76754027&amp;commenter_id=100000938073354&amp;profile_id=100000938073354&amp;post_fbid=393867517321181&amp;can_remove=0&amp;can_report=1&amp;can_edit=0&amp;is_spam=0&amp;report_link=%2Fajax%2Freport.php%3Fcontent_type%3D74%26cid%3D393867517321181%26rid%3D100000938073354%26cid2%3D0%26profile%3D100000938073354%26h%3DAfgqqM70GpkG7LcJ&amp;feedback_params=%7B%22actor%22%3A%22100000938073354%22%2C%22target_fbid%22%3A%22393867123987887%22%2C%22target_profile_id%22%3A%22100000938073354%22%2C%22type_id%22%3A%2222%22%2C%22assoc_obj_id%22%3A%22%22%2C%22source_app_id%22%3A%220%22%2C%22extra_story_params%22%3A%5B%5D%2C%22content_timestamp%22%3A%221336804069%22%2C%22check_hash%22%3A%22AQCF-FbqG1g6gOoP%22%2C%22source%22%3A%221%22%7D"></a><div class="commentContent UIImageBlock_Content UIImageBlock_SMALL_Content" data-ft="{&quot;type&quot;:33,&quot;tn&quot;:&quot;K&quot;}"><a class="actorName" href="http://www.facebook.com/bonnie.felice" data-ft="{&quot;type&quot;:35,&quot;tn&quot;:&quot;;&quot;}" data-hovercard="/ajax/hovercard/user.php?id=100000938073354">Bonnie Felice Newman</a> <span data-jsid="text" class="commentBody">Provided the faces are male, I suppose.</span><span></span><div class="commentActions fsm fwn fcg"><a class="uiLinkSubtle" href="/bonnie.felice/posts/393867123987887?comment_id=76754027&amp;offset=0&amp;total_comments=1" data-ft="{&quot;tn&quot;:&quot;N&quot;}"><abbr title="Saturday, 12 May 2012 at 16:29" data-utime="1336804155" class="timestamp livetimestamp">3 hours ago</abbr></a> · <span class="comment_like_76754027 fsm fwn fcg" data-ft="{&quot;type&quot;:36,&quot;tn&quot;:&quot;&gt;&quot;}"><button class="stat_elem as_link cmnt_like_link" type="submit" name="like_comment_id[76754027]" value="76754027" title="Like this comment"><span class="default_message">Like</span><span class="saving_message">Unlike</span></button></span></div></div></div></li></ul></li><li class="uiUfiAddComment clearfix uiUfiSmall ufiItem ufiItem uiListItem uiListVerticalItemBorder uiUfiAddCommentCollapsed" data-ft="{&quot;tn&quot;:&quot;[&quot;}"><div class="UIImageBlock clearfix mentionsAddComment"><img class="uiProfilePhoto actorPic UIImageBlock_Image UIImageBlock_ICON_Image uiProfilePhotoMedium img" src="http://profile.ak.fbcdn.net/hprofile-ak-snc4/41628_1245243750_9374_q.jpg" alt=""><div class="commentArea UIImageBlock_Content UIImageBlock_ICON_Content"><div class="commentBox"><div class="uiMentionsInput textBoxContainer" id="uisj4x_147"><div class="highlighter"><div><span class="highlighterContent"></span></div></div><div class="uiTypeahead mentionsTypeahead" id="uisj4x_149"><div class="wrap"><input type="hidden" autocomplete="off" class="hiddenInput"><div class="innerWrap"><textarea class="enter_submit DOMControl_placeholder uiTextareaNoResize uiTextareaAutogrow textBox mentionsTextarea textInput" title="Write a comment..." placeholder="Write a comment..." name="add_comment_text" onfocus="return wait_for_load(this, event, function() {JSCC.get('j5reBLCqEq0jyN8rnQ17').init(JSCC.get('j5reBLCqEq0jyN8rnQ18'));;JSCC.get('j5reBLCqEq0jyN8rnQ18').init([&quot;buildBestAvailableNames&quot;,&quot;hoistFriends&quot;]);JSCC.get('j5reBLCqEq0jyN8rnQ16').init({&quot;max&quot;:10}, null, JSCC.get('j5reBLCqEq0jyN8rnQ17'));;;});" id="uisj4x_148" autocomplete="off" aria-autocomplete="list" aria-expanded="false" aria-invalid="false" aria-owns="typeahead_list_uisj4x_149" role="textbox" onkeydown="Bootloader.loadComponents([&quot;control-textarea&quot;], function() { TextAreaControl.getInstance(this) }.bind(this)); ">Write a comment...</textarea></div></div></div><input type="hidden" autocomplete="off" class="mentionsHidden"></div></div><label class="mts commentBtn stat_elem hidden_elem optimistic_submit uiButton uiButtonConfirm" for="uisj4x_150"><input value="Comment" class="enter_submit_target" name="comment" type="submit" id="uisj4x_150"></label></div></div></li></ul></div><input type="hidden" name="link_data" value="{&quot;qid&quot;:&quot;5741588654933905232&quot;,&quot;mf_story_key&quot;:&quot;6185231577928856054&quot;}"></form></div></div></div></div></li>

16bytes

Sunday, 20 May 12

Page 17: Benefits of Clientside templating for Red Dot Ruby

Not DRY• Transfer of Data + Markup for every

request

Sunday, 20 May 12

Page 18: Benefits of Clientside templating for Red Dot Ruby

Not Efficient• Transfer of Data + Markup for every

request

Sunday, 20 May 12

Page 19: Benefits of Clientside templating for Red Dot Ruby

Dumb Clients

Sunday, 20 May 12

Page 20: Benefits of Clientside templating for Red Dot Ruby

Lag

Sunday, 20 May 12

Page 21: Benefits of Clientside templating for Red Dot Ruby

Unoptimal UX

Sunday, 20 May 12

Page 22: Benefits of Clientside templating for Red Dot Ruby

Ugly Clientside Code

Sunday, 20 May 12

Page 23: Benefits of Clientside templating for Red Dot Ruby

Upsides of aThick Client

Sunday, 20 May 12

Page 24: Benefits of Clientside templating for Red Dot Ruby

Free Stuff

Sunday, 20 May 12

Page 25: Benefits of Clientside templating for Red Dot Ruby

Good Architecturefor Free

Sunday, 20 May 12

Page 26: Benefits of Clientside templating for Red Dot Ruby

Decoupled Designfor Free

Sunday, 20 May 12

Page 27: Benefits of Clientside templating for Red Dot Ruby

“Good Architecture Allows Future

Features”- Yehuda Katz

Sunday, 20 May 12

Page 28: Benefits of Clientside templating for Red Dot Ruby

API For Free

Sunday, 20 May 12

Page 29: Benefits of Clientside templating for Red Dot Ruby

MOBILE

API

WEB MOBILE WEB ???

Multiplatform for Free

Sunday, 20 May 12

Page 30: Benefits of Clientside templating for Red Dot Ruby

Structure for Free

Sunday, 20 May 12

Page 31: Benefits of Clientside templating for Red Dot Ruby

Separation of Responsibilities for

Free

Sunday, 20 May 12

Page 32: Benefits of Clientside templating for Red Dot Ruby

Modular Caching for Free

Sunday, 20 May 12

Page 33: Benefits of Clientside templating for Red Dot Ruby

More Static Assets for Free

Sunday, 20 May 12

Page 34: Benefits of Clientside templating for Red Dot Ruby

Simplicity for Free

Sunday, 20 May 12

Page 35: Benefits of Clientside templating for Red Dot Ruby

Power for Free

Sunday, 20 May 12

Page 36: Benefits of Clientside templating for Red Dot Ruby

Benefits of Templating

Sunday, 20 May 12

Page 37: Benefits of Clientside templating for Red Dot Ruby

Why not just template with straight JS?

• Get a smaller stack

• Simpler

• You enjoy typing

• Need it to be a little bit faster

Sunday, 20 May 12

Page 38: Benefits of Clientside templating for Red Dot Ruby

Sunday, 20 May 12

Page 39: Benefits of Clientside templating for Red Dot Ruby

Why not just use JS?

• String concatenation and array.push + join() is unwieldy.

• Multi-line strings are a pain in JS

• Double vs. single quotes

Uglies:

Sunday, 20 May 12

Page 40: Benefits of Clientside templating for Red Dot Ruby

displaySessions: function(sessions, domSelector) { var li,html; if (sessions.length === 0) { $(domSelector).html('<li class="info">No sessions available</li>'); return; } html = sessions.map(function(s) { li = []; li.push('<li class="catalogCourse"><a href="#sessionDetails" data-id="'); li.push(s.guid); li.push('"></div><div class="coverArt"><img alt="" height="50" width="50" src="'); li.push(s.cover_art_url); li.push('" /></div><div class="details">'); li.push(s.html_description); li.push('</div><div class="rating"></div><div class="title">'); li.push(s.title); li.push('</div><div class="summary">'); li.push(s.start_on_in_words); li.push(' -- '); li.push(s.end_on_in_words); li.push('</div></a></li>'); return li.join(''); }).join(''); $(domSelector).html(html); },

Sunday, 20 May 12

Page 41: Benefits of Clientside templating for Red Dot Ruby

{{#if sessions.length}} <li class="info">No sessions available</li>{{else}} {{each sessions}} {{with this}} <li class="catalogCourse"><a href="#sessionDetails" data-id="{{guid}}"> <div class="coverArt"> <img alt="" height="50" width="50" src="{{cover_art_url}}" /> </div> <div class="details"> {{s.html_description}} </div> <div class="rating"></div> <div class="title">{{title}}</div> <div class="summary"> {{start_on_in_words}} -- {{end_on_in_words}} </div> </a></li> {{/with}} {{/each}}{{/if}}

Sunday, 20 May 12

Page 42: Benefits of Clientside templating for Red Dot Ruby

Template Engine Benefits

• Readable

• Maintainable

• Usable

Sunday, 20 May 12

Page 43: Benefits of Clientside templating for Red Dot Ruby

Downsides of Thick Client

Sunday, 20 May 12

Page 44: Benefits of Clientside templating for Red Dot Ruby

Complexity

Sunday, 20 May 12

Page 45: Benefits of Clientside templating for Red Dot Ruby

•I don’t like things that are different

•A build process is usually required

•Performance varies per device

•More state managementSunday, 20 May 12

Page 46: Benefits of Clientside templating for Red Dot Ruby

Finding the Sweet Spot

Sunday, 20 May 12

Page 47: Benefits of Clientside templating for Red Dot Ruby

The Sweet Spot

100% Serverside 100% Clientside

Serverside Rendering + Ajax

HTML

Mostly Serverside rendering + JSON

via Ajax with clientside templates

Only Render Layout with ClientEverything else

rendered with JS

Sunday, 20 May 12

Page 48: Benefits of Clientside templating for Red Dot Ruby

Hybrid Model• Twitter/Facebook/Google all render

HTML serverside for initial page load.

• UX: “Loading…” vs Content

Sunday, 20 May 12

Page 49: Benefits of Clientside templating for Red Dot Ruby

Hybrid Model• Reduces the number of requests

• Shares rendering load between client/serverside

Sunday, 20 May 12

Page 50: Benefits of Clientside templating for Red Dot Ruby

The Future

Sunday, 20 May 12

Page 51: Benefits of Clientside templating for Red Dot Ruby

The Future• Rails: the next 5 years

@wycatshttp://lanyrd.com/2012/railsconf/srhtg/

• Rails is just an API & that’s OK@maccmanhttp://blog.alexmaccaw.com/rails-is-just-and-api-and-that-s-ok

Sunday, 20 May 12

Page 53: Benefits of Clientside templating for Red Dot Ruby

Meteor is Coming

Sunday, 20 May 12

Page 54: Benefits of Clientside templating for Red Dot Ruby

What To Use?

Sunday, 20 May 12

Page 55: Benefits of Clientside templating for Red Dot Ruby

Spoilt for Choice

• JQuery

• HAML

• Mustache

• Underscore

• EJS

• Hogan

• DustJS

• Handlebars

• DoT

Sunday, 20 May 12

Page 56: Benefits of Clientside templating for Red Dot Ruby

Spoilt for Choice

• JQuery

• HAML

• Mustache

• Underscore

• EJS

• Hogan

• DustJS

• Handlebars

• DoT

Sunday, 20 May 12

Page 57: Benefits of Clientside templating for Red Dot Ruby

Stop Building Big Apps

Sunday, 20 May 12

Page 58: Benefits of Clientside templating for Red Dot Ruby

More Smaller Components

Sunday, 20 May 12

Page 59: Benefits of Clientside templating for Red Dot Ruby

Constant Greenfield

Sunday, 20 May 12

Page 60: Benefits of Clientside templating for Red Dot Ruby

Damage Control

Sunday, 20 May 12

Page 61: Benefits of Clientside templating for Red Dot Ruby

Isolate Complexity

Sunday, 20 May 12

Page 62: Benefits of Clientside templating for Red Dot Ruby

How to get started

Sunday, 20 May 12

Page 63: Benefits of Clientside templating for Red Dot Ruby

Don’t rewrite your app!

• Rewriting is (almost) never a good idea.

Sunday, 20 May 12

Page 64: Benefits of Clientside templating for Red Dot Ruby

Incremental Enhancement.

• Use client side templating for the most used parts of the app, where it makes the biggest difference.

Sunday, 20 May 12

Page 65: Benefits of Clientside templating for Red Dot Ruby

• Per User Role

• Per Device

Incremental Enhancement.

Sunday, 20 May 12

Page 66: Benefits of Clientside templating for Red Dot Ruby

Build the UI first

• Only add API features as required

• Mock your server

Sunday, 20 May 12

Page 67: Benefits of Clientside templating for Red Dot Ruby

Ember Rails• Clientside Framework

• Handlebars

• Rails integration

Sunday, 20 May 12

Page 68: Benefits of Clientside templating for Red Dot Ruby

Thanks• @secoif

• blog.timoxley.com

• Come talk to me about Node & JS

• Interested in new opportunities

Sunday, 20 May 12

Page 69: Benefits of Clientside templating for Red Dot Ruby

campjs.com

Sunday, 20 May 12