The Once And Future Script Loader (v2)

65
The Once and Future Script Loader Kyle Simpson @getify http://getif y.me

description

A look at the history, current state, and hopeful future state of script loading in browsers.

Transcript of The Once And Future Script Loader (v2)

Page 1: The Once And Future Script Loader (v2)

The Once and Future Script Loader

Kyle Simpson@getify

http://getify.me

Page 2: The Once And Future Script Loader (v2)

where…we were

once upon a time, in a browser far, far away…

Page 3: The Once And Future Script Loader (v2)

<script src="…"></script>

where…we were

Page 4: The Once And Future Script Loader (v2)

<script src="…"></script><script src="…"></script><script src="…"></script><script src="…"></script><script src="…"></script><script src="…"></script>

where…we were

Page 5: The Once And Future Script Loader (v2)

Why not just combine all your files?

• different pages, different scripts

• cacheability

• parallel loading

• on-demand/lazy-loading

where…we were

Page 6: The Once And Future Script Loader (v2)

<script> tags block. bad. evil.

where…we were

Page 7: The Once And Future Script Loader (v2)

What do <script> tags block, and why?

• other <script> tags

• other content (loading & rendering)

• DOM-ready

where…we were

Page 8: The Once And Future Script Loader (v2)

IE7-, FF3-, Opera

where…we were

Page 9: The Once And Future Script Loader (v2)

IE8, FF3.5/3.6, Chr 14-

where…we were

Page 10: The Once And Future Script Loader (v2)

IE9+, FF4+

Script Loaders

where…we were

Page 11: The Once And Future Script Loader (v2)

document.write()

where…we were

Page 12: The Once And Future Script Loader (v2)

document.write()MustDie!

where…we were

Page 13: The Once And Future Script Loader (v2)

<script> tags also suck because...

• browser-specific scripts

• conditional loading/URLs

• event handling

where…we were

Page 14: The Once And Future Script Loader (v2)

The very first script loader?

document.write("<script src='...'></sc"+"ript>");

where…we were

Page 15: The Once And Future Script Loader (v2)

who-tf?

...and still many ad providers, 3rd party widgets, etc.

where…we were

Page 16: The Once And Future Script Loader (v2)

Surely we can do better!?

where…we were

Page 17: The Once And Future Script Loader (v2)

XHR?

where…we were

Page 18: The Once And Future Script Loader (v2)

Framework-specific loaders...

...just stink

where…we were

Page 19: The Once And Future Script Loader (v2)

Making progress... but not there yet

where…we were

Page 20: The Once And Future Script Loader (v2)

What's hard about script loading?

where…we were

Page 21: The Once And Future Script Loader (v2)

A general script loader should:

• load any script, at any time, from anywhere... except document.write()

• have performance at or better than <script> in modern browsers

• equivalent behavior in all browsers

where…we were

Page 22: The Once And Future Script Loader (v2)

A general script loader should also:

• avoid: hacks, UA sniffing

• feature-detect

• have as few exception-cases as possible

where…we were

Page 23: The Once And Future Script Loader (v2)

General script loader feature creep:

• trying to handle document.write()

• loading CSS

• "dependency management"

• delaying DOM-ready

where…we were

Page 24: The Once And Future Script Loader (v2)

• load many scripts in parallel (race to finish loading ASAP)

• ensure execution order (not ASAP)

Script loading requires:

where…we were

Page 25: The Once And Future Script Loader (v2)

<script> tags (even dynamically created) give you no control over

loading or execution

where…we were

Page 26: The Once And Future Script Loader (v2)

The spec says that dynamic scripts should load and run ASAP

(not ordered)

umm...

where…we were

Page 27: The Once And Future Script Loader (v2)

All current browser versions except Opera (but soon!) follow the spec

uh oh

where…we were

Page 28: The Once And Future Script Loader (v2)

Some older browsers execute in order, some don't

doh!

Some older browsers load in parallel, some don't

where…we were

Page 29: The Once And Future Script Loader (v2)

Not for the faint of heart

where…we were

Page 30: The Once And Future Script Loader (v2)

A young leader?

LABjs

where…we were

Page 31: The Once And Future Script Loader (v2)

LABjs: performance script loader

where…we were

