Bagaimana saya mendapatkan jalur ke skrip di Node.js?
Saya tahu ada process.cwd
, tapi itu hanya merujuk pada direktori tempat skrip dipanggil, bukan skrip itu sendiri. Misalnya, katakan saya di /home/kyle/
dan saya menjalankan perintah berikut:
node /home/kyle/some/dir/file.js
Jika saya menelepon process.cwd()
, saya mengerti /home/kyle/
, tidak /home/kyle/some/dir/
. Apakah ada cara untuk mendapatkan direktori itu?
Jawaban:
Saya menemukannya setelah melihat-lihat dokumentasi lagi. Apa yang saya cari adalah
__filename
dan__dirname
variabel modul-tingkat.__filename
adalah nama file dari modul saat ini. Ini adalah jalur absolut terselesaikan dari file modul saat ini. (ex:/home/kyle/some/dir/file.js
)__dirname
adalah nama direktori dari modul saat ini. (ex:/home/kyle/some/dir
)sumber
__dirname.split(path.sep).pop()
require('path').basename(__dirname);
Jadi pada dasarnya Anda bisa melakukan ini:
Gunakan resolving () alih-alih digabungkan dengan '/' atau '\' yang lain Anda akan mengalami masalah lintas-platform.
Catatan: __dirname adalah lintasan lokal modul atau skrip yang disertakan. Jika Anda menulis sebuah plugin yang perlu mengetahui jalur skrip utama, itu adalah:
atau, untuk mendapatkan nama folder:
sumber
var settings = require('./settings.json')
. Tentu saja, ini sinkron untuk IO, jadi jangan lakukan saat run-time, tetapi pada saat startup baik-baik saja, dan begitu dimuat, itu akan di-cache.Perintah ini mengembalikan direktori saat ini:
Misalnya, untuk menggunakan jalur untuk membaca file:
sumber
cd /foo; node bar/test.js
, direktori saat ini adalah/foo
, tetapi skrip terletak di/foo/bar/test.js
.text.txt
dan itu akan berhasil, Anda tidak perlu membangun path absolutGunakan __dirname !!
Nama direktori modul saat ini. Ini sama dengan path.dirname () dari
__filename
.Contoh: menjalankan simpul example.js dari / Users / mjr
https://nodejs.org/api/modules.html#modules_dirname
Untuk ESModules Anda ingin menggunakan:
import.meta.url
sumber
Ketika datang ke skrip utama itu sesederhana:
Dari dokumentasi Node.js :
Jika Anda perlu mengetahui jalur file modul, gunakan __filename .
sumber
process.argv[1]
hanya berlaku untuk skrip utama sementara__filename
menunjuk ke file modul yang sedang dieksekusi. Saya memperbarui jawaban saya untuk menekankan perbedaannya. Namun, saya tidak melihat ada yang salah dalam menggunakanprocess.argv[1]
. Tergantung pada kebutuhan seseorang.Node.js 10 mendukung modul ECMAScript , di mana
__dirname
dan__filename
tidak lagi tersedia .Kemudian untuk mendapatkan path ke modul ES saat ini kita harus menggunakan:
Dan untuk direktori yang berisi modul saat ini:
sumber
--experimental-modules
flag.sumber
__dirname
tidak lagi berfungsi dengan modul ES .Setiap program Node.js memiliki beberapa variabel global di lingkungannya, yang mewakili beberapa informasi tentang proses Anda dan salah satunya
__dirname
.sumber
__dirname
tidak lagi berfungsi dengan modul ES .Saya tahu ini cukup lama, dan pertanyaan awal yang saya jawab ditandai sebagai duplikat dan diarahkan di sini, tetapi saya mengalami masalah ketika mencoba membuat wartawan melati bekerja dan tidak menyukai gagasan bahwa saya harus menurunkan peringkat di Agar itu bekerja. Saya menemukan bahwa reporter melati tidak menyelesaikan savePath dengan benar dan benar-benar meletakkan folder output laporan di direktori reporter melati bukannya direktori root tempat saya berlari menelan. Untuk membuat ini berfungsi dengan benar, saya akhirnya menggunakan process.env.INIT_CWD untuk mendapatkan Direktori Kerja Saat Ini awal yang seharusnya menjadi direktori tempat Anda menjalankan tegukan. Semoga ini bisa membantu seseorang.
sumber
Anda dapat menggunakan process.env.PWD untuk mendapatkan jalur folder aplikasi saat ini.
sumber
Jika Anda menggunakan
pkg
untuk mengemas aplikasi Anda, Anda akan menemukan ungkapan ini berguna:process.pkg
memberitahu apakah aplikasi telah dikemas olehpkg
.process.execPath
memegang jalur penuh dari file yang dapat dieksekusi, yang/usr/bin/node
atau serupa untuk pemanggilan langsung skrip (node test.js
), atau aplikasi yang dipaketkan.require.main.filename
memegang path lengkap dari skrip utama, tetapi kosong ketika Node berjalan dalam mode interaktif.__dirname
memegang path lengkap dari skrip saat ini , jadi saya tidak menggunakannya (meskipun mungkin apa yang diminta OP; kemudian lebih baik menggunakanappDirectory = process.pkg ? require('path').dirname(process.execPath) : (__dirname || require('path').dirname(process.argv[0]));
mencatat bahwa dalam mode interaktif__dirname
kosong.Untuk mode interaktif, gunakan
process.argv[0]
untuk mendapatkan jalur ke Node yang dapat dieksekusi atauprocess.cwd()
untuk mendapatkan direktori saat ini.sumber
Gunakan
basename
metodepath
modul:Berikut adalah dokumentasi contoh di atas diambil.
Seperti yang ditunjukkan Dan, Node sedang mengerjakan modul - modul ECMAScript dengan flag "--experimental-modules". Node 12 masih mendukung
__dirname
dan__filename
seperti di atas.Jika Anda menggunakan
--experimental-modules
bendera, ada pendekatan alternatif .Alternatifnya adalah mendapatkan jalur ke modul ES saat ini :
Dan untuk direktori yang berisi modul saat ini:
sumber
Jika Anda menginginkan sesuatu yang lebih seperti $ 0 dalam skrip shell, coba ini:
sumber
__dirname
dan__filename
yang tidak lagi tersedia dengan modul ES .