program story

현재 실행중인 자바 스크립트 코드의 파일 경로를 얻는 방법

inputbox 2020. 12. 14. 08:10
반응형

현재 실행중인 자바 스크립트 코드의 파일 경로를 얻는 방법


나는 C #include "filename.c"또는 PHP 와 같은 것을 시도하고 include(dirname(__FILE__)."filename.php")있지만 자바 스크립트에서. js 파일이로드 된 URL (예 : 태그의 src 속성에 제공된 URL)을 얻을 수 있으면이 작업을 수행 할 수 있습니다. 자바 스크립트가 그것을 알 수있는 방법이 있습니까?

또는 동일한 도메인에서 동적으로 자바 스크립트를로드하는 좋은 방법이 있습니까 (특별히 도메인을 알지 못함)? 예를 들어 두 개의 동일한 서버 (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>이있는 태그 만 대상으로 지정할 수 있습니다 [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()())

screenshot

작업 : 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;

BTW : 저는 CommonJS 모듈 형식을 사용 하고 webpack 과 번들링 합니다.


필자는 최근에 스크립트가로드 될 때 동 기적으로 수행하도록 강제하는 대신 언제든지 실행할 수있는 훨씬 더 깔끔한 접근 방식을 발견했습니다.

stackinfo사용 하여 현재 위치에서 스택 추적 을 얻고 info.file스택 상단 에서 이름을 가져옵니다 .

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

try / catch 메서드를 사용하여 현재 자바 스크립트 파일의 절대 위치를 가져올 수있는 간단한 함수를 코딩했습니다.

You can see it here.


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" />

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

참고URL : https://stackoverflow.com/questions/2255689/how-to-get-the-file-path-of-the-currently-executing-javascript-code

반응형