How to get the file-path of the currently executing javascript code

JavascriptIncludeAbsolute PathSrc

Javascript Problem Overview


I'm trying to do something like a C #include "filename.c", or PHP include(dirname(__FILE__)."filename.php") but in javascript. I know I can do this if I can get the URL a js file was loaded from (e.g. the URL given in the src attribute of the

Javascript Solutions


Solution 1 - Javascript

Within the script:

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

This works because the browser loads and executes scripts in order, so while your script is executing, the document it was included in is sure to have your script element as the last one on the page. This code of course must be 'global' to the script, so save src somewhere where you can use it later. Avoid leaking global variables by wrapping it in:

(function() { ... })();

Solution 2 - Javascript

All browsers except Internet Explorer (any version) have document.currentScript, which always works always (no matter how the file was included (async, bookmarklet etc)).

If you want to know the full URL of the JS file you're in right now:

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

Tadaa.

Solution 3 - Javascript

I just made this little trick :

window.getRunningScript = () => {
    return () => {      
        return new Error().stack.match(/([^ \n])*([a-z]*:\/\/\/?)*?[a-z0-9\/\\]*\.js/ig)[0]
    }
}
console.log('%c Currently running script:', 'color: blue', getRunningScript()())

screenshot

āœ… Works on: Chrome, Firefox, Edge, Opera

Enjoy !

Solution 4 - Javascript

The accepted answer here does not work if you have inline scripts in your document. To avoid this you can use the following to only target <script> tags with a [src] attribute.

/**
 * 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, '' );
}

This effectively captures the last external .js file, solving some issues I encountered with inline JS templates.

Solution 5 - Javascript

Refining upon the answers found here I came up with the following:

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;
console.log({log: 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: I'm using CommonJS module format and bundling with webpack.

Solution 6 - Javascript

I've more recently found a much cleaner approach to this, which can be executed at any time, rather than being forced to do it synchronously when the script loads.

Use stackinfo to get a stacktrace at a current location, and grab the info.file name off the top of the stack.

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

Solution 7 - Javascript

I've coded a simple function which allows to get the absolute location of the current javascript file, by using a try/catch method.

// Get script file location
// doesn't work for older browsers
 
var getScriptLocation = function() {
	var fileName  	= "fileName";
	var stack       = "stack";
	var stackTrace  = "stacktrace";
	var loc   	= null;
 
	var matcher = function(stack, matchedLoc) { return loc = matchedLoc; };
 
	try { 
 
		// Invalid code
		0();
 
	}  catch (ex) {
 
		if(fileName in ex) { // Firefox
			loc = ex[fileName];
		} else if(stackTrace in ex) { // Opera
			ex[stackTrace].replace(/called from line \d+, column \d+ in (.*):/gm, matcher);
		} else if(stack in ex) { // WebKit, Blink and IE10
			ex[stack].replace(/at.*?\(?(\S+):\d+:\d+\)?$/g, matcher);
		}
 
		return loc;
	}
 
};

You can see it here.

Solution 8 - Javascript

Refining upon the answers found here:

little trick

getCurrentScript and getCurrentScriptPath

I came up with the following:

//Thanks to https://stackoverflow.com/a/27369985/5175935
var getCurrentScript = function() {

  if (document.currentScript && (document.currentScript.src !== ''))
    return document.currentScript.src;
  var scripts = document.getElementsByTagName('script'),
    str = scripts[scripts.length - 1].src;
  if (str !== '')
    return str ;
  //Thanks to https://stackoverflow.com/a/42594856/5175935
  return new Error().stack.match(/(https?:[^:]*)/)[0];

};

//Thanks to https://stackoverflow.com/a/27369985/5175935
var getCurrentScriptPath = function() {
  var script = getCurrentScript(),
    path = script.substring(0, script.lastIndexOf('/'));
  return path;
};

console.log({path: getCurrentScriptPath()})

Solution 9 - Javascript

I may be misunderstanding your question but it seems you should just be able to use a relative path as long as the production and development servers use the same path structure.

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

Solution 10 - Javascript

Regardless of whether its a script, a html file (for a frame, for example), css file, image, whatever, if you dont specify a server/domain the path of the html doc will be the default, so you could do, for example,

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

or

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

If you don't provide the server/domain, the path will be relative to either the path of the page or script of the main document's path

Solution 11 - Javascript

function getCurrnetScriptName() {
    const url = new URL(document.currentScript.src);
    const {length:len, [len-1]:last} = url.pathname.split('/');
    return last.slice(0,-3);
}

Solution 12 - Javascript

I've thrown together some spaghetti code that will get the current .js file ran (ex. if you run a script with "node ." you can use this to get the directory of the script that's running)

this gets it as "file://path/to/directoryWhere/fileExists"

var thisFilesDirectoryPath = stackinfo()[0].traceline.substring("readFile (".length, stackinfo()[0].traceline.length - ")".length-"readFile (".length);

this requires an npm package (im sure its on other platforms as well):

npm i stackinfo

import stackinfo from 'stackinfo'; or var {stackinfo} = require("stackinfo");

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionB TView Question on Stackoverflow
Solution 1 - JavascriptInfinitiesLoopView Answer on Stackoverflow
Solution 2 - JavascriptRudieView Answer on Stackoverflow
Solution 3 - JavascriptAlexandre DaubricourtView Answer on Stackoverflow
Solution 4 - JavascriptKevin LearyView Answer on Stackoverflow
Solution 5 - JavascriptStoutieView Answer on Stackoverflow
Solution 6 - JavascriptB TView Answer on Stackoverflow
Solution 7 - JavascriptAfonso MatosView Answer on Stackoverflow
Solution 8 - JavascriptAndrejView Answer on Stackoverflow
Solution 9 - JavascriptjohnmdonahueView Answer on Stackoverflow
Solution 10 - JavascriptGrazaView Answer on Stackoverflow
Solution 11 - JavascriptSlev7nView Answer on Stackoverflow
Solution 12 - JavascriptGavinGoGamingView Answer on Stackoverflow