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 Scribd
Scaling ScribdScaling Scribd
Scaling Scribd
 
Scaling Rails Presentation
Scaling Rails PresentationScaling Rails Presentation
Scaling Rails Presentation
 
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

Connecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfConnecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfNeo4j
 
A Framework for Development in the AI Age
A Framework for Development in the AI AgeA Framework for Development in the AI Age
A Framework for Development in the AI AgeCprime
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxLoriGlavin3
 
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Alkin Tezuysal
 
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfSo einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfpanagenda
 
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better StrongerModern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better Strongerpanagenda
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesThousandEyes
 
Scale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterScale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterMydbops
 
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Mark Goldstein
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfLoriGlavin3
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxLoriGlavin3
 
Testing tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesTesting tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesKari Kakkonen
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.Curtis Poe
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxLoriGlavin3
 
UiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPathCommunity
 
Emixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native developmentEmixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native developmentPim van der Noll
 
Data governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationData governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationKnoldus Inc.
 
Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Farhan Tariq
 
Generative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfGenerative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfIngrid Airi González
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .Alan Dix
 

Recently uploaded (20)

Connecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfConnecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdf
 
A Framework for Development in the AI Age
A Framework for Development in the AI AgeA Framework for Development in the AI Age
A Framework for Development in the AI Age
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
 
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
 
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfSo einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
 
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better StrongerModern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
 
Scale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterScale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL Router
 
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdf
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
 
Testing tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesTesting tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examples
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
 
UiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to Hero
 
Emixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native developmentEmixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native development
 
Data governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationData governance with Unity Catalog Presentation
Data governance with Unity Catalog Presentation
 
Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...
 
Generative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfGenerative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdf
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .
 

High Performance Kick Ass Web Apps (JavaScript edition)