100
Inclure du javascript de manière performante Jean-pierre VINCENT Braincracking.org

Inclure du Javascript de manière performante

Embed Size (px)

DESCRIPTION

slide de la mini conférence Performance du 21 juillet 2010 au menu : les 3 stratégies valables pour inclure son JS de manière non bloquante

Citation preview

Page 1: Inclure du Javascript de manière performante

Inclure du javascript de manière performante

Jean-pierre VINCENTBraincracking.org

Page 2: Inclure du Javascript de manière performante

Orateur

Jean-pierre VINCENT

En ligne :•braincracking.org (veille)•twitter.com/theystolemynick•[email protected]•google it : jpvincent

10 ans de Web dont :•3 ans de Yahoo!

•2 ans d'application Web (timeofmylife.com)

Page 3: Inclure du Javascript de manière performante

Pourquoi ?

rendu rapide = argent

bit.ly/perfs_beneficebit.ly/perfs_benefice2

Page 4: Inclure du Javascript de manière performante

Comment

Inclure JS de manière non bloquante

(entre autres)

Page 5: Inclure du Javascript de manière performante

Le fautif<script

src="my.js"></script>

</head>

Page 6: Inclure du Javascript de manière performante

Le fautif<script

src="my.js"></script>

</head>

•bloque ce qui vient après :•rendu

Page 7: Inclure du Javascript de manière performante

Le fautif<script

src="my.js"></script>

</head>

•bloque ce qui vient après :•rendu•exécution

Page 8: Inclure du Javascript de manière performante

Le fautif<script

src="my.js"></script>

</head>

•bloque ce qui vient après :•rendu•exécution•téléchargement

Page 9: Inclure du Javascript de manière performante

Le fautif<script

src="my.js"></script>

</head>

•bloque ce qui vient après :•rendu•exécution•téléchargement

•IE6-7 : un seul JS à la fois

Page 10: Inclure du Javascript de manière performante

exemple

réservation voyages-sncf.com :•HTML obtenu en 200ms (!)

Page 11: Inclure du Javascript de manière performante

exemple

réservation voyages-sncf.com :•HTML obtenu en 200ms (!)•certains CSS arrivent en 50ms (!!)

(je voudrais bien jouer avec ce ping là)

Page 12: Inclure du Javascript de manière performante

exemple

réservation voyages-sncf.com :•HTML obtenu en 200ms (!)•certains CSS arrivent en 50ms (!!)

(je voudrais bien jouer avec ce ping là)

•au final : 2s de page blanche#fail

bit.ly/perfs_sncf

Page 13: Inclure du Javascript de manière performante

Objectif

remplacer<script

src="my.js"></script>

</head>

Page 14: Inclure du Javascript de manière performante

Alternatives

•Inline

Page 15: Inclure du Javascript de manière performante

Alternatives

•Inline

•Bottom

Page 16: Inclure du Javascript de manière performante

Alternatives

•Inline

•Bottom

•DOM

Page 17: Inclure du Javascript de manière performante

Alternatives

que des désavantages

Page 18: Inclure du Javascript de manière performante

Alternatives

que des désavantagesmais

Page 19: Inclure du Javascript de manière performante

Alternatives

que des désavantagesmais

non bloquant(= argent)

Page 20: Inclure du Javascript de manière performante

Inline

Page 21: Inclure du Javascript de manière performante

Inline

<script>

<?php include('my.js'); ?>

</script>

</head>

Page 22: Inclure du Javascript de manière performante

Inline

✓ ordre d'exécution

Page 23: Inclure du Javascript de manière performante

Inline

✓ ordre d'exécution✓ dépendances inline

Page 24: Inclure du Javascript de manière performante

Inline

✓ ordre d'exécution✓ dépendances inline✓ non bloquant (ou presque : bit.ly/inline_bloquant)

Page 25: Inclure du Javascript de manière performante

Inline

✓ ordre d'exécution✓ dépendances inline✓ non bloquant (ou presque : bit.ly/inline_bloquant)✓ document.write()

Page 26: Inclure du Javascript de manière performante

Inline

✓ ordre d'exécution✓ dépendances inline✓ non bloquant (ou presque : bit.ly/inline_bloquant)✓ document.write()✓ pas de HTTP

Page 27: Inclure du Javascript de manière performante

Inline

