loading javascript: even a caveman can do it

50
JSConf.eu 8 November 2009 Loading JavaScript Even a Caveman Can Do It Kyle Simpson [email protected] m http://getify.c om @getify #jsconf #loadjs

Upload: kyle-simpson

Post on 11-May-2015

3.212 views

Category:

Technology


3 download

DESCRIPTION

No matter how awesome your JavaScript code is, we all face the same problem: how to squeeze it down the wire and get it loaded and running in the browser as quickly and efficiently as possible. There are about as many ways to approach this problem as there are developers trying to solve it, which makes the landscape of JavaScript Loading solutions confusing and painful to navigate. But it doesn't have to be so ugly. We're gonna break it down so you can come away feeling more confident in how best to load your JavaScript. Several common strategies will be covered, including: - Build-time versus on-the-fly techniques - Code organization/compression (minification, gzip, etc) - File concatenation - Inline scripts - Dynamic parallel loading of JavaScript resources (LABjs, etc) - Cache optimization (initialization profiling, on-demand loading, pre-fetching, etc)

TRANSCRIPT

Page 1: Loading JavaScript: Even a caveman can do it

JSConf.eu8 November 2009

Loading JavaScriptEven a Caveman Can Do It

Kyle [email protected]

http://getify.com@getify

#jsconf #loadjs

Page 2: Loading JavaScript: Even a caveman can do it
Page 3: Loading JavaScript: Even a caveman can do it

Your.Site.

Probably.

Sucks.

At Loading JavaScript.

Page 4: Loading JavaScript: Even a caveman can do it

Sucks.

Page 5: Loading JavaScript: Even a caveman can do it

Sucks.

Page 6: Loading JavaScript: Even a caveman can do it

Sucks.

Page 7: Loading JavaScript: Even a caveman can do it

How To SuckAt Loading JavaScript

1. Load too many files

2. Load too few files

3. Load all files before DOM-ready

4. Use the <script> tag

5. Load all files serially

Page 8: Loading JavaScript: Even a caveman can do it

Relax! I’m not gonna keep telling you how much you suck.

And you don’t suck, JavaScript loading sucks.

Page 9: Loading JavaScript: Even a caveman can do it

How To NOT SuckAt Loading JavaScript

1. Use a build-process for local scripts

2. Use g-zip and minifiers

3. Profile, load when needed

4. Load parallel, execute serially

5. Load now, execute later

Page 10: Loading JavaScript: Even a caveman can do it

Build-processscript handling

Page 11: Loading JavaScript: Even a caveman can do it

dojo.require

Page 12: Loading JavaScript: Even a caveman can do it

Combiner(Nicholas Zakas)

Page 13: Loading JavaScript: Even a caveman can do it

Yo, which shirt should I wear?

Page 14: Loading JavaScript: Even a caveman can do it

G-zipminify/obfuscate

Page 15: Loading JavaScript: Even a caveman can do it

Mincir

“Mincer”

(to slim down)

(alpha! Seriously!)

Page 16: Loading JavaScript: Even a caveman can do it

Identifier FrequencyDetection

“Constants”

G-zip Optimization

Page 17: Loading JavaScript: Even a caveman can do it

280 characters

272 characters

Page 18: Loading JavaScript: Even a caveman can do it

93 bytes gzip’d

84 bytes gzip’d

Page 19: Loading JavaScript: Even a caveman can do it

169 characters

163 characters

Page 20: Loading JavaScript: Even a caveman can do it

Load-time profiling

Page 21: Loading JavaScript: Even a caveman can do it

Doloto

(Microsoft)

Page 22: Loading JavaScript: Even a caveman can do it

“The key is to figure out what needs to load before the DOM is ready, and what can wait.”

-- Microsoft Caveman

Page 23: Loading JavaScript: Even a caveman can do it

Load scripts fasterExecute in correct order

Page 24: Loading JavaScript: Even a caveman can do it

<script> tags behave differently cross-browser with respect to loading

and execution, either in parallel or serial.

Hint: They Suck

Page 25: Loading JavaScript: Even a caveman can do it

FF3 with <script> & <img> tags

