Lors de l'incorporation de JavaScript dans un document HTML, où est l'endroit approprié pour placer les <script>
balises et le JavaScript inclus? Je semble me rappeler que vous n'êtes pas censé les placer dans la <head>
section, mais les placer au début de la <body>
section est également mauvais, car le JavaScript devra être analysé avant que la page ne soit rendue complètement (ou quelque chose comme ça). Cela semble laisser la fin de la <body>
section comme un endroit logique pour les <script>
balises.
Alors, où est le bon endroit pour mettre les <script>
balises?
(Cette question fait référence à cette question , dans laquelle il a été suggéré de déplacer les appels de fonction JavaScript des <a>
balises aux <script>
balises. J'utilise spécifiquement jQuery, mais des réponses plus générales sont également appropriées.)
la source
Réponses:
Voici ce qui se passe lorsqu'un navigateur charge un site Web avec une
<script>
balise dessus:<script>
balise référençant un fichier de script externe.L'étape # 4 provoque une mauvaise expérience utilisateur. Votre site Web s'arrête essentiellement de charger jusqu'à ce que vous ayez téléchargé tous les scripts. S'il y a une chose que les utilisateurs détestent, c'est d'attendre qu'un site Web se charge.
Pourquoi cela arrive-t-il même?
Tout script peut insérer son propre HTML via
document.write()
ou d'autres manipulations DOM. Cela implique que l'analyseur doit attendre que le script ait été téléchargé et exécuté avant de pouvoir analyser en toute sécurité le reste du document. Après tout, le script pourrait pu insérer son propre code HTML dans le document.Cependant, la plupart des développeurs JavaScript ne manipulent plus le DOM pendant le chargement du document. Au lieu de cela, ils attendent que le document soit chargé avant de le modifier. Par exemple:
Javascript:
Étant donné que votre navigateur ne sait pas que my-script.js ne va pas modifier le document tant qu'il n'a pas été téléchargé et exécuté, l'analyseur arrête l'analyse.
Recommandation désuète
L'ancienne approche pour résoudre ce problème était de mettre des
<script>
balises au bas de votre<body>
, car cela garantit que l'analyseur n'est pas bloqué jusqu'à la fin.Cette approche a son propre problème: le navigateur ne peut pas commencer à télécharger les scripts tant que le document entier n'est pas analysé. Pour les grands sites Web avec de grands scripts et feuilles de style, il est très important de pouvoir télécharger le script dès que possible pour les performances. Si votre site Web ne se charge pas dans les 2 secondes, les utilisateurs iront sur un autre site Web.
Dans une solution optimale, le navigateur commencerait à télécharger vos scripts dès que possible, tout en analysant le reste de votre document.
L'approche moderne
Aujourd'hui, les navigateurs prennent en charge le
async
etdefer
attributs sur les scripts. Ces attributs indiquent au navigateur qu'il est sûr de continuer l'analyse pendant le téléchargement des scripts.async
Les scripts avec l'attribut async sont exécutés de manière asynchrone. Cela signifie que le script est exécuté dès qu'il est téléchargé, sans bloquer le navigateur entre-temps.
Cela implique qu'il est possible de télécharger et d'exécuter le script 2 avant le script 1.
Selon http://caniuse.com/#feat=script-async , 97,78% de tous les navigateurs le soutiennent.
reporter
Les scripts avec l'attribut defer sont exécutés dans l'ordre (c'est-à-dire d'abord le script 1, puis le script 2). Cela ne bloque pas non plus le navigateur.
Contrairement aux scripts asynchrones, les scripts différés ne sont exécutés qu'après le chargement de l'intégralité du document.
Selon http://caniuse.com/#feat=script-defer , 97,79% de tous les navigateurs le soutiennent. 98,06% le soutiennent au moins partiellement.
Remarque importante sur la compatibilité du navigateur: dans certaines circonstances, IE <= 9 peut exécuter des scripts différés dans le désordre. Si vous devez prendre en charge ces navigateurs, veuillez d'abord lire ceci !
Conclusion
L'état actuel de la technique consiste à mettre des scripts dans la
<head>
balise et à utiliser leasync
oudefer
attributs . Cela permet de télécharger vos scripts dès que possible sans bloquer votre navigateur.La bonne chose est que votre site Web devrait toujours se charger correctement sur les 2% de navigateurs qui ne prennent pas en charge ces attributs tout en accélérant les 98% restants.
la source
document.write
opère sur le dom. La question n'est pas de savoir si un script manipule le dom, mais quand il le fait. Tant que toute manipulation dom se produit après ledomready
déclenchement de l'événement, vous êtes d'accord. jQuery est une bibliothèque, et en tant que telle ne manipule pas - ou ne devrait pas - le dom par lui-même.async
etdefer
ne sont-ils utilisés nulle part? Je veux dire, j'ai vu beaucoup de sources HTML sur Internet, et je ne vois nulle part les attributsasync
etdefer
. ...?Juste avant la balise de fermeture du corps, comme indiqué sur
http://developer.yahoo.com/performance/rules.html#js_bottom
la source
Les balises de script non bloquantes peuvent être placées à peu près n'importe où:
async
le script sera exécuté de manière asynchrone dès qu'il sera disponibledefer
le script est exécuté lorsque le document a terminé l'analyseasync defer
le script revient au comportement différé si l'async n'est pas pris en chargeCes scripts seront exécutés de manière asynchrone / une fois le document prêt, ce qui signifie que vous ne pouvez pas faire ceci:
Ou ca:
Ou ca:
Ou ca:
Cela dit, les scripts asynchrones offrent ces avantages:
navigateur peut télécharger des feuilles de style, des images et d'autres scripts en parallèle sans attendre le téléchargement et l'exécution d'un script.
vous pouvez placer les scripts à l'intérieur de la tête ou du corps sans vous soucier du blocage (utile si vous utilisez un CMS). L'ordre d'exécution compte toujours.
Il est possible de contourner les problèmes d'ordre d'exécution en utilisant des scripts externes qui prennent en charge les rappels. De nombreuses API JavaScript tierces prennent désormais en charge l'exécution non bloquante. Voici un exemple de chargement asynchrone de l'API Google Maps .
la source
<head>
logique.async
oudefer
en incluant jQuery que vous indiquez dans votre deuxième bloc:<script src="jquery.js" async></script>
. Pouvez-vous expliquer pourquoi? Je pensais que je devais avoir la balise async pour les performances - selon la réponse acceptée - afin que ma page puisse se charger même pendant que jQuery est toujours en cours de chargement]. Merci!<script src=jquery.js>
est suivi de$(function(){ ... })
blocs quelque part dans la page. Le chargement asynchrone ne garantit pas que jQuery sera chargé au moment où le navigateur essaie d'analyser ces blocs, donc il soulèvera $ n'est pas une erreur définie (vous ne pourrez pas obtenir l'erreur si jQuery a été chargé à partir du cache). J'ai répondu à une question sur le chargement de jQuery de manière asynchrone et la conservation$(function(){ ... })
. Je vais voir si je pouvais le trouver, ou vous pouvez regarder cette question: stackoverflow.com/q/14811471/87015jquery
lib pour charger, puis de mes.js
scripts restants . Lorsque je déclareasync
oudefer
sur lajquery
balise lib script, mes.js
scripts ne fonctionnent pas. Je pensais$(function(){ ... })
que ça protégeait - devinez pas. Solution actuelle: je n'ajoute pasdefer
ouasync
sur lejquery
script lib, mais j'ajouteasync
sur mes.js
scripts de suivi . Note: la raison pour laquelle je fais tout cela est de rendre Google Page Speed heureux. Merci encore pour l'aide! Tout autre conseil est le bienvenu. (Ou un lien vers votre réponse précédente). :)Le conseil standard, promu par Yahoo! Équipe Performance exceptionnelle, est de mettre la
<script>
balises à la fin du corps du document afin qu'elles ne bloquent pas le rendu de la page.Mais il existe des approches plus récentes qui offrent de meilleures performances, comme décrit dans cette réponse sur le temps de chargement du fichier JavaScript de Google Analytics:
la source
Si vous utilisez JQuery, placez le javascript où vous le trouvez le mieux et utilisez
$(document).ready()
pour vous assurer que les choses sont chargées correctement avant d'exécuter des fonctions.Sur une note latérale: j'aime toutes mes balises de script dans la
<head>
section car cela semble être l'endroit le plus propre.la source
<header>
?$(document).ready()
ne signifie pas que vous pouvez placer votre JavaScript où vous le souhaitez - vous devez toujours le placer après l'<script src=".../jquery.min.js">
endroit où vous incluez jQuery, de sorte qu'il$
existe.header
élément fait partie du contenu du document HTML et doit apparaître une ou plusieurs fois dans la balise head de l'body
élément. The
pour les métadonnées et les données de non-contenu du document. C'est, de nos jours, avecdefer
etasync
un endroit idéal pour les balises de script.header
les éléments ne doivent contenir que des informations décrivant la section du document qui le suit.L'approche moderne en 2019 utilise des scripts de type module ES6 .
Par défaut, les modules sont chargés de manière asynchrone et différés. c'est-à-dire que vous pouvez les placer n'importe où et ils se chargeront en parallèle et s'exécuteront à la fin du chargement de la page.
Les différences entre un script et un module sont décrites ici:
https://stackoverflow.com/a/53821485/731548
L'exécution d'un module par rapport à un script est décrite ici:
https://developers.google.com/web/fundamentals/primers/modules#defer
Le support est montré ici:
https://caniuse.com/#feat=es6-module
la source
XHTML ne sera pas validé si le script est ailleurs que dans l'élément head.il se trouve que cela peut être partout.Vous pouvez différer l'exécution avec quelque chose comme jQuery, donc peu importe où il est placé (sauf pour un petit coup de performance pendant l'analyse).
la source
la balise de script doit toujours être utilisée avant la fermeture du corps ou en bas du fichier HTML .
vous pouvez ensuite voir le contenu de la page avant de charger le fichier js .
cochez cela si besoin: http://stevesouders.com/hpws/rule-js-bottom.php
la source
La réponse conventionnelle (et largement acceptée) est "en bas", car alors tout le DOM aura été chargé avant que quoi que ce soit puisse commencer à s'exécuter.
Il existe des dissidents, pour diverses raisons, à commencer par la pratique disponible pour commencer intentionnellement l'exécution avec un événement de chargement de page.
la source
Le meilleur endroit pour mettre une
<script>
balise est avant de fermer la</body>
balise , donc le téléchargement et son exécution ne bloquent pas le navigateur pour analyser le html dans le document,Le chargement externe des fichiers js a également ses propres avantages, car il sera mis en cache par les navigateurs et peut accélérer les temps de chargement des pages , il sépare le code HTML et JavaScript et aide à mieux gérer la base de code .
mais les navigateurs modernes prennent également en charge d'autres moyens optimaux comme
async
etdefer
pour charger desjavascript
fichiers externes .Async et Defer
Normalement, l'exécution des pages HTML commence ligne par ligne. Lorsqu'un élément JavaScript externe est rencontré, l'analyse HTML est arrêtée jusqu'à ce qu'un JavaScript soit téléchargé et prêt à être exécuté. Cette exécution de page normale peut être modifiée à l'aide de
defer
et d'async
attribut.Defer
Lorsqu'un attribut de report est utilisé, JavaScript est téléchargé parallèlement à l'analyse HTML mais ne sera exécuté qu'après l'analyse complète du HTML.
Async
Lorsque l'attribut async est utilisé, JavaScript est téléchargé dès que le script est rencontré et après le téléchargement, il sera exécuté de manière asynchrone (parallèlement) avec l'analyse HTML.
Quand utiliser quels attributs
async
.async
, les deux s'exécuterontparallèlement à l'analyse HTML, dès qu'ils seront téléchargés
et disponibles.
defer
pour les deux:defer
, alors script1 est garanti de s'exécuter en premier,async
utilisez votre script sans attribut et placez-le au-dessus de tous lesasync
scripts.référence: knowledgehills.com
la source
Cela dépend, si vous chargez un script qui est nécessaire pour styliser votre page / en utilisant des actions dans votre page (comme un clic sur un bouton), vous feriez mieux de le placer en haut. Si votre style est 100% CSS et que vous avez toutes les options de secours pour les actions de bouton, vous pouvez le placer en bas.
Ou la meilleure chose (si ce n'est pas un problème) est que vous pouvez créer une boîte de chargement modal, placez votre javascript en bas de votre page et faites-le disparaître lorsque la dernière ligne de votre script est chargée. De cette façon, vous pouvez éviter aux utilisateurs d'utiliser des actions dans votre page avant le chargement des scripts. Et évitez également le style inapproprié.
la source
L'inclusion de scripts à la fin est principalement utilisée lorsque le contenu / les styles du site Web doivent être affichés en premier.
inclure les scripts dans la tête charge les scripts tôt et peut être utilisé avant le chargement de l'ensemble du site web.
si les scripts sont enfin entrés, la validation n'aura lieu qu'après le chargement de l'ensemble des styles et du design, ce qui n'est pas apprécié pour les sites Web réactifs.
la source
Selon le script et son utilisation, le mieux possible (en termes de chargement de page et de temps de rendu) peut être de ne pas utiliser une balise <script> conventionnelle en soi, mais de déclencher dynamiquement le chargement du script de manière asynchrone.
Il existe différentes techniques, mais la plus simple consiste à utiliser document.createElement ("script") lorsque l'événement window.onload est déclenché. Ensuite, le script est chargé en premier lorsque la page elle-même est restituée, n'affectant ainsi pas le temps que l'utilisateur doit attendre pour que la page apparaisse.
Cela nécessite naturellement que le script lui-même ne soit pas nécessaire pour le rendu de la page.
Pour plus d'informations, consultez le post Coupling async scripts de Steve Souders (créateur de YSlow mais maintenant chez Google).
la source
Si vous vous souciez toujours beaucoup du support et des performances dans IE <10, il est préférable de TOUJOURS faire de vos balises de script les dernières balises de votre corps HTML. De cette façon, vous êtes certain que le reste du DOM a été chargé et vous ne bloquerez pas et ne rendrez pas.
Si vous ne vous souciez plus trop d'IE <10, vous voudrez peut-être mettre vos scripts dans la tête de votre document et les utiliser
defer
pour vous assurer qu'ils ne s'exécutent qu'après le chargement de votre DOM (<script type="text/javascript" src="path/to/script1.js" defer></script>
). Si vous voulez toujours que votre code fonctionne dans IE <10, n'oubliez pas de mettre votre code dans unwindow.onload
même, cependant!la source
Le script bloque le chargement du DOM jusqu'à ce qu'il soit chargé et exécuté.
Si vous placez des scripts à la fin de
<body>
tous les DOM, vous avez la possibilité de charger et de rendre (la page "s'affichera" plus rapidement).<script>
aura accès à tous ces éléments DOM.En revanche, le placer après le
<body>
début ou au-dessus exécutera le script (où il n'y a toujours pas d'éléments DOM).Vous incluez jQuery, ce qui signifie que vous pouvez le placer où vous le souhaitez et l'utiliser .ready ()
la source
Je pense que cela dépend de l'exécution de la page Web. Si la page que vous souhaitez afficher ne peut pas s'afficher correctement sans charger d'abord JavaScript, vous devez d'abord inclure le fichier JavaScript. Mais si vous pouvez afficher / rendre une page Web sans télécharger initialement le fichier JavaScript, vous devez mettre le code JavaScript au bas de la page. Parce qu'il émulera un chargement de page rapide, et du point de vue d'un utilisateur, il semblerait que cette page se charge plus rapidement.
la source
Vous pouvez placer la plupart des
<script>
références à la fin de<body>
,mais s'il y a des composants actifs sur votre page qui utilisent des scripts externes,
alors leur dépendance (fichiers js) devrait précéder (idéalement dans la balise head).
la source
Avant la fin de la balise body afin d'empêcher et de bloquer l'interface utilisateur.
la source
À la fin du document HTML
Pour qu'il n'effectue pas le chargement du document HTML dans le navigateur au moment de l'exécution.
la source
Le meilleur endroit pour écrire votre
JavaScript
code est à la fin du document après ou juste avant la</body>
balise pour charger le document en premier, puis exécuter le code js.Et si vous écrivez
JQuery
ce qui suit peut être dans le document principal et il s'exécutera après le chargement du document:la source
SyntaxError
Il est plus logique pour moi d'inclure le script après le HTML. Parce que la plupart du temps, j'ai besoin que le Dom se charge avant d'exécuter mon script. Je pourrais le mettre dans la balise head mais je n'aime pas tous les frais généraux de l'écouteur de chargement de documents. Je veux que mon code soit court, doux et facile à lire.
J'ai entendu dire que les anciennes versions de safari étaient quarky lors de l'ajout de votre script en dehors de la balise head, mais je dis qui s'en soucie. Je ne connais personne qui utilise cette vieille merde.
Bonne question d'ailleurs.
la source
Vous pouvez placer où vous voulez les scripts et l'un n'est pas meilleur qu'une autre pratique.
la situation est la suivante:
La page se charge linéairement, "de haut en bas", donc si vous mettez le script dans la tête s'assure qu'il commence à se charger avant tout, maintenant, si vous le mettez à l'intérieur du corps mélangé avec le code peut provoquer des chargements de page d'une manière inesthétique.
identifier les bonnes pratiques ne dépend pas de l'endroit où.
pour vous soutenir, je mentionnerai ce qui suit:
vous pouvez placer:
et la page se chargera linéairement
la page est chargée de manière asynchrone avec d'autres contenus
le contenu de la page se chargera avant et après la fin du chargement les scripts sont chargés
la bonne pratique serait ici, quand mettra en œuvre chacun?
J'espère avoir été utile, quoi que ce soit, répondez-moi à ce problème.
la source