✓ ordre d'exécution✓ dépendances inline✓ non bloquant (ou presque : bit.ly/inline_bloquant)✓ document.write()✓ pas de HTTP

✗ pas de cache

Page 28: Inclure du Javascript de manière performante

Inline

Bon pour :

•beaucoup de nouveaux visiteurs

Page 29: Inclure du Javascript de manière performante

Inline

Bon pour :

•beaucoup de nouveaux visiteurs

•peu de JS

Page 30: Inclure du Javascript de manière performante

Inline

Bon pour :

•beaucoup de nouveaux visiteurs

•peu de JS

•bonne bande passante (France)

Page 31: Inclure du Javascript de manière performante

Inline

•évènementielle (jeux-concours)

Page 32: Inclure du Javascript de manière performante

Inline

•évènementielle (jeux-concours)

•Homepage, sans cookie•Google Search, Yahoo! (avant)•Netvibes, Facebook

Page 33: Inclure du Javascript de manière performante

Inline

•évènementielle (jeux-concours)

•Homepage, sans cookie•Google Search, Yahoo! (avant)•Netvibes, Facebook

•pages d'entrées•login•signup

Page 34: Inclure du Javascript de manière performante

Bottom

<script

src="my.js"></script>

</body>

Page 35: Inclure du Javascript de manière performante

Bottom

Page 36: Inclure du Javascript de manière performante

Bottom

✓ ordre d'exécution

Page 37: Inclure du Javascript de manière performante

Bottom

✓ ordre d'exécution✓ non bloquant

Page 38: Inclure du Javascript de manière performante

Bottom

✓ ordre d'exécution✓ non bloquant✓ mise en cache

Page 39: Inclure du Javascript de manière performante

Bottom

✓ ordre d'exécution✓ non bloquant✓ mise en cache

✗ dépendances inline

Page 40: Inclure du Javascript de manière performante

Bottom

✓ ordre d'exécution✓ non bloquant✓ mise en cache

✗ dépendances inline✗ document.write()

Page 41: Inclure du Javascript de manière performante

Bottom

Bon pour les pages dont :

Page 42: Inclure du Javascript de manière performante

Bottom

Bon pour les pages dont :

•le contenu textuel est primordial

Page 43: Inclure du Javascript de manière performante

Bottom

Bon pour les pages dont :

•le contenu textuel est primordial•le HTML est rapide

Page 44: Inclure du Javascript de manière performante

Bottom

Bon pour les pages dont :

•le contenu textuel est primordial•le HTML est rapide•reçoit des visiteurs zappeurs

Page 45: Inclure du Javascript de manière performante

Bottom

Bon pour les pages dont :

•le contenu textuel est primordial•le HTML est rapide•reçoit des visiteurs zappeurs•JS est secondaire mais lourd

•publicités•widgets

Page 46: Inclure du Javascript de manière performante

Bottom

Type de pages :

•Blogs, Journaux

Page 47: Inclure du Javascript de manière performante

Bottom

Type de pages :

•Blogs, Journaux•Boutiques

Page 48: Inclure du Javascript de manière performante

Bottom

Type de pages :

•Blogs, Journaux•Boutiques•Comparateurs

Page 49: Inclure du Javascript de manière performante

Bottom

Type de pages :

•Blogs, Journaux•Boutiques•Comparateurs•...

Page 50: Inclure du Javascript de manière performante

Bottom - condition 1

contenu principal envoyé en moins de 500ms ?

Page 51: Inclure du Javascript de manière performante

Bottom - condition 1

contenu principal envoyé en moins de 500ms ?

•flush()

Page 52: Inclure du Javascript de manière performante

Bottom - condition 1

contenu principal envoyé en moins de 500ms ?

•flush()•cache serveur

Page 53: Inclure du Javascript de manière performante

Bottom - condition 1

contenu principal envoyé en moins de 500ms ?

•flush()•cache serveur•en premier dans la source

Page 54: Inclure du Javascript de manière performante

Bottom - condition 2

dépendances JS inlinecorrectibles ?

Page 55: Inclure du Javascript de manière performante

Bottom - condition 2

dépendances JS inlinecorrectibles ?

•mute + eval() : bit.ly/mute_eval

Page 56: Inclure du Javascript de manière performante

Bottom - condition 2

dépendances JS inlinecorrectibles ?

•mute + eval() : bit.ly/mute_eval

•hijacking

Page 57: Inclure du Javascript de manière performante

