SlideShare a Scribd company logo
1 of 87
Download to read offline
High-Performance
Kick-Ass
Web Apps
(with focus on JavaScript)

Stoyan Stefanov, @stoyanstefanov
April 25, 2009
JSConf, Washington, D.C.
About me
•  Yahoo! Search
•  Yahoo! Exceptional
   Performance
•  YSlow 2.0 architect
•  http://smush.it
•  Books, articles
•  http://phpied.com
Importance of performance
•  500 ms slower = 20% drop in
traffic (Google)
Importance of performance
•  500 ms slower = 20% drop in
traffic (Google)
•  400 ms slower = 5-9% drop in
full-page traffic (Yahoo!)
Importance of performance
•  500 ms slower = 20% drop in
traffic (Google)
•  400 ms slower = 5-9% drop in
full-page traffic (Yahoo!)
•  100 ms slower = 1% drop in
sales (Amazon)
Importance of performance
•  Self-regulating system
•  Slow down = lose users
•  It’s about user experience
“The premature optimization…
•  … is the root of all evil”
Knuth
•  “Make it right before you
make it fast”
Crockford
Pick your battles
•  measure
•  profile
•  monitor
On trade-offs
“…everything has its drawbacks,
as the man said when his
mother-in-law died, and they
came upon him for the funeral
expenses.”

Jerome K. Jerome
Three Man in a Boat
The Life of Page 2.0
             HTML                page
   request             onload    settles     request
             sent




                                 marriage?       R.I.P.
conception birth    graduation




                     User perceived
                     “onload” happens
                     somewhere here
The waterfall
The Waterfall
1.  Less stuff
2.  Smaller stuff
3.  Out of the way
4.  Start early
The Waterfall
1.  Less stuff
2.  Smaller stuff
3.  Out of the way
4.  Start early
Less HTTP requests
•  Combine components
Less HTTP requests
•  Before:

<script src=quot;jquery.jsquot;></script> 
<script src=quot;jquery.twitter.jsquot;></script> 
<script src=quot;jquery.cookie.jsquot;></script> 
<script src=quot;myapp.jsquot;></script> 
Less HTTP requests
•  After:

<script  
    src=quot;all.jsquot;  
     type=quot;text/javascriptquot;> 
</script> 
Less HTTP requests
•  You just saved 3 HTTP requests 
Less HTTP requests
•  repeat for CSS:

<link  
      href=quot;all.cssquot;  
      rel=quot;stylesheetquot;  
      type=quot;text/css” 

/>
Less HTTP requests
•  Inline images:
   CSS sprites
   with data: URI scheme
Less HTTP requests
•  data: URI scheme

$ php ‐r quot;echo base64_encode(file_get_contents('my.png'));” 
iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAIAAAA7ljmRAAAAGElEQVQIW2P4
DwcMDAxAfBvMAhEQMYgcACEHG8ELxtbPAAAAAElFTkSuQmCC 
Less HTTP requests
•  data: URI scheme

background‐image: url(quot;data:image/png;base64,iVBORw0KG...quot;); 
Less HTTP requests
•  data: URI scheme

<img src=quot;data:image/png;base64,iVBOR...quot; /> 
Less HTTP requests
•  data: URI scheme
•  works in IE!...
Less HTTP requests
•  data: URI scheme
•  works in IE8!
Less HTTP requests
•  data: URI scheme
•  MHTML for IE < 8


http://www.phpied.com/mhtml-when-you-need-data-uris-in-ie7-and-under/
http://www.hedgerwow.com/360/dhtml/base64-image/demo.php
Less stuff? Cache
•  Cache is less universal than
we think
•  You can help


http://yuiblog.com/blog/2007/01/04/performance-research-part-2/
“never expire” policy
•  Static components with far-
future Expires header
•  JS, CSS, img

ExpiresActive On 
ExpiresByType image/png quot;access plus 10 yearsquot; 
Inline vs. external
•  a.k.a. less http vs. more
cache
•  how about both?
Inline vs. external
•  First visit:


1. Inline
2. Lazy-load the external file
3. Write a cookie
Inline vs. external
•  Later visits:


1. Read cookie
2. Refer to the external file
The Waterfall
1.  Less stuff ✔
2.  Smaller stuff
3.  Out of the way
4.  Start early
The Waterfall
1.  Less stuff
2.  Smaller stuff
3.  Out of the way
4.  Start early
Gzip




       Source: Bill Scott, Netflix
Minify
•  Before
/** 
 * The dom module provides helper methods for  
 *    manipulating Dom elements. 
 * @module dom 
 * 
 */ 

