Node.JS dosyamın SH: node path-to-file
veya JS: kullanılarak çağrılıp çağrılmadığını nasıl anlayabilirim require('path-to-file')
?
Bu, Perl'deki önceki sorumun Node.JS eşdeğeri: Perl betiğimi yalnızca yüklenmediğinde nasıl çalıştırabilirim?
Node.JS dosyamın SH: node path-to-file
veya JS: kullanılarak çağrılıp çağrılmadığını nasıl anlayabilirim require('path-to-file')
?
Bu, Perl'deki önceki sorumun Node.JS eşdeğeri: Perl betiğimi yalnızca yüklenmediğinde nasıl çalıştırabilirim?
Yanıtlar:
if (require.main === module) {
console.log('called directly');
} else {
console.log('required as a module');
}
Bunun için belgelere bakın: https://nodejs.org/docs/latest/api/modules.html#modules_accessing_the_main_module
require()
, ama dosyayı alıp sonra çalıştırarak eval
veya çalıştırarak yapabilirsinrequire('child_process').exec('node the_file.js')
es-main
bir modülün doğrudan çalıştırılıp çalıştırılmadığını kontrol etmek için paketi kullanabilirsiniz .
Başka, biraz daha kısa bir yol var (belirtilen dokümanlarda ana hatlarıyla belirtilmemiş).
var runningAsScript = !module.parent;
Tüm bunların bu blog gönderisinde başlık altında nasıl çalıştığı hakkında daha ayrıntılı bilgi verdim .
node script.js
ama değil cat script.js | node
. Bu şekilde her ikisi için de çalışır.
Açıklamalarda kullanılan terminoloji ile biraz kafam karışmıştı. Bu yüzden birkaç hızlı test yapmak zorunda kaldım.
Bunların aynı sonuçları verdiğini buldum:
var isCLI = !module.parent;
var isCLI = require.main === module;
Ve diğer karışık insanlar için (ve soruyu doğrudan cevaplamak için):
var isCLI = require.main === module;
var wasRequired = !isCLI;
Tıpkı Python'da olduğu gibi, kendimi her zaman bu kahrolası kod parçacığını nasıl yazacağımı hatırlamaya çalışırken buluyorum. Bu yüzden bunun için basit bir modül oluşturmaya karar verdim. Arayanın modül bilgilerine erişmek hiç de kolay olmadığı için geliştirmemiz biraz zaman aldı, ancak bunun nasıl yapılabileceğini görmek eğlenceliydi.
Buradaki fikir, bir modülü çağırmak ve arayan modülün ana modül olup olmadığını sormaktır. Arayan fonksiyonunun modülünü bulmalıyız. İlk yaklaşımım kabul edilen cevabın bir varyasyonuydu:
module.exports = function () {
return require.main === module.parent;
};
Ancak bunun çalışması garanti edilmez. bizi hafızaya yükleyenmodule.parent
modüle işaret ediyor, bizi arayan modül değil. Bu yardımcı modülü belleğe yükleyen arayan modülü olsaydı, sorun değil. Ama öyle değilse, çaresiziz. Bu yüzden başka bir şey denememiz gerekiyor. Benim çözüm bir yığın izleme oluşturmak ve oradan arayanın modül adını almak oldu:
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;
};
Şimdi yapabiliriz:
if (require("./is-main-module")()) { // notice the `()` at the end
// do something
} else {
// do something else
}
Veya daha okunabilir:
const isMainModule = require("./is-main-module");
if (isMainModule()) {
// do something
} else {
// do something else
}
Unutmak imkansız :-)
return require.main /*this is undefined if we started node interactively*/ && require.main.filename === callerModuleName;
ES6 modülleri kullanıyorsanız bunu deneyin:
if (process.mainModule.filename === __filename) {
console.log('running as main module')
}
process.mainModule
isundefined