Quand devrais-je utiliser le Javascript en ligne ou externe?


129

Je voudrais savoir quand je devrais inclure des scripts externes ou les écrire en ligne avec le code html, en termes de performances et de facilité de maintenance.

Quelle est la pratique générale pour cela?

Scénario du monde réel - J'ai plusieurs pages html qui nécessitent une validation de formulaire côté client. Pour cela, j'utilise un plugin jQuery que j'inclus sur toutes ces pages. Mais la question est, est-ce que je:

  • écrire les bits de code qui configurent ce script en ligne?
  • inclure tous les bits dans un fichier partagé entre toutes ces pages html?
  • inclure chaque bit dans un fichier externe distinct, un pour chaque page html?

Merci.

Réponses:


114

Au moment de la publication de cette réponse (2008), la règle était simple: tous les scripts doivent être externes. Tant pour la maintenance que pour les performances.

(Pourquoi les performances? Parce que si le code est séparé, il peut plus facilement être mis en cache par les navigateurs.)

JavaScript n'appartient pas au code HTML et s'il contient des caractères spéciaux (tels que <, >), il crée même des problèmes.

De nos jours, l'évolutivité Web a changé. La réduction du nombre de requêtes est devenue une considération valable en raison de la latence de plusieurs requêtes HTTP. Cela rend la réponse plus complexe: dans la plupart des cas, il est toujours recommandé d' avoir JavaScript externe . Mais dans certains cas, en particulier de très petits morceaux de code, les insérer dans le code HTML du site a du sens.


6
@Nick: la plupart des problèmes peuvent être surmontés. Mais il vaut mieux ne pas les générer en premier lieu.
Konrad Rudolph

17
Parfois, vous obtenez de meilleures performances lors de l'inlining. Regardez la source de google.com . Ils savent ce qu'ils font.
callum

13
@callum Google a un cas d'utilisation différent de 99,999999% des sites Web. Bien sûr, ils mesurent extrêmement soigneusement et même la plus petite différence compte. Mais juste parce qu'ils ont constaté que dans leur cas d'utilisation particulier, l'inlining fonctionne mieux (probablement parce que le script change très fréquemment?) Ne signifie pas que nous pouvons en tirer une règle générale, ou même que nous devrions ignorer le «conventionnel» règle (pour externaliser les scripts).
Konrad Rudolph

8
@KonradRudolph - D'accord, aucune règle générale ne doit découler de l'approche de Google. Je dis simplement que c'est une indication qu'il vaudrait peut-être la peine de remettre en question la règle dans votre réponse. Quoi qu'il en soit, je pense que la raison pour laquelle Google le fait est de réduire les requêtes HTTP, et cela pourrait profiter à plus de 0,000001% des sites. La bande passante augmente, mais les temps aller-retour restent les mêmes. La suppression d'une requête HTTP série entière est parfois meilleure que l'avantage de la mise en cache du JS externe. Dépend de la taille de votre JS bien sûr.
callum

5
@callum Bien que cela soit vrai, le point sur la mise en cache demeure et reste important. Réduire les allers-retours n'est important que si vos visiteurs ne reviennent pas (et que vous n'obtiendrez pas suffisamment de visites de pages pour que cela compte) ou si votre contenu change si souvent que la mise en cache des fichiers de script n'a aucun avantage.
Konrad Rudolph

31

La maintenabilité est certainement une raison pour les garder externes, mais si la configuration est une ligne (ou en général plus courte que la surcharge HTTP que vous auriez pour rendre ces fichiers externes), il est préférable de les garder en ligne. Rappelez-vous toujours que chaque requête HTTP génère une surcharge en termes de temps d'exécution et de trafic.

Naturellement, tout cela devient sans importance au moment où votre code est plus long que quelques lignes et n'est pas vraiment spécifique à une seule page. Au moment où vous voulez pouvoir réutiliser ce code, rendez-le externe. Si vous ne le faites pas, regardez sa taille et décidez alors.