(function() { 
    var Y = YAHOO.util,     // internal shorthand 
        getStyle,           // for load time browser branching 
        setStyle,           // ditto 
        propertyCache = {}, // for faster hyphen converts 
        reClassNameCache = {},          // cache regexes for className 
        document = window.document;     // cache for faster lookups 

    YAHOO.env._id_counter = YAHOO.env._id_counter || 0; 
Minify
•  After
(function(){var 
B=YAHOO.util,K,I,J={},F={},M=window.document;YAHOO.env._id_counter=YAHOO.en
v._id_counter||0; 
Minify
•  YUI Compressor
•  Minifies JS and CSS
•  Tolerates * and _ hacks
•  More than minification
Minify
•  Minify inline code too
Gzip or minification?
•  62,885 bytes - original jQuery (back in
Aug 2007)
•  31,822 - minified with the YUI
Compressor
•  19,758 - original gzipped
•  10,818 - minified and gzipped                FTW


http://www.julienlecomte.net/blog/2007/08/13/
204
•    The world’s smallest component?
•    204 No Content

<?php 
header(quot;HTTP/1.0 204 No Contentquot;); 
// .... do your job, e.g. logging 
?> 

http://www.phpied.com/204-no-content/
The Waterfall
1.  Less stuff ✔
2.  Smaller stuff ✔
3.  Out of the way
4.  Start early
The Waterfall
1.  Less stuff
2.  Smaller stuff
3.  Out of the way
4.  Start early
Free-falling waterfalls
•  Less DNS lookups – fetch
   components from not more
   than 2-4 domains
•  Less redirects
•  Blocking JavaScript
Not free-falling
JavaScript rocks!
•  But also blocks

   html
          js
               png

               png
Non-blocking JavaScript
•    Include via DOM
     html
                  js

            png

            png


var js = document.createElement('script'); 
js.src = 'myscript.js'; 
var h = document.getElementsByTagName('head')[0]; 
h.appendChild(js); 
Non-blocking JavaScript
•  And what about my inline
   scripts?
•  Setup a collection (registry)
   of inline scripts
Step 1
•  Inline in the <head>:

var myapp = { 
  stuff: [] 
}; 
Step 2
•    Add to the registry

Instead of:
  <script>alert('boo!');</script> 
Do:
  <script> 
    myapp.stuff.push(function(){ 
      alert('boo!'); 
    }); 
  </script> 
Step 3
•  Execute all

var l = myapp.stuff.length;  
for(var i = 0, i < l; i++) { 
  myapp.stuff[i](); 
} 
Blocking CSS?



But they do block:
•  In FF2
•  When followed by a script
The Waterfall
1.  Less stuff ✔
2.  Smaller stuff ✔
3.  Out of the way ✔
4.  Start early
The Waterfall
1.  Less stuff
2.  Smaller stuff
3.  Out of the way
4.  Start early
flush() early
 html
                         png

                    js               
                               css



 html



   js
        png
                                     ✔
              css
flush()
<html> 
<head> 
  <script src=quot;my.jsquot;  
   type=quot;text/javascriptquot;></script> 
  <link href=quot;my.cssquot;  
   type=quot;text/cssquot; rel=quot;stylesheetquot; /> 
</head> 
<?php flush() ?> 
<body> 
  .... 
The Waterfall
1.  Less stuff ✔
2.  Smaller stuff ✔
3.  Out of the way ✔
4.  Start early ✔
Life after onload
Life after onload
1.  Lazy-load
2.  Preload
3.  XHR
4.  JavaScript optimizations
Lazy-load

•  bells & whistles
•  badges & widgets
Preload

•  to help next page’s
waterfall
•  img, CSS, JS, DNS lookups
XHR (Ajax)

•  small – gzip, JSON
•  less – Expires 
•  GET over POST
GET vs. POST for XHR
var url = 'test.php'; 
var request =  new XMLHttpRequest(); 
request.open(quot;POSTquot;, url, false); 
// … 
request.send('test=1'); 
GET vs. POST for XHR
JavaScript optimizations
•  local vars
•  DOM
•  garbage collection
•  init-time branching
•  memoization
•  threads
Local variables

•  globals are all sorts of bad
•  use var 
•  localize globals
Local variables
var a = 1;  
(function(){ 
  var a = 2;  
  function b(){ 
    var a = 3;  
    alert(a); 
  } 
  b();  
})(); // 3 
Local variables
var a = 1;  
(function(){ 
  var a = 2;  
  function b(){ 
    // var a = 3;  
    alert(a); 
  } 
  b();  
})(); // 2 
Local variables
var a = 1;  
(function(){ 
  // var a = 2;  
  function b(){ 
    // var a = 3;  
    alert(a); 
  } 
  b();  
})(); // 1 
Local variables
•  less crawling up the scope chain
•  localize
•  function pointers too
•  help YUI compressor (it won’t rename
globals)
                         Wait!
                      Isn’t that a
                  micro-optimization?
Localize DOM access
function foo(){ 
  for (var i = 0; i < 100000; i++) { 
    document.getElementsByTagName('head'); 
  } 
} 
foo(); 
Localize DOM access
function foo(){ 
  var get = document.getElementsByTagName; 
  for (var i = 0; i < 100000; i++) { 
    get('head'); 
  } 
} 
                                          4
foo();  
                                        times
                                        faster
Touching the DOM
function foo() { 
  for (var count = 0; count < 1000; count++) { 
    document.body.innerHTML += 1; 
  } 
} 
Touching the DOM
function foo() { 
  var inner = ''; 
  for (var count = 0; count < 1000; count++) { 
    inner += 1; 
  } 
  document.body.innerHTML += inner; 
                                        1000
} 
                                        times
                                        faster
Cleaning up after yourself
•  Properties you no longer need

var myApp = { 
  prop: huge 
}; 
// ... 
delete myApp.prop; 
Cleaning up after yourself
•  DOM elements you no longer
need

var el = $('mydiv'); 
el.parentNode.removeChild(el); 
Cleaning up after yourself
•  DOM elements you no longer
need

var el = $('mydiv'); 
delete el.parentNode.removeChild(el); 
Init-time branching
•  Instead of…

function myEvent(el, type, fn) { 
  if (window.addEventListener) { 
    el.addEventListener(type, fn, false); 
  } else if (window.attachEvent) { 
    el.attachEvent(quot;onquot; + type, fn); 
  } else {… 
} 
Init-time branching
•  Do…

if (window.addEventListener) { 
  var myEvent = function (el, type, fn) { 
    el.addEventListener(type, fn, false); 
  } 
} else if (window.attachEvent) { 
  var myEvent = function (el, type, fn) { 
    el.attachEvent(quot;onquot; + type, fn); 
  } 
} 
Lazy definition

function myEvent(el, type, fn) { 
  if (window.addEventListener) { 
    myEvent = function(el, type, fn) { 
      el.addEventListener(type, fn, false); 
    }; 
  } else if (window.attachEvent) { 
    //... 
  } 
  return myEvent(el, type, fn); 
} 
Memoization
•  for expensive, repeating tasks

function myFunc(param){ 
    if (!myFunc.cache) { 
        myFunc.cache = {}; 
    } 
    if (!myFunc.cache[param]) { 
        var result = {}; // … 
        myFunc.cache[param] = result; 
    } 
    return myFunc.cache[param]; 
} 
Threads
•  Web Workers for modern browsers


var myWorker = new Worker('my_worker.js');   
myWorker.onmessage = function(event) {   
  alert(quot;Called back by the worker!quot;);   
};  

https://developer.mozilla.org/en/Using_DOM_workers
Threads
•  … or setTimeout() for the rest 

1.  Do a chunk of work 
2.  setTimeout(chunk, 1) and return/yield 
Life after onload
1.  Lazy-load ✔
2.  Preload ✔
3.  XHR ✔
4.  JavaScript optimizations ✔
YUI3




http://developer.yahoo.com/yui/3
                                
YUI3

•  Lighter
    less KB, modules, sub-modules

•  Faster
    opportunity to refactor

•  A la carte modules
YUI3 a la carte

•  Combo handler
                                                      
http://yui.yahooapis.com/combo?oop‐min.js&event‐min.js

•  Self-populating
YUI().use(“anim”, function(Y) { 
  var a = new Y.Anim({...}); 
  a.run(); 
}); 
Thank you!


Stoyan Stefanov
@stoyanstefanov
http://www.phpied.com
Credits/Further reading
•  http://looksgoodworkswell.blogspot.com/2008/06/velocity-conference-improving-netflix.html
•  http://developer.yahoo.com/yui/compressor/
•  http://www.julienlecomte.net/blog/2007/12/39/
•  http://webo.in/articles/habrahabr/46-cross-browser-data-url/
•  http://yuiblog.com/blog/2008/07/22/non-blocking-scripts
•  http://hitchhikers.wikia.com/wiki/Mostly_Harmless
•  http://developer.yahoo.com/performance/
•  http://oreilly.com/catalog/9780596522308/
•  http://oreilly.com/catalog/9780596529307/
•  http://www.nczonline.net/blog/tag/performance/

More Related Content

What's hot

Securing Rails
Securing RailsSecuring Rails
Securing RailsAlex Payne
 
Making Mobile Sites Faster
Making Mobile Sites FasterMaking Mobile Sites Faster
Making Mobile Sites FasterAndy Davies
 
2009 Java One State Of The Open Web
2009 Java One State Of The Open Web2009 Java One State Of The Open Web
2009 Java One State Of The Open WebPatrick Chanezon
 
The Need For Speed
The Need For SpeedThe Need For Speed
The Need For SpeedAndy Davies
 
WWW:::Mechanize YAPC::BR 2008
WWW:::Mechanize YAPC::BR 2008WWW:::Mechanize YAPC::BR 2008
WWW:::Mechanize YAPC::BR 2008mvitor
 
Webspam (English Version)
Webspam (English Version)Webspam (English Version)
Webspam (English Version)Dirk Haun
 
Webpack packing it all
Webpack packing it allWebpack packing it all
Webpack packing it allCriciúma Dev
 
Widget Summit 2008
Widget Summit 2008Widget Summit 2008
Widget Summit 2008Volkan Unsal
 
The web is too slow
The web is too slow The web is too slow
The web is too slow Andy Davies
 
Web Unleashed '19 - Measuring the Adoption of Web Performance Techniques
Web Unleashed '19 - Measuring the Adoption of Web Performance TechniquesWeb Unleashed '19 - Measuring the Adoption of Web Performance Techniques
Web Unleashed '19 - Measuring the Adoption of Web Performance TechniquesPaul Calvano
 
Web Security Horror Stories
Web Security Horror StoriesWeb Security Horror Stories
Web Security Horror StoriesSimon Willison
 
Our application got popular and now it breaks
Our application got popular and now it breaksOur application got popular and now it breaks
Our application got popular and now it breaksColdFusionConference
 
Spring aop mvc_by_sekhar_javabynatara_j
Spring aop mvc_by_sekhar_javabynatara_jSpring aop mvc_by_sekhar_javabynatara_j
Spring aop mvc_by_sekhar_javabynatara_jSatya Johnny
 
Taiwan Web Standards Talk 2011
Taiwan Web Standards Talk 2011Taiwan Web Standards Talk 2011
Taiwan Web Standards Talk 2011Zi Bin Cheah
 

What's hot (19)

Makezine
MakezineMakezine
Makezine
 
Code
CodeCode
Code
 
Securing Rails
Securing RailsSecuring Rails
Securing Rails
 
Ajax&Geoweb C
Ajax&Geoweb CAjax&Geoweb C
Ajax&Geoweb C
 
Making Mobile Sites Faster
Making Mobile Sites FasterMaking Mobile Sites Faster
Making Mobile Sites Faster
 
Mocking - Visug session
Mocking - Visug sessionMocking - Visug session
Mocking - Visug session
 
2009 Java One State Of The Open Web
2009 Java One State Of The Open Web2009 Java One State Of The Open Web
2009 Java One State Of The Open Web
 
The Need For Speed
The Need For SpeedThe Need For Speed
The Need For Speed
 
WWW:::Mechanize YAPC::BR 2008
WWW:::Mechanize YAPC::BR 2008WWW:::Mechanize YAPC::BR 2008
WWW:::Mechanize YAPC::BR 2008
 
Oscon 20080724
Oscon 20080724Oscon 20080724
Oscon 20080724
 
Webspam (English Version)
Webspam (English Version)Webspam (English Version)
Webspam (English Version)
 
Webpack packing it all
Webpack packing it allWebpack packing it all
Webpack packing it all
 
Widget Summit 2008
Widget Summit 2008Widget Summit 2008
Widget Summit 2008
 
The web is too slow
The web is too slow The web is too slow
The web is too slow
 
Web Unleashed '19 - Measuring the Adoption of Web Performance Techniques
Web Unleashed '19 - Measuring the Adoption of Web Performance TechniquesWeb Unleashed '19 - Measuring the Adoption of Web Performance Techniques
Web Unleashed '19 - Measuring the Adoption of Web Performance Techniques
 
Web Security Horror Stories
Web Security Horror StoriesWeb Security Horror Stories
Web Security Horror Stories
 
Our application got popular and now it breaks
Our application got popular and now it breaksOur application got popular and now it breaks
Our application got popular and now it breaks
 
Spring aop mvc_by_sekhar_javabynatara_j
Spring aop mvc_by_sekhar_javabynatara_jSpring aop mvc_by_sekhar_javabynatara_j
Spring aop mvc_by_sekhar_javabynatara_j
 
Taiwan Web Standards Talk 2011
Taiwan Web Standards Talk 2011Taiwan Web Standards Talk 2011
Taiwan Web Standards Talk 2011
 

Viewers also liked

5 Tips for Better JavaScript
5 Tips for Better JavaScript5 Tips for Better JavaScript
5 Tips for Better JavaScriptTodd Anglin
 
JavaScript - From Birth To Closure
JavaScript - From Birth To ClosureJavaScript - From Birth To Closure
JavaScript - From Birth To ClosureRobert Nyman
 
JavaScript and Web Standards Sitting in a Tree
JavaScript and Web Standards Sitting in a TreeJavaScript and Web Standards Sitting in a Tree
JavaScript and Web Standards Sitting in a TreeJenn Lukas
 
Let’s talk about JavaScript - WebElement
Let’s talk about JavaScript - WebElementLet’s talk about JavaScript - WebElement
Let’s talk about JavaScript - WebElementMarian Rusnak
 
Modern JavaScript Applications: Design Patterns
Modern JavaScript Applications: Design PatternsModern JavaScript Applications: Design Patterns
Modern JavaScript Applications: Design PatternsVolodymyr Voytyshyn
 
Fundamental JavaScript [UTC, March 2014]
Fundamental JavaScript [UTC, March 2014]Fundamental JavaScript [UTC, March 2014]
Fundamental JavaScript [UTC, March 2014]Aaron Gustafson
 
Virtual machine and javascript engine
Virtual machine and javascript engineVirtual machine and javascript engine
Virtual machine and javascript engineDuoyi Wu
 
The JavaScript Programming Language
The JavaScript Programming LanguageThe JavaScript Programming Language
The JavaScript Programming Languageguestceb98b
 

Viewers also liked (9)

5 Tips for Better JavaScript
5 Tips for Better JavaScript5 Tips for Better JavaScript
5 Tips for Better JavaScript
 
JavaScript - From Birth To Closure
JavaScript - From Birth To ClosureJavaScript - From Birth To Closure
JavaScript - From Birth To Closure
 
JavaScript and Web Standards Sitting in a Tree
JavaScript and Web Standards Sitting in a TreeJavaScript and Web Standards Sitting in a Tree
JavaScript and Web Standards Sitting in a Tree
 
Let’s talk about JavaScript - WebElement
Let’s talk about JavaScript - WebElementLet’s talk about JavaScript - WebElement
Let’s talk about JavaScript - WebElement
 
Modern JavaScript Applications: Design Patterns
Modern JavaScript Applications: Design PatternsModern JavaScript Applications: Design Patterns
Modern JavaScript Applications: Design Patterns
 
Fundamental JavaScript [UTC, March 2014]
Fundamental JavaScript [UTC, March 2014]Fundamental JavaScript [UTC, March 2014]
Fundamental JavaScript [UTC, March 2014]
 
Virtual machine and javascript engine
Virtual machine and javascript engineVirtual machine and javascript engine
Virtual machine and javascript engine
 
Javascript
JavascriptJavascript
Javascript
 
The JavaScript Programming Language
The JavaScript Programming LanguageThe JavaScript Programming Language
The JavaScript Programming Language
 

Similar to High Performance Kick Ass Web Apps (JavaScript edition)

Blueprint talk at Open Hackday London 2009
Blueprint talk at Open Hackday London 2009Blueprint talk at Open Hackday London 2009
Blueprint talk at Open Hackday London 2009Ricardo Varela
 
yusukebe in Yokohama.pm 090909
yusukebe in Yokohama.pm 090909yusukebe in Yokohama.pm 090909
yusukebe in Yokohama.pm 090909Yusuke Wada
 
Be Afraid. Be Very Afraid. Javascript security, XSS & CSRF
Be Afraid. Be Very Afraid. Javascript security, XSS & CSRFBe Afraid. Be Very Afraid. Javascript security, XSS & CSRF
Be Afraid. Be Very Afraid. Javascript security, XSS & CSRFMark Stanton
 
Gmr Highload Presentation Revised
Gmr Highload Presentation RevisedGmr Highload Presentation Revised
Gmr Highload Presentation RevisedOntico
 
Gmr Highload Presentation
Gmr Highload PresentationGmr Highload Presentation
Gmr Highload PresentationOntico
 
More Secrets of JavaScript Libraries
More Secrets of JavaScript LibrariesMore Secrets of JavaScript Libraries
More Secrets of JavaScript Librariesjeresig
 
Basics of Rich Internet Applications
Basics of Rich Internet ApplicationsBasics of Rich Internet Applications
Basics of Rich Internet ApplicationsSubramanyan Murali
 
jQuery Internals + Cool Stuff
jQuery Internals + Cool StuffjQuery Internals + Cool Stuff
jQuery Internals + Cool Stuffjeresig
 
Performance, Games, and Distributed Testing in JavaScript
Performance, Games, and Distributed Testing in JavaScriptPerformance, Games, and Distributed Testing in JavaScript
Performance, Games, and Distributed Testing in JavaScriptjeresig
 
Hacking Movable Type Training - Day 1
Hacking Movable Type Training - Day 1Hacking Movable Type Training - Day 1
Hacking Movable Type Training - Day 1Byrne Reese
 
Deliverance: Plone theming without the learning curve from Plone Symposium Ea...
Deliverance: Plone theming without the learning curve from Plone Symposium Ea...Deliverance: Plone theming without the learning curve from Plone Symposium Ea...
Deliverance: Plone theming without the learning curve from Plone Symposium Ea...Jazkarta, Inc.
 
Developing and testing ajax components
Developing and testing ajax componentsDeveloping and testing ajax components
Developing and testing ajax componentsIgnacio Coloma
 
Ajax On S2 Odp
Ajax On S2 OdpAjax On S2 Odp
Ajax On S2 Odpghessler
 
yet another rails
yet another railsyet another rails
yet another railsashok kumar
 
Scaling Rails Presentation
Scaling Rails PresentationScaling Rails Presentation
Scaling Rails Presentationeraz
 
Learning jQuery @ MIT
Learning jQuery @ MITLearning jQuery @ MIT
Learning jQuery @ MITjeresig
 

Similar to High Performance Kick Ass Web Apps (JavaScript edition) (20)

Blueprint talk at Open Hackday London 2009
Blueprint talk at Open Hackday London 2009Blueprint talk at Open Hackday London 2009
Blueprint talk at Open Hackday London 2009
 
yusukebe in Yokohama.pm 090909
yusukebe in Yokohama.pm 090909yusukebe in Yokohama.pm 090909
yusukebe in Yokohama.pm 090909
 
Be Afraid. Be Very Afraid. Javascript security, XSS & CSRF
Be Afraid. Be Very Afraid. Javascript security, XSS & CSRFBe Afraid. Be Very Afraid. Javascript security, XSS & CSRF
Be Afraid. Be Very Afraid. Javascript security, XSS & CSRF
 
Gmr Highload Presentation Revised
Gmr Highload Presentation RevisedGmr Highload Presentation Revised
Gmr Highload Presentation Revised
 
Gmr Highload Presentation
Gmr Highload PresentationGmr Highload Presentation
Gmr Highload Presentation
 
More Secrets of JavaScript Libraries
More Secrets of JavaScript LibrariesMore Secrets of JavaScript Libraries
More Secrets of JavaScript Libraries
 
Basics of Rich Internet Applications
Basics of Rich Internet ApplicationsBasics of Rich Internet Applications
Basics of Rich Internet Applications
 
WordPress APIs
WordPress APIsWordPress APIs
WordPress APIs
 
jQuery Internals + Cool Stuff
jQuery Internals + Cool StuffjQuery Internals + Cool Stuff
jQuery Internals + Cool Stuff
 
Performance, Games, and Distributed Testing in JavaScript
Performance, Games, and Distributed Testing in JavaScriptPerformance, Games, and Distributed Testing in JavaScript
Performance, Games, and Distributed Testing in JavaScript
 
Hacking Movable Type Training - Day 1
Hacking Movable Type Training - Day 1Hacking Movable Type Training - Day 1
Hacking Movable Type Training - Day 1
 
Deliverance: Plone theming without the learning curve from Plone Symposium Ea...
Deliverance: Plone theming without the learning curve from Plone Symposium Ea...Deliverance: Plone theming without the learning curve from Plone Symposium Ea...
Deliverance: Plone theming without the learning curve from Plone Symposium Ea...
 
Developing and testing ajax components
Developing and testing ajax componentsDeveloping and testing ajax components
Developing and testing ajax components
 
Capistrano2
Capistrano2Capistrano2
Capistrano2
 
Jslunch6
Jslunch6Jslunch6
Jslunch6
 
Ajax On S2 Odp
Ajax On S2 OdpAjax On S2 Odp
Ajax On S2 Odp
 
yet another rails
yet another railsyet another rails
yet another rails
 
Scaling Rails Presentation
Scaling Rails PresentationScaling Rails Presentation
Scaling Rails Presentation
 
Scaling Scribd
Scaling ScribdScaling Scribd
Scaling Scribd
 
Learning jQuery @ MIT
Learning jQuery @ MITLearning jQuery @ MIT
Learning jQuery @ MIT
 

More from Stoyan Stefanov

JavaScript Performance Patterns
JavaScript Performance PatternsJavaScript Performance Patterns
JavaScript Performance PatternsStoyan Stefanov
 
JavaScript performance patterns
JavaScript performance patternsJavaScript performance patterns
JavaScript performance patternsStoyan Stefanov
 
High Performance Social Plugins
High Performance Social PluginsHigh Performance Social Plugins
High Performance Social PluginsStoyan Stefanov
 
JavaScript навсякъде
JavaScript навсякъдеJavaScript навсякъде
JavaScript навсякъдеStoyan Stefanov
 
JavaScript is everywhere
JavaScript is everywhereJavaScript is everywhere
JavaScript is everywhereStoyan Stefanov
 
JavaScript shell scripting
JavaScript shell scriptingJavaScript shell scripting
JavaScript shell scriptingStoyan Stefanov
 
JavaScript for PHP developers
JavaScript for PHP developersJavaScript for PHP developers
JavaScript for PHP developersStoyan Stefanov
 
Progressive Downloads and Rendering - take #2
Progressive Downloads and Rendering - take #2Progressive Downloads and Rendering - take #2
Progressive Downloads and Rendering - take #2Stoyan Stefanov
 
Progressive Downloads and Rendering
Progressive Downloads and RenderingProgressive Downloads and Rendering
Progressive Downloads and RenderingStoyan Stefanov
 
Voices that matter: High Performance Web Sites
Voices that matter: High Performance Web SitesVoices that matter: High Performance Web Sites
Voices that matter: High Performance Web SitesStoyan Stefanov
 
Psychology of performance
Psychology of performancePsychology of performance
Psychology of performanceStoyan Stefanov
 
CSS and image optimization
CSS and image optimizationCSS and image optimization
CSS and image optimizationStoyan Stefanov
 
High-performance DOM scripting
High-performance DOM scriptingHigh-performance DOM scripting
High-performance DOM scriptingStoyan Stefanov
 

More from Stoyan Stefanov (20)

Reactive JavaScript
Reactive JavaScriptReactive JavaScript
Reactive JavaScript
 
YSlow hacking
YSlow hackingYSlow hacking
YSlow hacking
 
Liking performance
Liking performanceLiking performance
Liking performance
 
JavaScript Performance Patterns
JavaScript Performance PatternsJavaScript Performance Patterns
JavaScript Performance Patterns
 
JavaScript performance patterns
JavaScript performance patternsJavaScript performance patterns
JavaScript performance patterns
 
High Performance Social Plugins
High Performance Social PluginsHigh Performance Social Plugins
High Performance Social Plugins
 
Social Button BFFs
Social Button BFFsSocial Button BFFs
Social Button BFFs
 
JavaScript навсякъде
JavaScript навсякъдеJavaScript навсякъде
JavaScript навсякъде
 
JavaScript is everywhere
JavaScript is everywhereJavaScript is everywhere
JavaScript is everywhere
 
JavaScript shell scripting
JavaScript shell scriptingJavaScript shell scripting
JavaScript shell scripting
 
JavaScript for PHP developers
JavaScript for PHP developersJavaScript for PHP developers
JavaScript for PHP developers
 
WPO @ PubCon 2010
WPO @ PubCon 2010WPO @ PubCon 2010
WPO @ PubCon 2010
 
Progressive Downloads and Rendering - take #2
Progressive Downloads and Rendering - take #2Progressive Downloads and Rendering - take #2
Progressive Downloads and Rendering - take #2
 
Progressive Downloads and Rendering
Progressive Downloads and RenderingProgressive Downloads and Rendering
Progressive Downloads and Rendering
 
Performance patterns
Performance patternsPerformance patterns
Performance patterns
 
Voices that matter: High Performance Web Sites
Voices that matter: High Performance Web SitesVoices that matter: High Performance Web Sites
Voices that matter: High Performance Web Sites
 
Psychology of performance
Psychology of performancePsychology of performance
Psychology of performance
 
3-in-1 YSlow
3-in-1 YSlow3-in-1 YSlow
3-in-1 YSlow
 
CSS and image optimization
CSS and image optimizationCSS and image optimization
CSS and image optimization
 
High-performance DOM scripting
High-performance DOM scriptingHigh-performance DOM scripting
High-performance DOM scripting
 

Recently uploaded

OpenShift Commons Paris - Choose Your Own Observability Adventure
OpenShift Commons Paris - Choose Your Own Observability AdventureOpenShift Commons Paris - Choose Your Own Observability Adventure
OpenShift Commons Paris - Choose Your Own Observability AdventureEric D. Schabell
 
AI You Can Trust - Ensuring Success with Data Integrity Webinar
AI You Can Trust - Ensuring Success with Data Integrity WebinarAI You Can Trust - Ensuring Success with Data Integrity Webinar
AI You Can Trust - Ensuring Success with Data Integrity WebinarPrecisely
 
COMPUTER 10 Lesson 8 - Building a Website
COMPUTER 10 Lesson 8 - Building a WebsiteCOMPUTER 10 Lesson 8 - Building a Website
COMPUTER 10 Lesson 8 - Building a Websitedgelyza
 
UiPath Platform: The Backend Engine Powering Your Automation - Session 1
UiPath Platform: The Backend Engine Powering Your Automation - Session 1UiPath Platform: The Backend Engine Powering Your Automation - Session 1
UiPath Platform: The Backend Engine Powering Your Automation - Session 1DianaGray10
 
Basic Building Blocks of Internet of Things.
Basic Building Blocks of Internet of Things.Basic Building Blocks of Internet of Things.
Basic Building Blocks of Internet of Things.YounusS2
 
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDEADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDELiveplex
 
Introduction to Matsuo Laboratory (ENG).pptx
Introduction to Matsuo Laboratory (ENG).pptxIntroduction to Matsuo Laboratory (ENG).pptx
Introduction to Matsuo Laboratory (ENG).pptxMatsuo Lab
 
Videogame localization & technology_ how to enhance the power of translation.pdf
Videogame localization & technology_ how to enhance the power of translation.pdfVideogame localization & technology_ how to enhance the power of translation.pdf
Videogame localization & technology_ how to enhance the power of translation.pdfinfogdgmi
 
UiPath Studio Web workshop series - Day 8
UiPath Studio Web workshop series - Day 8UiPath Studio Web workshop series - Day 8
UiPath Studio Web workshop series - Day 8DianaGray10
 
activity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdf
activity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdf
activity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdfJamie (Taka) Wang
 
Connector Corner: Extending LLM automation use cases with UiPath GenAI connec...
Connector Corner: Extending LLM automation use cases with UiPath GenAI connec...Connector Corner: Extending LLM automation use cases with UiPath GenAI connec...
Connector Corner: Extending LLM automation use cases with UiPath GenAI connec...DianaGray10
 
Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™Adtran
 
Nanopower In Semiconductor Industry.pdf
Nanopower  In Semiconductor Industry.pdfNanopower  In Semiconductor Industry.pdf
Nanopower In Semiconductor Industry.pdfPedro Manuel
 
Apres-Cyber - The Data Dilemma: Bridging Offensive Operations and Machine Lea...
Apres-Cyber - The Data Dilemma: Bridging Offensive Operations and Machine Lea...Apres-Cyber - The Data Dilemma: Bridging Offensive Operations and Machine Lea...
Apres-Cyber - The Data Dilemma: Bridging Offensive Operations and Machine Lea...Will Schroeder
 
Designing A Time bound resource download URL
Designing A Time bound resource download URLDesigning A Time bound resource download URL
Designing A Time bound resource download URLRuncy Oommen
 
UiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation DevelopersUiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation DevelopersUiPathCommunity
 
Machine Learning Model Validation (Aijun Zhang 2024).pdf
Machine Learning Model Validation (Aijun Zhang 2024).pdfMachine Learning Model Validation (Aijun Zhang 2024).pdf
Machine Learning Model Validation (Aijun Zhang 2024).pdfAijun Zhang
 
Using IESVE for Loads, Sizing and Heat Pump Modeling to Achieve Decarbonization
Using IESVE for Loads, Sizing and Heat Pump Modeling to Achieve DecarbonizationUsing IESVE for Loads, Sizing and Heat Pump Modeling to Achieve Decarbonization
Using IESVE for Loads, Sizing and Heat Pump Modeling to Achieve DecarbonizationIES VE
 
Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024SkyPlanner
 

Recently uploaded (20)

OpenShift Commons Paris - Choose Your Own Observability Adventure
OpenShift Commons Paris - Choose Your Own Observability AdventureOpenShift Commons Paris - Choose Your Own Observability Adventure
OpenShift Commons Paris - Choose Your Own Observability Adventure
 
AI You Can Trust - Ensuring Success with Data Integrity Webinar
AI You Can Trust - Ensuring Success with Data Integrity WebinarAI You Can Trust - Ensuring Success with Data Integrity Webinar
AI You Can Trust - Ensuring Success with Data Integrity Webinar
 
COMPUTER 10 Lesson 8 - Building a Website
COMPUTER 10 Lesson 8 - Building a WebsiteCOMPUTER 10 Lesson 8 - Building a Website
COMPUTER 10 Lesson 8 - Building a Website
 
UiPath Platform: The Backend Engine Powering Your Automation - Session 1
UiPath Platform: The Backend Engine Powering Your Automation - Session 1UiPath Platform: The Backend Engine Powering Your Automation - Session 1
UiPath Platform: The Backend Engine Powering Your Automation - Session 1
 
Basic Building Blocks of Internet of Things.
Basic Building Blocks of Internet of Things.Basic Building Blocks of Internet of Things.
Basic Building Blocks of Internet of Things.
 
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDEADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
 
Introduction to Matsuo Laboratory (ENG).pptx
Introduction to Matsuo Laboratory (ENG).pptxIntroduction to Matsuo Laboratory (ENG).pptx
Introduction to Matsuo Laboratory (ENG).pptx
 
Videogame localization & technology_ how to enhance the power of translation.pdf
Videogame localization & technology_ how to enhance the power of translation.pdfVideogame localization & technology_ how to enhance the power of translation.pdf
Videogame localization & technology_ how to enhance the power of translation.pdf
 
UiPath Studio Web workshop series - Day 8
UiPath Studio Web workshop series - Day 8UiPath Studio Web workshop series - Day 8
UiPath Studio Web workshop series - Day 8
 
activity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdf
activity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdf
activity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdf
 
Connector Corner: Extending LLM automation use cases with UiPath GenAI connec...
Connector Corner: Extending LLM automation use cases with UiPath GenAI connec...Connector Corner: Extending LLM automation use cases with UiPath GenAI connec...
Connector Corner: Extending LLM automation use cases with UiPath GenAI connec...
 
Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™
 
Nanopower In Semiconductor Industry.pdf
Nanopower  In Semiconductor Industry.pdfNanopower  In Semiconductor Industry.pdf
Nanopower In Semiconductor Industry.pdf
 
Apres-Cyber - The Data Dilemma: Bridging Offensive Operations and Machine Lea...
Apres-Cyber - The Data Dilemma: Bridging Offensive Operations and Machine Lea...Apres-Cyber - The Data Dilemma: Bridging Offensive Operations and Machine Lea...
Apres-Cyber - The Data Dilemma: Bridging Offensive Operations and Machine Lea...
 
Designing A Time bound resource download URL
Designing A Time bound resource download URLDesigning A Time bound resource download URL
Designing A Time bound resource download URL
 
UiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation DevelopersUiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation Developers
 
Machine Learning Model Validation (Aijun Zhang 2024).pdf
Machine Learning Model Validation (Aijun Zhang 2024).pdfMachine Learning Model Validation (Aijun Zhang 2024).pdf
Machine Learning Model Validation (Aijun Zhang 2024).pdf
 
Using IESVE for Loads, Sizing and Heat Pump Modeling to Achieve Decarbonization
Using IESVE for Loads, Sizing and Heat Pump Modeling to Achieve DecarbonizationUsing IESVE for Loads, Sizing and Heat Pump Modeling to Achieve Decarbonization
Using IESVE for Loads, Sizing and Heat Pump Modeling to Achieve Decarbonization
 
Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024
 
20230104 - machine vision
20230104 - machine vision20230104 - machine vision
20230104 - machine vision
 

High Performance Kick Ass Web Apps (JavaScript edition)