83
Enough with the JavaScript Already! Nicholas C. Zakas @slicknet

Enough with the javas cript already! de Nicholas Zakas

  • Upload
    kubide

  • View
    1.951

  • Download
    1

Embed Size (px)

DESCRIPTION

Presentación de Nicholas Zakas - Enough with the javas cript already!

Citation preview

Page 1: Enough with the javas cript already! de Nicholas Zakas

Enough with the JavaScript Already!

Nicholas C. Zakas@slicknet

Page 2: Enough with the javas cript already! de Nicholas Zakas
Page 3: Enough with the javas cript already! de Nicholas Zakas

@slicknet

Complaints: @souders

Page 4: Enough with the javas cript already! de Nicholas Zakas
Page 5: Enough with the javas cript already! de Nicholas Zakas

2004

Page 6: Enough with the javas cript already! de Nicholas Zakas
Page 7: Enough with the javas cript already! de Nicholas Zakas

2005

Page 8: Enough with the javas cript already! de Nicholas Zakas

http://www.adaptivepath.com/ideas/ajax-new-approach-web-applications

Page 9: Enough with the javas cript already! de Nicholas Zakas
Page 10: Enough with the javas cript already! de Nicholas Zakas

2006

Page 11: Enough with the javas cript already! de Nicholas Zakas
Page 12: Enough with the javas cript already! de Nicholas Zakas

2007

Page 13: Enough with the javas cript already! de Nicholas Zakas

Atwood’s LawAny application that can be written in JavaScript, will eventually be written in JavaScript.

http://www.codinghorror.com/blog/2007/07/the-principle-of-least-power.html

Page 14: Enough with the javas cript already! de Nicholas Zakas

2013

Page 15: Enough with the javas cript already! de Nicholas Zakas
Page 16: Enough with the javas cript already! de Nicholas Zakas

“Help, Nicholas! Our JavaScript is killing our site performance!”

- Everyone who contacted me while consulting

Page 17: Enough with the javas cript already! de Nicholas Zakas

> 1 MB*JavaScript loaded during page load

* Un-gzipped

Page 18: Enough with the javas cript already! de Nicholas Zakas

Server HTML CSS JavaScript

Rendering HTML

Constructing URLs

Calculating dependencies

Redirecting

Document structure

Native functionality

Accessibility

Layout

Colors

Visibility

Animation

Handling Events

Ajax

Changing UI

Page 19: Enough with the javas cript already! de Nicholas Zakas

Server HTML CSS JavaScript

Rendering HTML

Constructing URLs

Calculating dependencies

Redirecting

Document structure

Native functionality

Accessibility

Layout

Colors

Visibility

Animation

Handling Events

Ajax

Changing UI

Page 20: Enough with the javas cript already! de Nicholas Zakas

Source: HTTP Archive

Page 21: Enough with the javas cript already! de Nicholas Zakas

256 KB

260 KB 993.96 KB

793.5 KB

1570.4 KB503 KB

196 KB 568.7 KB

Gzipped Un-gzipped

Page 22: Enough with the javas cript already! de Nicholas Zakas
Page 23: Enough with the javas cript already! de Nicholas Zakas
Page 24: Enough with the javas cript already! de Nicholas Zakas

Time Spent During a Project

0%10%20%30%40%50%60%70%80%90%

100%

HTMLCSSJavaScript

Page 25: Enough with the javas cript already! de Nicholas Zakas

Client-Side Rendering

Page 26: Enough with the javas cript already! de Nicholas Zakas

Hogan.js{dust.js}EJS

Page 27: Enough with the javas cript already! de Nicholas Zakas
Page 28: Enough with the javas cript already! de Nicholas Zakas

“It's no longer good enough to build web apps around full page loads and then progressively enhance them to behave more dynamically.”

- throneofjs.com

Page 29: Enough with the javas cript already! de Nicholas Zakas
Page 30: Enough with the javas cript already! de Nicholas Zakas

https://www.facebook.com/help/189391594506832/

Page 31: Enough with the javas cript already! de Nicholas Zakas

“To improve the twitter.com experience for everyone, we've been working to take back control of our front-end performance by moving the rendering to the server.

This has allowed us to drop our initial page load times to 1/5th of what they were previously and reduce

differences in performance across browsers.”

https://blog.twitter.com/2012/improving-performance-twittercom

Page 32: Enough with the javas cript already! de Nicholas Zakas

“Our thesis [was] if we have a JavaScript runtime on the server, we should be able to pull most of this application logic back down to the server in a way that can be

shared with the client. Your great new product can run on both sides of the wire, serving up real HTML on first pageload, but then kicking off a client-side JavaScript app.”

http://nerds.airbnb.com/weve-launched-our-first-nodejs-app-to-product

