Bagaimana saya bisa mendeteksi apakah file Node.js saya dipanggil menggunakan SH: node path-to-file
atau JS: require('path-to-file')
?
Ini adalah Node.JS yang setara dengan pertanyaan saya sebelumnya di Perl: Bagaimana saya bisa menjalankan skrip Perl saya hanya jika tidak dimuat dengan memerlukan?
Jawaban:
Lihat dokumentasi untuk ini di sini: https://nodejs.org/docs/latest/api/modules.html#modules_accessing_the_main_module
sumber
require()
, tetapi Anda mungkin bisa melakukannya dengan mengimpor file kemudian berjalaneval
di atasnya, atau dengan menjalankanrequire('child_process').exec('node the_file.js')
es-main
paket untuk memeriksa apakah modul dijalankan secara langsung.Ada cara lain, sedikit lebih pendek (tidak diuraikan dalam dokumen yang disebutkan).
var runningAsScript = !module.parent;
Saya menjabarkan lebih rinci tentang bagaimana semua ini bekerja di bawah kap di posting blog ini .
sumber
node script.js
tapi tidakcat script.js | node
. Cara ini bekerja untuk keduanya.Saya sedikit bingung dengan terminologi yang digunakan dalam penjelasan. Jadi saya harus melakukan beberapa tes cepat.
Saya menemukan bahwa ini menghasilkan hasil yang sama:
Dan untuk orang-orang bingung lainnya (dan untuk menjawab pertanyaan secara langsung):
sumber
Sama seperti di Python, saya selalu menemukan diri saya mencoba mengingat bagaimana menulis potongan kode sialan ini. Jadi saya memutuskan untuk membuat modul sederhana untuk itu. Butuh sedikit waktu untuk saya kembangkan karena mengakses informasi modul pemanggil tidak mudah, tetapi menyenangkan melihat bagaimana hal itu bisa dilakukan.
Jadi idenya adalah memanggil modul dan bertanya apakah modul pemanggil adalah yang utama. Kita harus mencari tahu modul fungsi pemanggil. Pendekatan pertama saya adalah variasi dari jawaban yang diterima:
Tapi itu tidak dijamin berhasil.
module.parent
menunjuk ke modul yang memuat kita ke dalam memori, bukan yang memanggil kita. Jika itu adalah modul pemanggil yang memuat modul pembantu ini ke dalam memori, itu tidak masalah. Tetapi jika tidak, kita tidak berdaya. Jadi kita perlu mencoba sesuatu yang lain. Solusi saya adalah menghasilkan jejak stack dan mendapatkan nama modul pemanggil dari sana:Sekarang kita bisa melakukan:
Atau lebih mudah dibaca:
Mustahil untuk dilupakan :-)
sumber
return require.main /*this is undefined if we started node interactively*/ && require.main.filename === callerModuleName;
Coba ini jika Anda menggunakan modul ES6:
sumber
process.mainModule
yaituundefined