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')
}