Page 33: Enough with the javas cript already! de Nicholas Zakas

“…we re-launched our Mobile Web site using this new stack, replacing the Backbone.js + Rails stack that it used previously...It looks exactly the same as the app it replaced, however initial pageload feels drastically quicker because we serve up real HTML

instead of waiting for the client to download JavaScript before rendering. Plus, it is fully crawlable by search engines.”

http://nerds.airbnb.com/weve-launched-our-first-nodejs-app-to-product

Page 34: Enough with the javas cript already! de Nicholas Zakas

The server & browser are better at this than us

Page 35: Enough with the javas cript already! de Nicholas Zakas

Progressive enhancement still works

Page 36: Enough with the javas cript already! de Nicholas Zakas

Unused JavaScript

Page 37: Enough with the javas cript already! de Nicholas Zakas

60-65%JavaScript that was not executed by page load*

* My consulting clients

Page 38: Enough with the javas cript already! de Nicholas Zakas

The 4 JavaScript Load Times

In <head>

Before </body>

After page load

On demand

Page 39: Enough with the javas cript already! de Nicholas Zakas

Prerequisite:

What are the top 2-3 things users do on this page?

Page 40: Enough with the javas cript already! de Nicholas Zakas

aka Prerequisite:

Analytics!

In <head>

Page 41: Enough with the javas cript already! de Nicholas Zakas

https://support.google.com/analytics/answer/1008080?hl=en

“Once you find the code snippet, copy and paste it into your web page, just before the closing </head> tag*. If your website uses templates to generate pages, enter it just

before the closing </head> tag in the file that contains the<head> section.”

Page 42: Enough with the javas cript already! de Nicholas Zakas

Scripts needed by page load

Before </body>

Page 43: Enough with the javas cript already! de Nicholas Zakas

Before </body>

Page 44: Enough with the javas cript already! de Nicholas Zakas

Scripts needed soon after page load

After page load

Page 45: Enough with the javas cript already! de Nicholas Zakas

After page load

Page 46: Enough with the javas cript already! de Nicholas Zakas

In reaction to user

On demand

Page 47: Enough with the javas cript already! de Nicholas Zakas

On demand

Page 48: Enough with the javas cript already! de Nicholas Zakas

http://alexsexton.com/blog/2013/03/deploying-javascript-applications/

Page 49: Enough with the javas cript already! de Nicholas Zakas

http://alexsexton.com/blog/2013/03/deploying-javascript-applications/

Page 50: Enough with the javas cript already! de Nicholas Zakas

JavaScript Libraries(they are big)

Page 51: Enough with the javas cript already! de Nicholas Zakas

42.3 KB 115.0 KB

27.7 KB 90.9 KB

29.0 KB 81.5 KB

85.3 KB25.7 KB

Gzipped Un-gzipped

2.x

1.x

Page 52: Enough with the javas cript already! de Nicholas Zakas

Library Code Component Code

Page 53: Enough with the javas cript already! de Nicholas Zakas

Library Code Component Code

Page 54: Enough with the javas cript already! de Nicholas Zakas

Library Code Component Code

Page 55: Enough with the javas cript already! de Nicholas Zakas

Library Code Component Code

Page 56: Enough with the javas cript already! de Nicholas Zakas

As JS Libraries Develop

0

10

20

30

40

50

60

70

80

90

100

0

2

4

6

8

10

12

14

16

Library CodeComponent CodeNumber of Components

Page 57: Enough with the javas cript already! de Nicholas Zakas

JS Libraries and Economies of Scale

Cost perJavaScriptcomponent

Number of components

Page 58: Enough with the javas cript already! de Nicholas Zakas

Library Code Component Code

Page 59: Enough with the javas cript already! de Nicholas Zakas

Tabs

Page 60: Enough with the javas cript already! de Nicholas Zakas

Tabs?

63.1 KB 120.8 KB

95.3 KB30.2 KB

Gzipped Un-gzipped

1.x

1.9 KB 5.0 KB

How?

Page 61: Enough with the javas cript already! de Nicholas Zakas
Page 62: Enough with the javas cript already! de Nicholas Zakas

Step 1Include HTML on the page

Page 63: Enough with the javas cript already! de Nicholas Zakas

<div data-nui-type="tabview" class="nui-tabview"> <ol class="nui-tabs clearfix"> <li><a href="#">Tab 1</a></li> <li><a href="#">Tab 2</a></li> <li><a href="#">Tab 3</a></li> </ol> <div class="nui-tabpanels"> <div><p>Content 1</p></div> <div><p>Content 2</p></div> <div><p>Content 3</p></div> </div></div>

No JS yet!

Page 64: Enough with the javas cript already! de Nicholas Zakas

Step 2Store UI state on the DOM

Page 65: Enough with the javas cript already! de Nicholas Zakas

