Apakah Anda perlu menggunakan path.join di node.js?

134

karena semua orang tahu Windows melakukan jalur dengan garis miring terbalik di mana Unix melakukan jalur dengan garis miring ke depan. node.js menyediakan path.join()untuk selalu menggunakan garis miring yang benar. Jadi misalnya, alih-alih menulis Unix, 'a/b/c'Anda hanya akan melakukannya path.join('a','b','c').

Namun, tampaknya meskipun ada perbedaan ini jika Anda tidak menormalkan jalur Anda (misalnya menggunakan path.join) dan hanya menulis jalur seperti a/b/cnode.js tidak memiliki masalah dengan menjalankan skrip Anda di Windows.

Jadi apakah ada manfaat lebih menulis path.join('a','b','c')lebih 'a/b/c'? Keduanya tampaknya berfungsi terlepas dari platform ...

balupton
sumber

Jawaban:

106

Sistem file Windows tidak memiliki masalah menggunakan garis miring maju atau mundur sebagai pemisah jalur (ini telah terjadi sejak kembali pada hari-hari DOS). Satu-satunya masalah sebenarnya adalah bahwa prosesor baris perintah Windows (atau, lebih khusus, utilitas baris perintah Windows-asli) cenderung menafsirkan garis miring ke depan sebagai penentu opsi daripada komponen jalur. Oleh karena itu, Anda memerlukan jalur backslashed jika Anda harus meneruskan jalur ke perintah Windows yang dijalankan sebagai subproses. Selain itu, panggilan Windows API (dan metode dari bahasa tingkat tinggi yang memanggil Windows API) yang mengembalikan jalur akan menggunakan garis miring terbalik, jadi bahkan jika Anda tidak meneruskannya ke subproses, Anda harus menormalkannya.

ebohlman
sumber
Garis miring ke depan juga merusak jalur UNC.
user2426679
Jawaban ini tidak menjelaskan mengapa menggunakannya dalam aplikasi Node.js yang khas. Atau mungkin hanya aku saja yang tidak mengerti. Meski itu menarik.
Gherman
96

path.join akan menangani pembatas yang tidak perlu, yang mungkin terjadi jika jalur yang diberikan berasal dari sumber yang tidak diketahui (mis. input pengguna, API pihak ketiga, dll.).

Jadi path.join('a/','b') path.join('a/','/b'), path.join('a','b')dan path.join('a','/b')semuanya akan memberi a/b.

Tanpa menggunakannya, Anda biasanya akan membuat harapan tentang awal dan akhir jalur yang digabungkan, mengetahui bahwa mereka hanya tidak memiliki atau satu tebasan.

dronus
sumber
Kedengarannya agak berguna tetapi menerima jalur yang tidak dicentang sembarang dari sumber yang tidak dikenal terdengar seperti masalah keamanan besar. Itu bukan sesuatu yang harus sering dilakukan.
Gherman
50

Saya menggunakan path.joinuntuk memastikan pemisah folder di tempat yang benar, tidak harus memastikan bahwa ia menggunakan garis miring ke depan versus garis miring. Sebagai contoh:

path.join("/var/www", "test")

Akan dengan benar memasukkan pemisah antara www dan pengujian /var/www/test

Udang Timothy
sumber
2
Saya tidak mengerti poin ini. Jika Anda memiliki skrip tersebut dalam variabel, mengapa tidak menambahkan slash secara manual?
mgol
2
Saya juga kesulitan memahami jawaban ini. Tidak dapat melihat nilai apa pun.
oligofren
23
Karena saya tidak selalu yakin apakah nilai jalur yang saya dapatkan dari sumber lain akan memiliki garis miring atau tidak. Contoh saya di atas dibuat-buat. Seringkali jalur itu bukan kode keras, tetapi sedang ditarik dari file konfigurasi lainnya, input pengguna, perpustakaan, dll.
Timothy Strimple
@TimothyStrimple ~ tempat yang bagus untuk digunakan path.joinadalah jawaban Anda yang lain di sini stackoverflow.com/questions/9027648/… . Jawaban itu membawa saya ke sini untuk pertanyaan lain yang dijawab sendiri :)
Pebbl
23
Saya juga skeptis tentang jawaban itu sampai 5 menit kemudian kode saya meledak return baseDir + relativePath + filename;. Saya segera menggantinya dengan return path.join(baseDir, relativePath, filename);. Ini memang sangat membantu!
Pedro
34

Jawaban singkat:

Semua fs.*fungsi (mis. fs.open, Dll) memperlakukan pathname untuk Anda. Jadi, Anda tidak perlu menggunakan path.joindiri sendiri dan membuat kode Anda tidak terbaca.

Jawaban panjang:

Semua fs.*fungsi panggilan path._makeLong(path), yang pada gilirannya panggilan path.resolve(path), yang memiliki RegExps khusus untuk Windows, yang memperhitungkan garis miring terbalik \atau garis miring /. Anda dapat memeriksanya sendiri dengan melihat kode sumbernya di:

Rafael Xavier
sumber