IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contributions JavaScript / AJAX Discussion :

Où placer les balises script dans le code de la page HTML ? [FAQ]


Sujet :

Contributions JavaScript / AJAX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Par défaut Où placer les balises script dans le code de la page HTML ?
    En remplacement de http://javascript.developpez.com/faq...positionScript , entrée à laquelle j'ai moi-même participé, je propose une réponse plus complète introduisant les attributs async et defer. J'ai repris les explications de ce post:
    http://www.developpez.net/forums/d15...y/#post8371661

    Voilà la proposition:

    TL;DR: si vous ne devez retenir qu'une seule option à appliquer en toutes circonstances, mettre tous les <script> dans <head> avec l'attribut defer est le meilleur compromis à toutes les situations exposées ci-dessous.

    Plus un script est déclaré haut dans le code HTML d'un document, plus tôt le navigateur lancera la requête pour le télécharger. En effet, le navigateur n'attend pas que tout le document soit chargé: le HTML est interprété progressivement à mesure qu'il est reçu par le navigateur. C'est la même chose pour les feuilles CSS et pour toute autre ressource de la page. Bien sûr, la différence est significative uniquement si on a de gros documents, des pages HTML de plusieurs centaines de Ko. Si on regarde comment le Web a évolué, le HTML est aujourd'hui généralement bien plus léger que le reste (gros frameworks JS, CSS à rallonge, images haute définition etc...). Autrement dit, cette question du positionnement des balises <script> n'est plus si importante que ça.

    S'il faut quand même répondre à la question du positionnement optimal des balises <script>, voilà la théorie :

    1. 1ère règle: les ressources importantes, c'est-à-dire celles qu'on souhaite avoir avant même que le document n'ait fini d'être téléchargé, doivent être idéalement placées dans <head>. C'est pour cette raison que l'on met les feuilles de style en <head>, pour avoir le document "décoré" tout de suite et éviter que l'utilisateur ne voit la page sans styles jusqu'à ce que le chargement de la page soit fini.
    2. 2ème règle: exception à cette 1ère règle: un script étant susceptible de modifier le contenu de la page, il est nécessaire de bloquer l'interprétation de la page pendant le chargement et l'exécution des scripts ; placer les scripts dans le <head> réduit ainsi la vitesse d'affichage de la page. On doit ce comportement notamment à document.write qui peut venir modifier le document avant-même que celui ait fini d'être chargé. Précision importante, ce qui est bloqué est seulement l'interprétation du HTML, pas son téléchargement qui continue en tâche de fond. Tous les navigateurs modernes savent très bien gérer ça maintenant, donc le temps de chargement total de la page est quasiment inchangé. En revanche, le délai d'attente avant que l'utilisateur commence à voir un bout de contenu de page est lui plus long, car conditionné par le chargement et l'exécution des scripts en <head>.
    3. 3ème règle, contre-exception : les attributs async et defer apparus avec HTML5 sur la balise <script> permettent de mieux gérer ce comportement de blocage du parser HTML, et donc d'avoir les gains de la 1ère règle sans les pertes de la 2ème règle.


    Voilà pour la théorie. Qu'est-ce que cela donne en pratique ?

    • si vous devez supporter des navigateurs non compatibles HTML5, avez des pages HTML assez grosses et que votre site ne repose pas sur JavaScript pour fonctionner, mettez vos scripts avant la fermeture du </body>
    • si vous devez supporter des navigateurs non compatibles HTML5, avez des scripts assez lourds et importants pour faire fonctionner le site, mettez vos scripts dans le <head>
    • si vous supportez uniquement les navigateurs compatibles HTML5, mettez tous vos scripts dans <head> et :
      • Si le script dépend ou est requis par d'autres scripts, ou s'il doit travailler sur le DOM une fois chargé, ajoutez l'attribut defer.
      • Si le script est indépendant et fonctionnera peu importe quand il est interprété, ajoutez l'attribut async. (exemple: monitoring, statistiques, pub...)


    Dans le cas des scripts utilisant jQuery, la principale raison pour laquelle on met leurs balises <script> juste avant la fermeture du </body>, c'est que l'on est sûrs que le DOM ( le modèle document constitué par le HTML qui précède) a été interprété et on peut donc utiliser les sélecteurs jQuery sans problème. Mais ce n'est pas une obligation, on peut très bien mettre le script en <head> et utiliser $(document).ready (https://api.jquery.com/ready/) pour savoir quand le DOM est prêt.

    Autres liens explicatifs :
    https://developer.mozilla.org/fr/doc...Element/script
    http://www.growingwiththeweb.com/201...ttributes.html
    Votre avis ? Je sais que c'est un sujet à débat, et pas forcément un débat très intéressant. Mais pour être objectif il faut rentrer dans les détails.

  2. #2
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Par défaut
    Ajouté à la FAQ collaborative. Mais je peux encore la modifier si vous avez des retours.

  3. #3
    Expert éminent

    Avatar de vermine
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    6 582
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 6 582
    Par défaut
    Merci.

    Tu cites jQuery mais ne vaudrait-il mieux pas parler des frameworks au sens large ? J'ai peur d'un amalgame entre jQuery et le JavaScript par les néophytes.

  4. #4
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Par défaut
    En fait, beaucoup de frameworks peuvent être injectés dans le <head> et s'initialiser eux-mêmes au DOMContentLoaded. jQuery est un peu l'exception puisque c'est au développeur de faire ça manuellement. Et comme il est toujours très populaire et bat à plat de couture toutes les autres libs/fwks, j'ai pensé que ça valait le coup d'en faire un paragraphe. Mais on peut retirer ce paragraphe si tu préfères.

  5. #5
    Expert éminent

    Avatar de vermine
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    6 582
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 6 582
    Par défaut
    Non, pas le retirer. Je l'aurais bien mis dans une cadre "Information" mais je ne pense pas que ça existe sur cette page.

  6. #6
    Expert éminent

    Avatar de vermine
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    6 582
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 6 582
    Par défaut
    Sylvain,

    Nous pourrions peut-être imiter ce comportement pour insérer des zones d'info : http://javascript.developpez.com/faq...un-tableau-PHP

    A savoir, un tableau de deux colonnes avec l'image info des articles. C'est ce qui a été généré automatiquement. De manière générale, je suis un peu déçu par le rendu des pages collaboratives mais à nous de trouver la meilleure présentation.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Balise script dans le head de la page html
    Par binouzzz19 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 08/07/2010, 09h30
  2. Du PHP dans les balises "script"
    Par coachllb dans le forum Langage
    Réponses: 5
    Dernier message: 28/07/2007, 18h55
  3. Balise div dans le code .NET
    Par the big ben 5 dans le forum Delphi .NET
    Réponses: 1
    Dernier message: 26/04/2006, 17h35
  4. [//TODO] Comment voir les balises TODO dans les problemes?
    Par romain3395 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 06/12/2004, 08h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo