W jaki sposób można wykryć, czy mój plik node.js nazwano stosując SH: node path-to-file
czy JS: require('path-to-file')
?
To jest odpowiednik Node.JS do mojego poprzedniego pytania w Perlu: Jak mogę uruchomić skrypt Perla tylko wtedy, gdy nie został załadowany wymaganiem?
Odpowiedzi:
Zobacz dokumentację tego tutaj: https://nodejs.org/docs/latest/api/modules.html#modules_accessing_the_main_module
źródło
require()
, ale możesz to zrobić, importując plik, a następnie uruchamiająceval
go, lub uruchamiającrequire('child_process').exec('node the_file.js')
es-main
pakietu, aby sprawdzić, czy moduł został uruchomiony bezpośrednio.Istnieje inna, nieco krótsza droga (nie wymieniona we wspomnianych dokumentach).
var runningAsScript = !module.parent;
W tym wpisie na blogu przedstawiłem więcej szczegółów na temat tego, jak to wszystko działa pod maską .
źródło
node script.js
ale niecat script.js | node
. Ten sposób działa dla obu.Byłem trochę zdezorientowany terminologią użytą w wyjaśnieniach. Musiałem więc zrobić kilka szybkich testów.
Odkryłem, że dają one takie same wyniki:
A dla innych zdezorientowanych ludzi (i bezpośredniej odpowiedzi na pytanie):
źródło
Tak jak w Pythonie, zawsze próbuję sobie przypomnieć, jak napisać ten cholerny fragment kodu. Postanowiłem więc stworzyć dla niego prosty moduł. Zajęło mi to trochę czasu, ponieważ dostęp do informacji o module dzwoniącym nie jest łatwy, ale fajnie było zobaczyć, jak można to zrobić.
Pomysł polega więc na wywołaniu modułu i zapytaniu go, czy moduł wywołujący jest główny. Musimy ustalić moduł funkcji dzwoniącego. Moje pierwsze podejście było odmianą przyjętej odpowiedzi:
Ale to nie gwarantuje, że zadziała.
module.parent
wskazuje moduł, który załadował nas do pamięci, a nie ten, który nas woła. Jeśli to moduł wywołujący załadował ten moduł pomocnika do pamięci, nie ma sprawy. Ale jeśli nie, jesteśmy bezradni. Musimy więc spróbować czegoś innego. Moim rozwiązaniem było wygenerowanie śladu stosu i pobranie stąd nazwy modułu dzwoniącego:Teraz możemy zrobić:
Lub bardziej czytelny:
Niemożliwe do zapomnienia :-)
źródło
return require.main /*this is undefined if we started node interactively*/ && require.main.filename === callerModuleName;
Wypróbuj to, jeśli używasz modułów ES6:
źródło
process.mainModule
jestundefined