Page 32: The Once And Future Script Loader (v2)

where…we wereLABjs: performance

script loader

Page 33: The Once And Future Script Loader (v2)

What was wrong with LABjs?

• ugly source code

• lots of hacks

• exception cases

• brittle (not future proof)

where…we were

Page 34: The Once And Future Script Loader (v2)

Anyone can write a loader!

where…we are now

(and many devs have)

Page 35: The Once And Future Script Loader (v2)

where…we are now

https://spreadsheets0.google.com/spreadsheet/ccc?key=tDdcrv9wNQRCNCRCflWxhYQ

Page 36: The Once And Future Script Loader (v2)

Loaders are competing more on APIs than on

features or performance

where…we are now

Page 37: The Once And Future Script Loader (v2)

They're also copying each other (good and bad)

where…we are now

Page 38: The Once And Future Script Loader (v2)

But, can their functionality be

trusted?

where…we are now

Page 39: The Once And Future Script Loader (v2)

Testing is much harder than most realize

where…we are now

Page 40: The Once And Future Script Loader (v2)

"Browser support" is vague

where…we are now

Page 41: The Once And Future Script Loader (v2)

Exception cases often ignored or overlooked

where…we are now

Page 42: The Once And Future Script Loader (v2)

Browser Sniffs, Hacks

where…we are now

Page 43: The Once And Future Script Loader (v2)

What should a loader do?

where…we are now

Page 44: The Once And Future Script Loader (v2)

Real Preloading

http://wiki.whatwg.org/wiki/Script_Execution_Control

where…we are now

Page 45: The Once And Future Script Loader (v2)

IE4+ ftw?

where…we are now

Page 46: The Once And Future Script Loader (v2)

async=false

http://wiki.whatwg.org/wiki/Dynamic_Script_Execution_Order

Ordered Async

FF4+, Chr 12+, IE10p2+, Webkit/Safari, Opera (soon!)

where…we are now

Page 47: The Once And Future Script Loader (v2)

1. try real preloading

2. try ordered async

3. try same-domain XHR

4. fall back on "cache preloading"

How?

where…we are now

Page 48: The Once And Future Script Loader (v2)

LABjs 2.0

• readable source code

• "future proof " feature detects

• fewer exception cases

• better performance

http://labjs.com/releasenotes.php

where…we are now

Page 49: The Once And Future Script Loader (v2)

What happens next?

where…we're going next

Page 50: The Once And Future Script Loader (v2)

Competition is good, only if community is educated

where…we're going next

Page 51: The Once And Future Script Loader (v2)

http://PickALoader.com

where…we're going next

(coming soon)

Page 52: The Once And Future Script Loader (v2)

Browsers do not yet give us what we really need

where…we're going next

Page 53: The Once And Future Script Loader (v2)

Co-opetition is much healthier for the

community

where…we're going next

Page 54: The Once And Future Script Loader (v2)

Only script loaders which help build the future

will survive

where…we're going next

Page 55: The Once And Future Script Loader (v2)

W3C, WHATWG

http://wiki.whatwg.org/wiki/Category:Proposals

where…we're going next

Page 56: The Once And Future Script Loader (v2)

We'll accomplish more if we work together

where…we're going next

Page 57: The Once And Future Script Loader (v2)

Future, The Script Loader

where…we're going next

Page 58: The Once And Future Script Loader (v2)

Preloading

(deferred execution)

where…we're going next

Page 59: The Once And Future Script Loader (v2)

Modules

(CommonJS, AMD, etc)

where…we're going next

Page 60: The Once And Future Script Loader (v2)

Native Modules

(ES-Harmony?)

where…we're going next

Page 61: The Once And Future Script Loader (v2)
Page 62: The Once And Future Script Loader (v2)

"Script Loader of my dreams"

where…we're going next

Page 63: The Once And Future Script Loader (v2)

• timeouts

• load abort

• error handling

• load priority

What else?

where…we're going next

Page 64: The Once And Future Script Loader (v2)

And now for something completely different...

Questions?

Page 65: The Once And Future Script Loader (v2)

http://pickaloader.com

Kyle Simpson@getify

http://getify.me

http://labjs.com

http://wiki.whatwg.org/wiki/Category:Proposals