5
C'est l'une de mes préoccupations. Avoir une requête HTTP séparée pour quelques lignes de codes semble inutile.
Dan Burzo le

Pourriez-vous peut-être publier un exemple de configuration pour votre code? IMO si elle est inférieure à 300 caractères et absolument spécifique à la page, insérez-la.
Horst Gutmann le

Cela devrait être la meilleure réponse imo
sgarcia.dev

@Dan garde à l'esprit que la demande séparée ne se produit que la première fois. Si vous vous attendez à ce que vos utilisateurs chargent la page plus d'une fois, la mise en cache externe (même pour quelques lignes) est clairement plus rapide que d'attendre les octets pour ces quelques lignes sur le fil sur les chargements de page n = 2 +.
jinglesthula

@HorstGutmann comment le fichier aide externe avec maintenabilité? Personnellement, je préfère les js externes lorsque cela est possible, mais y a-t-il quelque chose d'objectif qui facilite la maintenance?
jinglesthula

21

L'externalisation du javascript est l'une des règles de performance de Yahoo: http://developer.yahoo.com/performance/rules.html#external

Alors que la règle absolue selon laquelle vous devez toujours externaliser les scripts sera généralement un bon pari, dans certains cas, vous souhaiterez peut-être intégrer certains des scripts et des styles. Cependant, vous ne devez inclure que les éléments dont vous savez qu'ils amélioreront les performances (car vous avez mesuré cela).


1
Je pense que Yahoo recommande également d'ajouter tout le Javascript dans un seul appel HTTP - cela ne signifie pas que les scripts doivent tous être dans le même fichier pendant le développement
Paul Shannon

De plus, comme indiqué ci-dessus, HTTP / 2 modifie également la pratique "1 appel".
jinglesthula

19

Si vous ne vous souciez que des performances, la plupart des conseils de ce fil de discussion sont totalement faux et deviennent de plus en plus faux à l'ère du SPA, où nous pouvons supposer que la page est inutile sans le code JS. J'ai passé d'innombrables heures à optimiser les temps de chargement des pages SPA et à vérifier ces résultats avec différents navigateurs. Dans l'ensemble, l'augmentation des performances en réorchestrant votre html peut être assez dramatique.

Pour obtenir les meilleures performances, vous devez considérer les pages comme des fusées à deux étages. Ces deux étapes correspondent à peu près à des phases <head>et <body>, mais pensez-y plutôt comme <static>et <dynamic>. La partie statique est essentiellement une constante de chaîne que vous enfoncez le plus rapidement possible dans le tube de réponse. Cela peut être un peu délicat si vous utilisez beaucoup d'intergiciels qui définissent des cookies (ceux-ci doivent être définis avant d'envoyer du contenu http), mais en principe, il s'agit simplement de vider le tampon de réponse, espérons-le avant de sauter dans un code de modèle (razor, php, etc) sur le serveur. Cela peut sembler difficile, mais je l'explique simplement mal, car c'est presque trivial. Comme vous l'avez peut-être deviné, cette partie statique doit contenir tous les javascript incorporés et minifiés. Cela ressemblerait à quelque chose comme

<!DOCTYPE html>
     <html>
         <head>
             <script>/*...inlined jquery, angular, your code*/</script>
             <style>/* ditto css */</style>
         </head>
         <body>
             <!-- inline all your templates, if applicable -->
             <script type='template-mime' id='1'></script>
             <script type='template-mime' id='2'></script>
             <script type='template-mime' id='3'></script>

Comme il ne vous coûte presque rien d'envoyer cette partie sur le fil, vous pouvez vous attendre à ce que le client commence à recevoir cela quelque part environ 5 ms + latence après la connexion à votre serveur. En supposant que le serveur est raisonnablement proche, cette latence pourrait être comprise entre 20 ms et 60 ms. Les navigateurs commenceront à traiter cette section dès qu'ils l'obtiendront, et le temps de traitement dominera normalement le temps de transfert d'un facteur 20 ou plus, qui est maintenant votre fenêtre amortie pour le traitement côté serveur de la <dynamic>partie.

