현재 실행중인 JavaScript 코드의 파일 경로를 얻는 방법
-
20-09-2019 - |
문제
나는 c와 같은 일을하려고 노력하고있다 #include "filename.c"
, 또는 PHP include(dirname(__FILE__)."filename.php")
그러나 JavaScript에서. URL을 얻을 수 있다면 A JS 파일이로드 된 경우 (예 : 태그의 SRC 속성에 주어진 URL)에서로드되었습니다. JavaScript가 그것을 알 수있는 방법이 있습니까?
또는 도메인을 구체적으로 알지 못하고 동일한 도메인에서 자바 스크립트를 동적으로로드하는 좋은 방법이 있습니까? 예를 들어, 두 개의 동일한 서버 (QA 및 생산)가 있지만 URL 도메인이 분명히 있다고 가정합니다. 같은 일을하는 방법이 있습니까? include("myLib.js");
MyLib.js는 어디에서로드하는 파일의 도메인에서로드됩니까?
조금 혼란스럽게 말하면 죄송합니다.
해결책
스크립트 내에서 :
var scripts = document.getElementsByTagName("script"),
src = scripts[scripts.length-1].src;
브라우저가 순서대로 스크립트를로드하고 실행하므로 스크립트가 실행되는 동안 포함 된 문서는 스크립트 요소를 페이지의 마지막 요소로 가야합니다. 이 코드는 물론 스크립트의 '글로벌'이어야하므로 저장하십시오. src
나중에 사용할 수있는 곳. 글로벌 변수가 누출되지 않도록하십시오.
(function() { ... })();
다른 팁
Internet Explorer (모든 버전)를 제외한 모든 브라우저는 document.currentScript
, 파일이 어떻게 포함 되든 항상 (비동기, 북마크 등) 항상 작동합니다.
JS 파일의 전체 URL을 알고 싶다면 지금 당장
var script = document.currentScript;
var fullUrl = script.src;
Tadaa.
문서에 인라인 스크립트가있는 경우 여기서 허용 된 답변은 작동하지 않습니다. 이를 피하려면 다음을 사용하여 대상 만 사용할 수 있습니다. <script>
A가있는 태그 [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 템플릿으로 직면 한 몇 가지 문제를 해결합니다.
방금이 작은 속임수를 만들었습니다.
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()())
작업 : Chrome, Firefox, Edge
즐겨 !
여기에서 발견 된 답변을 정제합니다.
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;
나는 최근에 이것에 대한 훨씬 더 깨끗한 접근법을 발견했는데, 스크립트가로드 될 때 동기식으로 수행하지 않고 언제든지 실행할 수 있습니다.
사용 stackinfo 현재 위치에서 스택 트레이스를 얻고 info.file
스택 상단에서 이름을 지정하십시오.
info = stackinfo()
console.log('This is the url of the script '+info[0].file)
시도/캐치 메소드를 사용하여 현재 JavaScript 파일의 절대 위치를 얻을 수있는 간단한 기능을 코딩했습니다.
당신은 그것을 볼 수 있습니다 여기.
나는 당신의 질문을 오해하고 있을지 모르지만 생산 및 개발 서버가 동일한 경로 구조를 사용하는 한 상대 경로를 사용할 수 있어야합니다.
<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>
서버/도메인을 제공하지 않으면 경로는 페이지의 경로 또는 기본 문서 경로의 스크립트와 관련이 있습니다.