FF3.5 with <script> & <img> tags

Page 26: Loading JavaScript: Even a caveman can do it

It gets crazy when you look at ie6, ie7, ie8, opera, chrome, safari…&

mobile

Hint: This Sucks

And it gets even crazier when you load other page elements like css

near your <script> tags

Page 27: Loading JavaScript: Even a caveman can do it

LABjs

Loading And Blocking JavaScript

Page 28: Loading JavaScript: Even a caveman can do it

Put simply, LABjs is intended to be a simple way to replace <script> tags

with a mechanism that gives you more control over loading and

execution behavior.

Page 29: Loading JavaScript: Even a caveman can do it

LABjs is a script loader that lets you load *any script, into any page, at

any time. It uses an expressive API that helps you replace your script

tags easily.

*exceptions explained in a moment.

Page 30: Loading JavaScript: Even a caveman can do it

When NOT to use LABjs

1. If your script uses document.write

2. If your script ITSELF does unsafe DOM-ready detection – does not apply to scripts that use the results of such detection.

Page 31: Loading JavaScript: Even a caveman can do it

When TO use LABjs

1. Everywhere else(actually, wherever you load scripts over-the-wire, and you care about performance, and don’t have a suitable loader already)

Page 32: Loading JavaScript: Even a caveman can do it

FF3 with <script> & <img> tags

FF3.5 with <script> & <img> tags

LABjs in every browser

Page 33: Loading JavaScript: Even a caveman can do it

16.84 secondsvs.

6.24 seconds

2.7x speed increase in overall page load

Enough said, right?

Page 34: Loading JavaScript: Even a caveman can do it

The LABjs API is a chaining API (similar to jQuery), which you can use to express one or

more groups of scripts to load, where (by default) all scripts will load in parallel, but

groups will execute in serial. You can specify as many independent chains as necessary.

So, you can both load scripts that have no dependencies on each other (and thus can run

in parallel), and those scripts that do have execution order dependency, while still loading

everything as quickly as possible.

Page 35: Loading JavaScript: Even a caveman can do it
Page 36: Loading JavaScript: Even a caveman can do it
Page 37: Loading JavaScript: Even a caveman can do it
Page 38: Loading JavaScript: Even a caveman can do it
Page 39: Loading JavaScript: Even a caveman can do it

UsePreloading [true/false] UseCachePreload [true/false] UseLocalXHR [true/false] AlwaysPreserveOrder [true/false] AppendTo [‘head’/’body’] AllowDuplicates [true/false] BasePath [string]

Page 40: Loading JavaScript: Even a caveman can do it

BRIEFLY, how does LABjs do this?

Page 41: Loading JavaScript: Even a caveman can do it

Only the part of the decision matrix that works on-demand at any point in the page lifetime, for same- and cross-domain scripts, loading in parallel, ensuring execution order dependencies, allowing coupling.

Page 42: Loading JavaScript: Even a caveman can do it

LABjs’ current default behavior

Page 43: Loading JavaScript: Even a caveman can do it

Preload “not-code”,execute code (later)

Page 44: Loading JavaScript: Even a caveman can do it
Page 45: Loading JavaScript: Even a caveman can do it

Can be inside a .js file

Can be inside a <script> tag

Page 46: Loading JavaScript: Even a caveman can do it
Page 47: Loading JavaScript: Even a caveman can do it
Page 48: Loading JavaScript: Even a caveman can do it

True for desktop browsers

Also true for mobile

Page 49: Loading JavaScript: Even a caveman can do it

That wasn’t so hard was it?

Page 50: Loading JavaScript: Even a caveman can do it

Kyle [email protected]

http://getify.com@getify

#jsconf #loadjs

More Info

http://labjs.com

http://msdn.microsoft.com/en-us/devlabs/ee423534.aspx

http://www.nczonline.net/blog/2009/09/22/introducing-combiner-a-javascriptcss-concatenation-tool/

http://googlecode.blogspot.com/2009/09/gmail-for-mobile-html5-series-reducing.html

SpeakerRate (slides, code samples posted):http://speakerrate.com/talks/1754-loading-javascript-even-a-caveman-can-do-it