Il faut environ 50 ms au navigateur (chrome, le reste peut-être 20% plus lent) pour traiter jquery + signalr + angular + ng animate + ng touch + ng routes + lodash. C'est assez étonnant en soi. La plupart des applications Web ont moins de code que toutes ces bibliothèques populaires réunies, mais disons que vous en avez autant, donc nous gagnerions une latence + 100 ms de traitement sur le client (cette victoire de latence provient du deuxième bloc de transfert). Au moment où le deuxième morceau arrive, nous avons traité tout le code js et les modèles et nous pouvons commencer à exécuter des transformations dom.

Vous pouvez objecter que cette méthode est orthogonale au concept d'inlining, mais ce n'est pas le cas. Si vous, au lieu de créer un lien vers des cdns ou vos propres serveurs, le navigateur devra ouvrir une ou plusieurs autres connexions et retarder l'exécution. Puisque cette exécution est fondamentalement gratuite (comme le côté serveur parle à la base de données), il doit être clair que tous ces sauts coûteraient plus cher que de ne faire aucun saut du tout. S'il y avait une bizarrerie du navigateur qui disait que les js externes s'exécutaient plus rapidement, nous pourrions mesurer quel facteur domine. Mes mesures indiquent que les demandes supplémentaires tuent les performances à ce stade.

Je travaille beaucoup avec l'optimisation des applications SPA. Il est courant que les gens pensent que le volume de données est un gros problème, alors qu'en vérité, la latence et l'exécution dominent souvent. Les bibliothèques minifiées que j'ai répertoriées ajoutent jusqu'à 300 Ko de données, et ce n'est que 68 Ko gzippés, ou 200 ms de téléchargement sur un téléphone 2 mbit 3g / 4g, ce qui est exactement la latence qu'il faudrait sur le même téléphone pour vérifier s'il avait les mêmes données dans son cache déjà, même s'il était mis en cache par proxy, car la taxe de latence mobile (latence téléphone-tour) s'applique toujours. Pendant ce temps, les connexions de bureau qui ont une latence de premier saut plus faible ont généralement une bande passante plus élevée de toute façon.

En bref, pour le moment (2014), il est préférable d'intégrer tous les scripts, styles et modèles.

EDIT (MAI 2016)

Alors que les applications JS continuent de croître et que certaines de mes charges utiles empilent maintenant jusqu'à 3+ mégaoctets de code minifié, il devient évident qu'au moins les bibliothèques courantes ne devraient plus être intégrées.


Je n'ai pas obtenu le qui est maintenant votre fenêtre amortie pour le traitement côté serveur de la partie <dynamic> - Le serveur traite tout ce dont il a besoin et ne sert qu'ensuite à l'intégralité du rendu HTML (tête + corps), quel autre traitement du serveur est nécessaire après cela?
BornToCode

@BornToCode L'idée est de donner au client quelque chose à faire en même temps que le côté serveur a quelque chose à faire. Parce que les bibliothèques clientes doivent être interprétées, il est préférable de démarrer ce processus avant d'effectuer tout calcul sur le serveur. La fenêtre amortie est le temps nécessaire au client pour traiter le JS. Vous obtenez cette fenêtre gratuitement, si vous orchestrez une fusée à 2 étages.
Gleno


9

En fait, il existe un cas assez solide pour utiliser du javascript en ligne. Si le js est assez petit (one-liner), j'ai tendance à préférer le javascript en ligne à cause de deux facteurs:

  • Localité . Il n'est pas nécessaire de naviguer dans un fichier externe pour valider le comportement de certains javascript
  • AJAX . Si vous actualisez une section de la page via AJAX, vous risquez de perdre tous vos gestionnaires DOM (onclick, etc.) pour cette section, en fonction de la façon dont vous les avez liés. Par exemple, jQueryvous pouvez utiliser les méthodes liveou delegatepour contourner cela, mais je trouve que si le js est suffisamment petit, il est préférable de le mettre simplement en ligne.

5

