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

IT技术 javascript include absolute-path src
2021-02-17 00:51:03

我正在尝试使用 C#include "filename.c"或 PHP 之类的东西include(dirname(__FILE__)."filename.php")但使用 javascript。我知道如果我可以获取加载 js 文件的 URL(例如标签的 src 属性中给出的 URL),我就可以做到这一点。javascript 有没有办法知道这一点?

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

对不起,如果那措辞有点令人困惑。

6个回答

在脚本中:

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

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

(function() { ... })();
@InifinitesLoop:在对类似问题的类似回答中,他们建议返回scripts[scripts.length-1].getAttribute('src', -1),请在此处查看更多信息:stackoverflow.com/questions/984510/what-is- my-script-src-url/…
2021-04-17 00:51:03
@buley 请参阅下面我最近的回答。使用 stackinfo module (github) 从堆栈跟踪中获取文件名可能会对您有所帮助。
2021-04-30 00:51:03
如果<script>由于各种原因您的标签不是最后一个,这将不起作用,例如,如果您在<head>. 另请参阅此评论
2021-05-03 00:51:03
'src' 有一个 var 说明符(见第一行末尾的逗号)
2021-05-07 00:51:03
这是一个很好的建议,只要脚本中的代码是“内联”运行的(即在全局上下文或“立即运行匿名方法”中,正如您所建议的那样,而不是在“稍后调用”函数或集合中-暂停)。您可以通过这种方式在每个 javascript 中为当前文件/路径创建一个 var。但是请注意,“泄漏全局变量”无法通过我所说的即时运行匿名方法来解决(function(){...})();- 您上面的示例仍将创建一个名为的全局变量,src因为它var之前没有说明符
2021-05-15 00:51:03

除 Internet Explorer(任何版本)外的所有浏览器都有document.currentScript,它始终有效(无论文件如何包含(异步、书签等))。

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

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

多阿。

我认为很高兴知道 - 如果对象是从该文件脚本之外初始化的,那么该路径是不同的 - 所以如果有人想要脚本的路径,则必须在该文件脚本的根目录中调用它
2021-04-25 00:51:03
这太棒了,正是我希望找到的!
2021-04-26 00:51:03
谢谢,我终于找到了解决方案!
2021-05-14 00:51:03

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

/**
 * 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 模板时遇到的一些问题。

效果很好!!!。谢谢!!!。我已经找到并尝试了很多解决方案,但没有积极的结果。
2021-04-30 00:51:03

我刚刚做了这个小技巧:

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

截屏

适用于:Chrome、Firefox、Edge、Opera

享受 !

根据这里找到的答案,我想出了以下几点:

获取当前脚本.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()})

获取当前脚本路径.js

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

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

module.exports = getCurrentScriptPath;

顺便说一句:我正在使用CommonJS module格式并与webpack捆绑