Bottom - condition 2

dépendances JS inlinecorrectibles ?

•mute + eval() : bit.ly/mute_eval

•hijacking

Si non, modification du JS obligatoire

Page 58: Inclure du Javascript de manière performante

DOM

Page 59: Inclure du Javascript de manière performante

DOMfunction loader(fCallback) {

}

Page 60: Inclure du Javascript de manière performante

DOMfunction loader(fCallback) {

var oScript =

document

.getElementsByTagName("head")[0]

.createElement('script');

}

Page 61: Inclure du Javascript de manière performante

DOMfunction loader(fCallback) {

var oScript =

document

.getElementsByTagName("head")[0]

.createElement('script');

oScript.src= 'my.js';

}

Page 62: Inclure du Javascript de manière performante

DOMfunction loader(fCallback) {

var oScript =

document

.getElementsByTagName("head")[0]

.createElement('script');

oScript.src= 'my.js';

oScript.onload = fCallback;

oScript.onreadystatechange =

fCallback;

}

Page 63: Inclure du Javascript de manière performante

DOM

jQuery :$.getScript(

'my.js',

fCallback);

YUI 3 :Y.Get.script(

'my.js',

{onSuccess: fCallback} );

Page 64: Inclure du Javascript de manière performante

DOM

✓ non bloquant

Page 65: Inclure du Javascript de manière performante

DOM

✓ non bloquant✓ mise en cache

Page 66: Inclure du Javascript de manière performante

DOM

✓ non bloquant✓ mise en cache✓ IE6-7 parallélise ! (bit.ly/dom_IE_para)

Page 67: Inclure du Javascript de manière performante

DOM

✓ non bloquant✓ mise en cache✓ IE6-7 parallélise ! (bit.ly/dom_IE_para)

✗ dépendances inline

Page 68: Inclure du Javascript de manière performante

DOM

✓ non bloquant✓ mise en cache✓ IE6-7 parallélise ! (bit.ly/dom_IE_para)

✗ dépendances inline✗ document.write()

Page 69: Inclure du Javascript de manière performante

DOM

✓ non bloquant✓ mise en cache✓ IE6-7 parallélise ! (bit.ly/dom_IE_para)

✗ dépendances inline✗ document.write()✗ ordre d'exécution

Page 70: Inclure du Javascript de manière performante

DOM

Bon pour les pages :

Page 71: Inclure du Javascript de manière performante

DOM

Bon pour les pages :

•éligibles à Bottom

Page 72: Inclure du Javascript de manière performante

DOM

Bon pour les pages :

•éligibles à Bottom•HTML > 0.5 - 1s

ou

Page 73: Inclure du Javascript de manière performante

DOM

Bon pour les pages :

•éligibles à Bottom•HTML > 0.5 - 1s

ou•gros volume de JS ( > 500k décompressé)

Page 74: Inclure du Javascript de manière performante

DOM

Type de pages :

•Blogs, Journaux•Boutiques•Comparateurs•...

Page 75: Inclure du Javascript de manière performante

DOM

Type de pages :

•Blogs, Journaux•Boutiques•Comparateurs•...•Applications Web

Page 76: Inclure du Javascript de manière performante

DOM - préalable

Découper son JS en modules

Page 77: Inclure du Javascript de manière performante

DOM - préalable

Découper son JS en modules

1 module PHP = 1 fonctionalité = 1 JS

lui donner un identifiant

Page 78: Inclure du Javascript de manière performante

DOM - préalable

✓ Découper son JS en modules

Centraliser les inclusions :

MY.loader =

function(sScriptID, fCallback) {

};

Page 79: Inclure du Javascript de manière performante

DOM - préalable

✓ Découper son JS en modules

Centraliser les inclusions :

MY.loader =

function(sScriptID, fCallback) {

$.getScript(

sScriptID+'.js',

fCallback);

};

Page 80: Inclure du Javascript de manière performante

DOM - préalable

✓ Découper son JS en modules✓ Centraliser les inclusionsCorriger toutes ses dépendances :<form id="login-form">

...

</form>

<

Page 81: Inclure du Javascript de manière performante

DOM - préalable

✓ Découper son JS en modules ✓ Centraliser les inclusionsCorriger toutes ses dépendances :<form id="login-form">

...

</form>

<script>

MY.enrichForm('login-form');

</script>

Page 82: Inclure du Javascript de manière performante