Une autre raison pour laquelle vous devez toujours utiliser des scripts externes est une transition plus facile vers la stratégie de sécurité du contenu (CSP) . Les valeurs par défaut du CSP interdisent tous les scripts en ligne, ce qui rend votre site plus résistant aux attaques XSS.


4

Je jetterais un œil au code requis et le diviserais en autant de fichiers séparés que nécessaire. Chaque fichier js ne contiendrait qu'un "ensemble logique" de fonctions, etc. par exemple. un fichier pour toutes les fonctions liées à la connexion.

Ensuite, lors du développement du site sur chaque page html, vous n'incluez que ceux qui sont nécessaires. Lorsque vous mettez en ligne votre site, vous pouvez optimiser en combinant chaque fichier js dont une page a besoin en un seul fichier.


4

La seule défense que je peux offrir pour le javascipt en ligne est que lorsque vous utilisez des vues fortement typées avec .net MVC, vous pouvez vous référer aux variables c # mid javascript que j'ai trouvées utiles.


3

Trois considérations:

  • De combien de code avez-vous besoin (parfois les bibliothèques sont un consommateur de premier ordre)?
  • Spécificité: ce code est-il fonctionnel uniquement dans le cadre de ce document ou élément spécifique?
  • Chaque code à l'intérieur du document a tendance à le rendre plus long et donc plus lent. En plus de cela, les considérations SEO montrent clairement que vous minimisez les scripts internes ...

2

Les scripts externes sont également plus faciles à déboguer à l'aide de Firebug. J'aime tester en bloc mon JavaScript et avoir toutes les aides externes. Je déteste voir JavaScript dans le code PHP et HTML, cela me semble être un gros gâchis.


2

Sur le point de garder JavaScript externe:

ASP.NET 3.5SP1 a récemment introduit une fonctionnalité pour créer une ressource de script composite (fusionner un ensemble de fichiers js en un seul). Un autre avantage à cela est que lorsque la compression du serveur Web est activée, le téléchargement d'un fichier légèrement plus grand aura un meilleur taux de compression que de nombreux fichiers plus petits (également moins de surcharge http, aller-retour, etc.). Je suppose que cela économise sur le chargement initial de la page, puis la mise en cache du navigateur démarre comme mentionné ci-dessus.

ASP.NET mis à part, ce screencast explique les avantages plus en détail: http://www.asp.net/learn/3.5-SP1/video-296.aspx


2

Un autre avantage caché des scripts externes est que vous pouvez facilement les exécuter via un vérificateur de syntaxe comme jslint . Cela peut vous éviter de nombreux bugs IE6 déchirants et difficiles à trouver.


1

Dans votre scénario, il semble que l'écriture des éléments externes dans un fichier partagé entre les pages serait bon pour vous. Je suis d'accord avec tout ce qui a été dit ci-dessus.


1

Au début du prototypage, gardez votre code en ligne pour bénéficier d'une itération rapide, mais assurez-vous de le rendre entièrement externe au moment où vous atteignez la production.

J'oserais même dire que si vous ne pouvez pas placer tout votre Javascript à l'extérieur, alors vous avez une mauvaise conception entre vos mains, et vous devriez refactoriser vos données et vos scripts


1

Google a inclus les temps de chargement dans ses mesures de classement de page, si vous intégrez beaucoup, il faudra plus de temps aux araignées pour explorer votre page, cela peut avoir une influence sur le classement de votre page si vous en avez trop inclus. dans tous les cas, différentes stratégies peuvent avoir une influence sur votre classement.


1

Eh bien, je pense que vous devriez utiliser en ligne lors de la création de sites Web d'une seule page, car les scripts n'auront pas besoin d'être partagés sur plusieurs pages


-3

Essayez toujours d'utiliser des J externes car les js en ligne sont toujours difficiles à maintenir.

De plus, il est professionnellement requis que vous utilisiez un js externe car la majorité des développeurs recommandent d'utiliser js en externe.

J'utilise moi-même des js externes.


2
Nécessaire professionnellement? Pourquoi? Qui dit ça?
Siyah
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.