104 votes

Inclure un fichier .js dans un fichier .js

J'aimerais savoir s'il est possible d'inclure une .js dans un autre fichier .js fichier ?

La raison pour laquelle je veux faire cela est de garder les inclusions des clients à un minimum. J'ai plusieurs .js des fichiers déjà écrits avec les fonctions nécessaires au client. Le client dispose d'un fichier html qu'il gère avec une fonction .js inclure le fichier (mon .js ).

Je pourrais réécrire un nouveau .js avec toutes les fonctions qu'il contient ou, pour éviter de faire deux fois le même travail, trouver un moyen d'écrire un fichier .js qui comprend d'autres .js des fichiers.

0 votes

Je viens de créer un plugin Grunt pour répondre à peu près à la même exigence - il n'inclut que les fonctions qui sont utilisées dans votre application principale : github.com/mr-moon/grunt-contrib-resolve

47voto

YOU Points 44812

En gros, je fais comme ça, je crée un nouvel élément et je l'attache à <head>

var x = document.createElement('script');
x.src = 'http://example.com/test.js';
document.getElementsByTagName("head")[0].appendChild(x);

Vous pouvez également utiliser onload à chaque script que vous joignez, mais veuillez le tester, je ne suis pas sûr que cela fonctionne sur tous les navigateurs ou pas.

x.onload=callback_function;

5 votes

Comme il s'agit d'un processus asynchrone, je ne suis pas sûr qu'ils arriveront dans l'ordre que vous attendez.

13voto

gnarf Points 49213

La meilleure solution pour le temps de chargement de votre navigateur serait d'utiliser un script côté serveur pour les réunir en un seul gros fichier .js. Assurez-vous de gzip/minifier la version finale. Une seule requête - agréable et compacte.

Alternativement, vous pouvez utiliser DOM pour créer un fichier <script> et définir la propriété src sur celle-ci, puis l'ajouter à la balise <head> . Si vous devez attendre le chargement de cette fonctionnalité, vous pouvez faire en sorte que le reste de votre fichier javascript soit appelé à partir de la balise load sur cette balise script.

Cette fonction est basée sur la fonctionnalité de jQuery $.getScript()

function loadScript(src, f) {
  var head = document.getElementsByTagName("head")[0];
  var script = document.createElement("script");
  script.src = src;
  var done = false;
  script.onload = script.onreadystatechange = function() { 
    // attach to both events for cross browser finish detection:
    if ( !done && (!this.readyState ||
      this.readyState == "loaded" || this.readyState == "complete") ) {
      done = true;
      if (typeof f == 'function') f();
      // cleans up a little memory:
      script.onload = script.onreadystatechange = null;
      head.removeChild(script);
    }
  };
  head.appendChild(script);
}

// example:
loadScript('/some-other-script.js', function() { 
   alert('finished loading');
   finishSetup();
 });

6voto

rAm Points 676

Il n'y a pas de moyen direct de le faire.

Ce que vous pouvez faire est de charger le script à la demande. (encore une fois utilise quelque chose de similaire à ce qu'Ignacio a mentionné, mais beaucoup plus propre).

Consultez ce lien pour découvrir plusieurs façons de procéder : http://ajaxpatterns.org/On-Demand_Javascript

Mon préféré est (pas toujours applicable) :

<script src="dojo.js" type="text/javascript">
dojo.require("dojo.aDojoPackage");

La fermeture de Google offre également une fonctionnalité similaire.

0 votes

Le lien est mort entre-temps.

3voto

Daniel Vassallo Points 142049

Une méthode populaire pour aborder le problème de la réduction des références JavaScript dans les fichiers HTML consiste à utiliser un outil de concaténation tel que Pignons qui pré-traite et concatène les fichiers sources JavaScript.

En plus de réduire le nombre de références aux fichiers HTML, cela réduira également le nombre d'accès au serveur.

Vous pouvez ensuite faire passer la concaténation résultante par un outil de minification tel que jsmin pour le faire minifier.

0voto

Pete Jordan Points 492

J'utilise la méthode de @gnarf, bien que je me rabatte sur document.writeln d'un <script> pour IE<7 car je n'ai pas réussi à faire fonctionner la création de DOM de manière fiable dans IE6 (et je n'ai pas fait assez d'efforts pour cela). Le cœur de mon code est le suivant :

  if (horus.script.broken) {
    document.writeln('<script type="text/javascript" src="'+script+'"></script>');   
    horus.script.loaded(script);
  } else {
    var s=document.createElement('script');
    s.type='text/javascript';
    s.src=script;
    s.async=true;

    if (horus.brokenDOM)
      s.onreadystatechange=
        function () {
          if (this.readyState=='loaded' || this.readyState=='complete')
            horus.script.loaded(script);

        };

    else
      s.onload=function () { horus.script.loaded(script) };

    document.head.appendChild(s);
  }

horus.script.loaded() note que le fichier javascript est chargé, et appelle toutes les routines non appelées en attente (sauvegardées par le code de l'autoloader).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X