[node.js] 명령 줄을 통해 요구를 통해 또는 직접 호출되는지 감지

SH : node path-to-file또는 JS :를 사용하여 Node.JS 파일이 호출되었는지 어떻게 감지 require('path-to-file')합니까?

이것은 Perl의 이전 질문과 동일한 Node.JS입니다. require로 로드되지 않은 경우에만 Perl 스크립트를 실행할 수 있습니까?



답변

if (require.main === module) {
    console.log('called directly');
} else {
    console.log('required as a module');
}

여기에 대한 설명서를 참조하십시오 : https://nodejs.org/docs/latest/api/modules.html#modules_accessing_the_main_module


답변

약간 더 짧은 또 다른 방법이 있습니다 (언급 된 문서에는 설명되어 있지 않음).

var runningAsScript = !module.parent;

이 모든 것이 어떻게 작동하는지에 대한 자세한 내용을 설명했습니다. 이 블로그 게시물에서이 기능이 했습니다 .


답변

나는 설명에 사용 된 용어에 약간 혼란 스러웠다. 그래서 몇 가지 빠른 테스트를해야했습니다.

나는 이것들이 동일한 결과를 산출한다는 것을 발견했다.

var isCLI = !module.parent;
var isCLI = require.main === module;

그리고 다른 혼란스러운 사람들에게 (그리고 질문에 직접 대답하기 위해) :

var isCLI = require.main === module;
var wasRequired = !isCLI;


답변

파이썬에서와 마찬가지로, 나는이 빌어 먹을 코드 스 니펫을 작성하는 방법을 항상 기억하고있다. 그래서 간단한 모듈을 만들기로 결정했습니다. 호출자의 모듈 정보에 액세스하는 것이 쉽지는 않지만 개발하는 데 약간의 시간이 걸렸지 만 어떻게 수행 할 수 있는지 보는 것이 재미있었습니다.

따라서 아이디어는 모듈을 호출하고 호출자 모듈이 기본 모듈인지 묻는 것입니다. 호출자 함수의 모듈을 파악해야합니다. 첫 번째 접근 방식은 허용되는 답변의 변형이었습니다.

module.exports = function () {
    return require.main === module.parent;
};

그러나 이것이 작동한다고 보장되지는 않습니다. 우리를 호출 module.parent하는 모듈이 아니라 메모리에 로드 한 모듈을 가리 킵니다 . 이 헬퍼 모듈을 메모리에로드 한 호출자 모듈이라면 괜찮습니다. 그러나 그렇지 않은 경우, 우리는 무력합니다. 그래서 우리는 다른 것을 시도해야합니다. 내 솔루션은 스택 추적을 생성하고 거기에서 호출자의 모듈 이름을 얻는 것입니다.

module.exports = function () {
    // generate a stack trace
    const stack = (new Error()).stack;
    // the third line refers to our caller
    const stackLine = stack.split("\n")[2];
    // extract the module name from that line
    const callerModuleName = /\((.*):\d+:\d+\)$/.exec(stackLine)[1];

    return require.main.filename === callerModuleName;
};

이제 우리는 할 수 있습니다 :

if (require("./is-main-module")()) {  // notice the `()` at the end
    // do something
} else {
    // do something else
}

또는 더 읽기 쉬운 :

const isMainModule = require("./is-main-module");

if (isMainModule()) {
    // do something
} else {
    // do something else
}

잊을 수 없다 🙂


답변

ES6 모듈을 사용하는 경우 다음을 시도하십시오.

if (process.mainModule.filename === __filename) {
  console.log('running as main module')
}


답변