<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Performance web &#187; IE8 What&#8217;s Coming</title>
	<atom:link href="http://performance.survol.fr/avec/ie8-whats-coming/feed/" rel="self" type="application/rss+xml" />
	<link>http://performance.survol.fr</link>
	<description>Quelques mots pour des sites web rapides</description>
	<lastBuildDate>Fri, 18 Jun 2010 12:47:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Javascript non bloquant</title>
		<link>http://performance.survol.fr/2008/08/javascript-non-bloquant/</link>
		<comments>http://performance.survol.fr/2008/08/javascript-non-bloquant/#comments</comments>
		<pubDate>Mon, 04 Aug 2008 10:00:45 +0000</pubDate>
		<dc:creator>Éric</dc:creator>
				<category><![CDATA[Performance]]></category>
		<category><![CDATA[IE8 What's Coming]]></category>
		<category><![CDATA[Internet Explorer]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[parallélisation]]></category>
		<category><![CDATA[Steve Souders]]></category>
		<category><![CDATA[Stoyan Stefanov]]></category>
		<category><![CDATA[téléchargement]]></category>
		<category><![CDATA[velocity]]></category>

		<guid isPermaLink="false">http://performance.survol.fr/?p=63</guid>
		<description><![CDATA[Je vous l&#8217;avais dit, une balise &#60;script&#62; bloque le rendu et les nouveaux téléchargements dans le navigateur le temps que le javascript soit complètement téléchargé et exécuté. Une des solutions c&#8217;est de reléguer cette balise à la fin du document. &#8230; <a href="http://performance.survol.fr/2008/08/javascript-non-bloquant/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Je vous l&#8217;avais dit, <a href="http://performance.survol.fr/2008/04/javascript-a-sa-place/">une balise <code>&lt;script&gt;</code> bloque le rendu et les nouveaux téléchargements</a> dans le navigateur le temps que le javascript soit complètement téléchargé et exécuté. Une des solutions c&#8217;est de reléguer cette balise à la fin du document.</p>
<p>Il y a des fois où ce n&#8217;est pas idéal et c&#8217;est Steve Souders qui étudie les solutions dans <a href="http://en.oreilly.com/velocity2008/public/schedule/detail/3621">sa présentation aux conférences Velocity 2008</a>. <span id="more-63"></span>Quelques cas en vrac :</p>
<ul>
<li>Le Javascript est prioritaire, il doit être téléchargé et exécuté le plus tôt possible, mais pas au prix d&#8217;un blocage de tout le reste ;</li>
<li>Il n&#8217;est pas possible déplacer l&#8217;insertion de la balise à la fin du document, le système ne le permettant pas ;</li>
<li>Vous ne voulez pas montrer à l&#8217;utilisateur que la page est toujours en train de se charger (logo et barre de statut) ;</li>
<li>Vous ne voulez pas que l&#8217;événement onload de la page attende le téléchargement et l&#8217;exécution du javascript.</li>
</ul>
<h3>Ne pas bloquer le rendu</h3>
<p>Pour résumer les solutions intéressantes abordées par Steve Souders :</p>
<h5>Passer par l&#8217;<acronym title="interface de programmation">API</acronym> <acronym title="document object model">DOM</acronym></h5>
<p>La première solution est d&#8217;insérer le javascript via la création d&#8217;un noeud DOM. Le script ne bloque alors plus les nouveaux téléchargements. Le problème principal est que certains navigateur délaient l&#8217;événement onload tandis que d&#8217;autres l&#8217;exécuteront avant la fin du script. Cette différence peut rendre la gestion de la page un peu difficile</p>
<pre>var se = document.createElement('script');
se.src = 'http://example.org/test.js';
se.type = 'text/javascript' ;
document.getElementsByTagName('head')[0].appendChild(se);</pre>
<h5>Passer par une iframe</h5>
<p>La seconde solution est d&#8217;insérer le javascript via une iframe. Le rendu et les nouveaux téléchargements ne sont pas bloqués, l&#8217;événement onload réagit de la même façon sur tous les navigateur. Le défaut est que l&#8217;iframe fait elle-même perdre un peu de temps au rendu et que pour réutiliser le contenu on est limité à avoir la page et le script sur le même domaine. Impossible donc d&#8217;utiliser un CDN sur un domaine tiers.</p>
<p>Cela demande de plus de réorganiser le script lui même. La page principale devra passer par <code>window.frames[x]</code> pour accéder aux fonctions du script, et le script devra lui passer par <code>parent.document</code> pour accéder au DOM de la page principale.</p>
<h5>Passer par XMLHttpRequest</h5>
<p>La solution qui peut paraitre magique c&#8217;est d&#8217;insérer le javascript via une requête XMLHttpRequest. Le script ne bloque ni les nouveaux téléchargements ni l&#8217;événement onload. Mieux le navigateur ne montre pas à l&#8217;utilisateur que la page continue à se charger. Cela peut amener l&#8217;utilisateur à avoir une meilleure impression de vitesse. Par contre on est ici aussi limité à un seul domaine pour la page HTML et le javascript, donc pas de CDN sur domaine tiers.</p>
<p>Je ne vous met pas de code, chacun a sa bibliothèque pour ça. Vous pouvez utiliser DOM ou <code>eval</code>, comme vous voulez.</p>
<h5>Passer par un script <code>DEFER</code></h5>
<p>Enfin, vous avez l&#8217;attribut <code>DEFER</code> que vous pouvez ajouter à une balise de script des plus classiqes. Là non plus le script ne bloque pas les nouveaux téléchargements &#8230; mais uniquement sous Internet Explorer.</p>
<h3>Préserver l&#8217;ordre d&#8217;exécution</h3>
<p>Tout ça donne déjà un bon aperçu mais tout n&#8217;est pas résolu. Dès que vous avez plusieurs javascript vous avez certainement des dépendances et l&#8217;ordre de chargement est important. Là ça se gâte. Vous oubliez la technique de l&#8217;iframe qui ne vous garantit rien.  </p>
<p>Si vous pouvez vous permettre d&#8217;avoir le javascript sur le même domaine que la page HTML, alors il va vous falloir gérer vous même un code dans XMLHttpRequest pour assurer l&#8217;ordre d&#8217;exécution.</p>
<div>Dans le cas contraire, Firefox préservera l&#8217;ordre d&#8217;exécution quand vous insérez vos scripts via DOM. Pas Internet Explorer. Il ne vous reste plus qu&#8217;à faire du cas par cas : charger via DOM pour Firefox, et utiliser une balise de script classique avec un attribut <code>DEFER</code> pour Internet Explorer.</div>
<p>L&#8217;écran 26 de la présentation donne une excellente grille de lecture de tout ça. Et les autres navigateurs ? motus et bouche cousue. Dans l&#8217;ensemble les comportements ont des chances d&#8217;être similaires à ceux de Firefox, mais c&#8217;est à tester. Il y a quelques liens vers <a href="http://performance.survol.fr/2008/04/tester-avec-le-cuzillon/">le Cuzillon</a> donc si certains veulent tester et donner les résultats Safari et Opera&#8230;</p>
<h3>Utiliser YUI</h3>
<p>L&#8217;équipe Yahoo! est toujours sur la brèche côté performance. Vous avez doc <a href="http://developer.yahoo.com/yui/examples/get/get-script-basic.html">un outil YUI pour charger dynamiquement scripts</a> et des feuilles de style en tenant compte des dépendances, sans bloquer le navigateur. Visiblement <a href="http://dannythorpe.com/2008/07/23/cross-browser-dynamic-javascript-loading/">tout n&#8217;est pas clair sur la situation de Safari</a>, il faudrait que je fouille un peu pour tirer ça au clair. D&#8217;ordinaire la politique est d&#8217;avoir un comportement stable sur tous <a href="http://developer.yahoo.com/yui/articles/gbs/">les navigateurs grade A</a>, dont Safari fait partie, donc j&#8217;ai bon espoir que si ce n&#8217;est pas déjà le cas, une solution finisse par être trouvée.</p>
<p>Pour le même prix l&#8217;outil YUI permet aussi de charger aussi les feuilles de style et éviter leur aspect bloquant sur Firefox.</p>
<p>Stoyan Stefanov <a href="http://yuiblog.com/blog/2008/07/22/non-blocking-scripts/">en parle</a> lui aussi, en détail.</p>
<h3>Et l&#8217;avenir ?</h3>
<p>Le bon côté c&#8217;est que les équipes <a href="http://webkit.org/blog/166/optimizing-page-loading-in-web-browser/">Webkit</a> et <a href="http://en.oreilly.com/velocity2008/public/schedule/detail/3290">IE8</a> ont dans leurs cartons la possibilité de charger les scripts sans bloquer le navigateur et en les exécutant dans l&#8217;ordre d&#8217;apparition dans la page.</p>
<p>Tout ceci est pour demain, et les navigateurs d&#8217;aujourd&#8217;hui ne sont pas amenés à disparaitre rapidement, mais au moins, à moyen terme, on pourra n&#8217;avoir de ralentissement que sur les anciens navigateurs. Reste juste à espérer que Firefox et Opera bougent aussi sur ce point, mais malheureusement je n&#8217;ai pas vu d&#8217;information dans ce sens.</p>
]]></content:encoded>
			<wfw:commentRss>http://performance.survol.fr/2008/08/javascript-non-bloquant/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
	</channel>
</rss>
