如何获得当前正在执行的 javascript 代码的文件路径

我尝试用 javascript 做一些类似于 C #include "filename.c"或 PHP include(dirname(__FILE__)."filename.php")的事情。我知道如果我可以得到加载 js 文件的 URL (例如标记的 src 属性中给出的 URL) ,我就可以做到这一点。有没有办法让 javascript 知道这一点呢?

或者,有没有什么好的方法可以从同一个域动态加载 javascript (不知道具体的域) ?例如,假设我们有两个相同的服务器(QA 和生产) ,但它们显然有不同的 URL 域。有没有办法做类似于 include("myLib.js");的事情,让 myLib.js 从加载它的文件的域加载它?

不好意思,措辞有点混乱。

132436 次浏览

我可能误解了您的问题,但似乎只要生产和开发服务器使用相同的路径结构,您就应该能够使用相对路径。

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

不管它是一个脚本,一个 html 文件(例如一个帧) ,css 文件,图像,无论什么,如果你 不要指定一个服务器/域,html 文档的路径将是默认的,所以你可以这样做,例如,

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

或者

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

如果不提供服务器/域,则路径将相对于页面的路径或主文档路径的脚本

在剧本中:

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

这是因为浏览器按顺序加载和执行脚本,所以在执行脚本时,包含脚本的文档肯定会将 script 元素作为页面上的最后一个元素。当然,这段代码对于脚本来说必须是“全局的”,所以将 src保存在以后可以使用的地方。通过包装全局变量来避免泄漏全局变量:

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

除了 Internet Explorer (任何版本)以外的所有浏览器都有 document.currentScript,它总是能正常工作(不管文件是如何包含的(异步的,书签小工具等))。

如果你想知道你现在所在的 JS 文件的完整 URL:

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

塔达。

我最近发现了一种更简洁的方法,可以在任何时候执行,而不是在加载脚本时被迫同步执行。

使用 Stackinfo获取当前位置的堆栈跟踪,并从堆栈顶部获取 info.file名称。

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

如果文档中有内联脚本,则此处接受的答案不起作用。为了避免这种情况,您可以使用以下内容来只针对具有 [src]属性的 <script>标记。

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

这有效地捕获了最后一个外部.JS 文件,解决了我在使用内联 JS 模板时遇到的一些问题。

我编写了一个简单的函数,它允许通过 try/catch 方法获取当前 javascript 文件的绝对位置。

// 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;
}


};

你可以看到它 给你

根据这里找到的答案,我得出了以下结论:

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;

顺便说一句: 我使用的是“ http://www.google.com/webhp? source ceid = chrome-moment & amp; ion = 1 & amp; espv = 2 & amp; ie = UTF-8 # source ceid = chrome-psyapi2 & amp; ie = UTF-8 & amp; q = commjs”rel = “ nofollow noReferrer”> CommonJS 模块格式和与 网络包捆绑。

我刚做了个小把戏:

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

Something 适用于: Chrome,Firefox,Edge,Opera

好好享受吧!

总结下面的答案:

小把戏

GetCurrentScript 和 getCurrentScriptPath

我想到了以下几点:

//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()})

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

我已经编写了一些意大利面条代码来获取当前的。Js 文件运行(例如。如果您使用“ node”运行脚本您可以使用它来获取正在运行的脚本的目录)

这将获得“ file://path/to/directoryWhere/fileExists”

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

这需要一个 npm 包(我确定它也在其他平台上) :

npm i stackinfo

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