Ketika memprogram dalam Node.js dan mereferensikan file yang terletak di suatu tempat dalam kaitannya dengan direktori Anda saat ini, apakah ada alasan untuk menggunakan __dirname
variabel bukan hanya biasa ./
? Saya telah menggunakan ./ Sejauh ini dalam kode saya dan baru saja menemukan keberadaan __dirname
, dan pada dasarnya ingin tahu apakah akan pintar untuk mengkonversi ./ saya untuk itu, dan jika demikian, mengapa itu akan menjadi ide yang cerdas .
498
.
digunakan di dalamrequire
. Jalur di dalamrequire
selalu relatif terhadap file yang berisi panggilanrequire
.Jawaban:
Intinya
Di Node.js,
__dirname
selalu direktori di mana skrip yang saat ini menjalankan berada ( lihat ini ). Jadi, jika Anda mengetik__dirname
ke dalam/d1/d2/myscript.js
, nilai akan/d1/d2
.Sebaliknya,
.
memberi Anda direktori dari mana Anda menjalankannode
perintah di jendela terminal Anda (yaitu direktori kerja Anda) ketika Anda menggunakan perpustakaan sepertipath
danfs
. Secara teknis, ini dimulai sebagai direktori kerja Anda tetapi dapat diubah menggunakanprocess.chdir()
.Pengecualian adalah ketika Anda menggunakan
.
denganrequire()
. Jalur di dalamrequire
selalu relatif terhadap file yang berisi panggilanrequire
.Sebagai contoh...
Katakanlah struktur direktori Anda
dan
pathtest.js
berisidan kamu juga
Anda mendapatkan
Direktori kerja Anda adalah
/dir1/dir2
yang.
memutuskan untuk itu. Karenapathtest.js
terletak di/dir1/dir2
itulah yang__dirname
memutuskan untuk juga.Namun, jika Anda menjalankan skrip dari
/dir1
Anda mendapatkan
Dalam hal ini, direktori kerja Anda adalah
/dir1
yang harus.
diselesaikan, tetapi__dirname
masih memutuskan untuk melakukannya/dir1/dir2
.Menggunakan
.
di dalamrequire
...Jika di dalam
dir2/pathtest.js
Anda memilikirequire
panggilan ke memasukkan file di dalamdir1
Anda akan selalu melakukannyakarena path di dalamnya
require
selalu relatif terhadap file yang Anda panggil itu. Ini tidak ada hubungannya dengan direktori kerja Anda.sumber
./
tidak selalu direktori tempat simpul diluncurkan. Itu dimulai seperti itu, tetapi dapat diubah melaluiprocess.chdir()
. Jadi,./
selalu direktori kerja saat ini, yang biasanya merupakan simpul direktori yang diluncurkan, kecuali jika kode Anda secara eksplisit mengubah direktori kerja.../someDir
beberapa skrip dan Anda akan menjalankan perintah dari folder yang berbeda?./
merujuk ke direktori kerja saat ini, kecuali dalamrequire()
fungsi. Saat menggunakanrequire()
, itu diterjemahkan./
ke direktori file saat ini disebut.__dirname
selalu merupakan direktori dari file saat ini.Misalnya, dengan struktur file berikut
/home/user/dir/files/config.json
/home/user/dir/files/somefile.txt
/home/user/dir/dir.js
Jika saya
cd
masuk/home/user/dir
dan larinode dir.js
saya akan mendapatkanTetapi ketika saya menjalankan skrip yang sama dari
/home/user/
saya dapatkanMenggunakan
./
bekerja denganrequire
tetapi tidak untukfs.readFileSync
. Itu karena untukfs.readFileSync
,./
diterjemahkan ke dalam cwd (dalam hal ini/home/user/
). Dan/home/user/files/somefile.txt
tidak ada.sumber
/movies
, tetapi karena modul saya ada dalam file/custom_modules/
,__dirname
coba ambil filmnya dari,/custom_modules/movies
./
atauprocess.cwd()
. lihat nodejs.org/api/process.html#process_process_cwd