DOM - préalable

✓ Découper son JS en modules ✓ Centraliser les inclusionsCorriger toutes ses dépendances :<form id="login-form">

...

</form>

<script>

MY.loader('login-js', function() {

MY.enrichForm('login-form');

});

</script>

Page 83: Inclure du Javascript de manière performante

DOM - préalable

✓ Découper son JS en modules ✓ Centraliser les inclusions✓ Corriger toutes ses dépendances

Page 84: Inclure du Javascript de manière performante

DOM - préalable

✓ Découper son JS en modules ✓ Centraliser les inclusions✓ Corriger toutes ses dépendances✓ Concaténer les fichiers communs

Page 85: Inclure du Javascript de manière performante

DOM - évolution

✓ Découper son JS en modules ✓ Centraliser les inclusions✓ Corriger toutes ses dépendances✓ Concaténer les fichiers communsPlus tard :

•gérer les inclusions multiples

Page 86: Inclure du Javascript de manière performante

DOM - évolution

✓ Découper son JS en modules ✓ Centraliser les inclusions✓ Corriger toutes ses dépendances✓ Concaténer les fichiers communsPlus tard :

•gérer les inclusions multiplesTactique YUI3 :

•gérer dépendances entre classes

Page 87: Inclure du Javascript de manière performante

DOM - évolution

✓ Découper son JS en modules ✓ Centraliser les inclusions✓ Corriger toutes ses dépendances✓ Concaténer les fichiers communsPlus tard :

•gérer les inclusions multiplesTactique YUI3 :

•gérer dépendances entre classes•générer les JS à la volée

Page 88: Inclure du Javascript de manière performante

Etude de cas

Netvibes :

•inline : 100Ko de JS

•DOM : 260Ko de JS

•DOM : widget JS

Page 89: Inclure du Javascript de manière performante

Etude de cas

Facebook (Wall) :

Page 90: Inclure du Javascript de manière performante

Etude de cas

Facebook (Wall) : •flush() HTML presque vide

Page 91: Inclure du Javascript de manière performante

Etude de cas

Facebook (Wall) : •flush() HTML presque vide•inline : 1 loader DOM + 1 loader spécial (bigPipe : bit.ly/fb_bigpipe)

Page 92: Inclure du Javascript de manière performante

Etude de cas

Facebook (Wall) : •flush() HTML presque vide•inline : 1 loader DOM + 1 loader spécial (bigPipe : bit.ly/fb_bigpipe)•flush() des modules 1 par 1

Page 93: Inclure du Javascript de manière performante

Etude de cas

Facebook (Wall) : •flush() HTML presque vide•inline : 1 loader DOM + 1 loader spécial (bigPipe : bit.ly/fb_bigpipe)•flush() des modules 1 par 1•DOM :9 JS chargés (1 principal + 8 modules)

Page 94: Inclure du Javascript de manière performante

Etude de cas

Facebook (Wall) : •flush() HTML presque vide•inline : 1 loader DOM + 1 loader spécial (bigPipe : bit.ly/fb_bigpipe)•flush() des modules 1 par 1•DOM :9 JS chargés (1 principal + 8 modules)•meme technique pour CSS

Page 95: Inclure du Javascript de manière performante

Etude de cas

YUI 3 :

Page 96: Inclure du Javascript de manière performante

Etude de cas

YUI 3 :

•tout appel de code commence dans une fonction de callback

Page 97: Inclure du Javascript de manière performante

Etude de cas

YUI 3 :

•tout appel de code commence dans une fonction de callback•liste manuelle des dépendances

Page 98: Inclure du Javascript de manière performante

Etude de cas

YUI 3 :

•tout appel de code commence dans une fonction de callback•liste manuelle des dépendances•le loader connait les dépendances et les fichiers déjà chargés

Page 99: Inclure du Javascript de manière performante

Etude de cas

YUI 3 :

•tout appel de code commence dans une fonction de callback•liste manuelle des dépendances•le loader connait les dépendances et les fichiers déjà chargés•coté serveur : un combinateur

Page 100: Inclure du Javascript de manière performante

Orateur

Jean-pierre VINCENT

En ligne :•braincracking.org (veille)•twitter.com/theystolemynick•[email protected]•google it : jpvincent

10 ans de Web dont :•3 ans de Yahoo!

•2 ans d'application Web (timeofmylife.com)