web-dev-qa-db-fra.com

Comment obtenir le chemin de fichier du code javascript en cours d'exécution

J'essaie de faire quelque chose comme un C #include "filename.c", Ou PHP include(dirname(__FILE__)."filename.php") mais en javascript. Je sais que je peux le faire si je peux obtenir le URL à partir de laquelle un fichier js a été chargé (par exemple, l'URL indiquée dans l'attribut src de la balise). Existe-t-il un moyen pour le javascript de le savoir?

Sinon, existe-t-il un bon moyen de charger javascript dynamiquement à partir du même domaine (sans connaître spécifiquement le domaine)? Par exemple, disons que nous avons deux serveurs identiques (QA et production) mais qu'ils ont clairement des domaines URL différents. Existe-t-il un moyen de faire quelque chose comme include("myLib.js"); où myLib.js se chargera à partir du domaine du fichier qui le charge?

Désolé si c'est libellé un peu confus.

57
B T

Dans le script:

var scripts = document.getElementsByTagName("script"),
    src = scripts[scripts.length-1].src;

Cela fonctionne car le navigateur charge et exécute les scripts dans l'ordre, donc pendant que votre script s'exécute, le document dans lequel il était inclus est sûr d'avoir votre élément de script comme dernier sur la page. Ce code doit bien sûr être "global" pour le script, donc enregistrez src quelque part où vous pourrez l'utiliser plus tard. Évitez les fuites de variables globales en les enveloppant dans:

(function() { ... })();
78
InfinitiesLoop

Tous les navigateurs à l'exception d'Internet Explorer (toute version) ont document.currentScript , qui fonctionne toujours toujours (peu importe la façon dont le fichier a été inclus (async, bookmarklet, etc.)).

Si vous souhaitez connaître l'URL complète du fichier JS dans lequel vous vous trouvez actuellement:

var script = document.currentScript;
var fullUrl = script.src;

Tadaa.

43
Rudie

La réponse acceptée ici ne fonctionne pas si vous avez des scripts en ligne dans votre document. Pour éviter cela, vous pouvez utiliser ce qui suit pour cibler uniquement <script> balises avec un [src] attribut.

/**
 * Current Script Path
 *
 * Get the dir path to the currently executing script file
 * which is always the last one in the scripts array with
 * an [src] attr
 */
var currentScriptPath = function () {

    var scripts = document.querySelectorAll( 'script[src]' );
    var currentScript = scripts[ scripts.length - 1 ].src;
    var currentScriptChunks = currentScript.split( '/' );
    var currentScriptFile = currentScriptChunks[ currentScriptChunks.length - 1 ];

    return currentScript.replace( currentScriptFile, '' );
}

Cela capture efficacement le dernier fichier .js externe, résolvant certains problèmes rencontrés avec les modèles JS en ligne.

16
Kevin Leary

Je viens de faire ce petit truc:

window.getRunningScript = () => {
    return () => {
        let err = new Error()
        let link = err.stack.split('(')
        link = link[1]
        link = link.split(')')[0]
        link = link.split(':')
        link.splice(-2, 2)
        link = link.join(':')

        return link
    }
}

console.log('%c Currently running script:', 'color: blue', getRunningScript()())

screenshot

Travailler sur: Chrome, Firefox, Edge

profitez-en!

7

En me fondant sur les réponses trouvées ici, j'ai trouvé ce qui suit:

getCurrentScript.js

var getCurrentScript = function () {
  if (document.currentScript) {
    return document.currentScript.src;
  } else {
    var scripts = document.getElementsByTagName('script');
    return scripts[scripts.length-1].src;

  }
};

module.exports = getCurrentScript;

getCurrentScriptPath.js

var getCurrentScript = require('./getCurrentScript');

var getCurrentScriptPath = function () {
  var script = getCurrentScript();
  var path = script.substring(0, script.lastIndexOf('/'));
  return path;
};

module.exports = getCurrentScriptPath;

BTW: J'utilise CommonJS le format du module et le bundle avec webpack .

5
Stoutie

Plus récemment, j'ai trouvé une approche beaucoup plus propre, qui peut être exécutée à tout moment, plutôt que d'être forcée de le faire de manière synchrone lors du chargement du script.

Utilisez stackinfo pour obtenir une trace de pile à un emplacement actuel, et récupérez le info.file nom en haut de la pile.

info = stackinfo()
console.log('This is the url of the script '+info[0].file)
4
B T

J'ai codé une fonction simple qui permet d'obtenir l'emplacement absolu du fichier javascript actuel, en utilisant une méthode try/catch.

Vous pouvez le voir ici .

2
Afonso Matos

Je comprends peut-être mal votre question, mais il semble que vous devriez simplement pouvoir utiliser un chemin relatif tant que les serveurs de production et de développement utilisent la même structure de chemin.

 <script language = "javascript" src = "js/myLib.js" />
1
johnmdonahue

Que ce soit un script, un fichier html (pour un cadre, par exemple), un fichier css, une image, peu importe, si vous dont spécifiez un serveur/domaine, le chemin du document html sera le par défaut, vous pouvez donc faire, par exemple,

<script type=text/javascript src='/dir/jsfile.js'></script>

ou

<script type=text/javascript src='../../scripts/jsfile.js'></script>

Si vous ne fournissez pas le serveur/domaine, le chemin sera relatif au chemin de la page ou au script du chemin du document principal

0
Graza