<div data-nui-type="tabview" class="nui-tabview"> <ol class="nui-tabs clearfix"> <li class="nui-selected"><a href="#">Tab 1</a></li> <li><a href="#">Tab 2</a></li> <li><a href="#">Tab 3</a></li> </ol> <div class="nui-tabpanels"> <div class="nui-selected"><p>Content 1</p></div> <div><p>Content 2</p></div> <div><p>Content 3</p></div> </div></div>

Selected tab

Selected panel

No JS yet!

Page 66: Enough with the javas cript already! de Nicholas Zakas

Step 3Sprinkle in some JS

Page 67: Enough with the javas cript already! de Nicholas Zakas

<script>nui.init();</script>

One call to initialize all instances

Page 68: Enough with the javas cript already! de Nicholas Zakas

// none of thisvar tabview = new MyLibrary.TabView("#tabs", { selected: 1 });

// none of this$(“#tabs”).tabs();

Just add more

HTML!

Page 69: Enough with the javas cript already! de Nicholas Zakas

<div data-nui-type="tabview" class="nui-tabview" data-nui-selected-index="0"> <ol class="nui-tabs clearfix" role="tablist"> <li class=" nui-selected" data-nui-index="0"><a id="nui0">Tab 1</a></li> <li data-nui-index="1"><a id="nui1">Tab 2</a></li> <li data-nui-index="2"><a id="nui2">Tab 3</a></li> </ol> <div class="nui-tabpanels"> <div class=" nui-selected"><p>Content 1</p></div> <div><p>Content 2</p></div> <div><p>Content 3</p></div> </div></div>

Page 70: Enough with the javas cript already! de Nicholas Zakas

Sure, but I bet there’s no accessibility

Page 71: Enough with the javas cript already! de Nicholas Zakas

Wrong

Page 72: Enough with the javas cript already! de Nicholas Zakas

<div data-nui-type="tabview" class="nui-tabview" data-nui-selected-index="0"> <ol class="nui-tabs clearfix" role="tablist"> <li class=" nui-selected" data-nui-index="0" role="presentation"><a id="nui0" role="tab" tabindex="0">Tab 1</a></li> <li data-nui-index="1" role="presentation"><a id="nui1" role="tab" tabindex="-1">Tab 2</a></li> <li data-nui-index="2" role="presentation"><a id="nui2" role="tab" tabindex="-1">Tab 3</a></li> </ol> <div class="nui-tabpanels"> <div class=" nui-selected" role="tabpanel" aria-labelledby="nui0" tabindex="0"><p>Content 1</p></div> <div role="tabpanel" aria-labelledby="nui1" tabindex="-1" aria-hidden="true"><p>Content 2</p></div> <div role="tabpanel" aria-labelledby="nui2" tabindex="-1" aria-hidden="true"><p>Content 3</p></div> </div></div>

Page 73: Enough with the javas cript already! de Nicholas Zakas

What the JavaScript does1. Look for tabviews via data-nui-type2. Read UI state based on classes3. Annotate DOM with additional information4. Use event delegation to watch for user

interaction5. Swap classes to react to events

Page 74: Enough with the javas cript already! de Nicholas Zakas

https://github.com/nzakas/nui

Page 75: Enough with the javas cript already! de Nicholas Zakas

Conclusion

Page 76: Enough with the javas cript already! de Nicholas Zakas

Awesome!

OK

OK

Bad!

Bytes

Valu

e

Page 77: Enough with the javas cript already! de Nicholas Zakas

Server HTML CSS JavaScript

Rendering HTML

Constructing URLs

Calculating dependencies

Redirecting

Document structure

Native functionality

Accessibility

Layout

Colors

Visibility

Animation

Handling Events

Ajax

Changing UI

Page 78: Enough with the javas cript already! de Nicholas Zakas

The 4 JavaScript Load Times•Primarily analytics•Small seed filesIn <head>•Anything needed by page load•Minimal as possibleBefore </body>

•Anything needed soon afterAfter page load

•Anything needed as a result of user actionOn demand

Page 79: Enough with the javas cript already! de Nicholas Zakas

JS Libraries and Economies of Scale

Cost perJavaScriptcomponent

Number of components

Page 80: Enough with the javas cript already! de Nicholas Zakas

42.3 KB 115.0 KB

27.7 KB 90.9 KB

29.0 KB 81.5 KB

85.3 KB25.7 KB

Gzipped Un-gzipped

2.x

1.x

Page 81: Enough with the javas cript already! de Nicholas Zakas
Page 82: Enough with the javas cript already! de Nicholas Zakas

Thank you

Page 83: Enough with the javas cript already! de Nicholas Zakas

Etcetera• My blog: nczonline.net• Twitter: @slicknet• These Slides: slideshare.net/nzakas