Perbedaan antara path.normalize dan path.resolve di Node.js

86

Apa perbedaan (jika ada) antara path.normalize(your_path)dan path.resolve(your_path)?

Saya tahu path.resolve(...)dapat menerima banyak argumen, tetapi apakah perilaku dengan satu argumen sama dengan memanggil path.normalize()?

EDIT: Jika mereka seharusnya berperilaku dengan cara yang sama, saya tidak mengerti tujuan mengekspos path.normalize(...)fungsi ketika Anda dapat dengan mudah melewati jalur ke path.resolve(...)Atau, mungkin, itu untuk tujuan dokumentasi. Misalnya, mereka mengatakan dalam dokumentasi untuk path.resolve(...):

... Jalur yang dihasilkan dinormalisasi, dan ...

Mengekspos path.normalize(...)membuat lebih mudah untuk menjelaskan apa artinya "dinormalisasi" ??? Saya tidak tahu.

BMiner
sumber

Jawaban:

183

path.normalizemenghilangkan ekstra ., ..dll di jalan. path.resolvemenyelesaikan jalur menjadi jalur absolut. Contoh (direktori kerja saya saat ini /Users/mtilley/src/testing):

> path.normalize('../../src/../src/node')
'../../src/node'
> path.resolve('../../src/../src/node')
'/Users/mtilley/src/node'

Dengan kata lain, path.normalizeadalah "Apa jalur terpendek yang bisa saya ambil yang akan membawa saya ke tempat yang sama dengan masukan", sementarapath.resolve "Apa tujuan saya jika saya mengambil jalur ini."

Namun perlu dicatat bahwa path.normalize()adalah jauh lebih banyak konteks-independen dari path.resolve(). Memiliki path.normalize()pernah context- de independen (yaitu jika telah dipertimbangkan direktori kerja saat ini), hasilnya dalam contoh di atas pasti sudah ../node, karena itulah jalan satu terpendek bisa mengambil dari /Users/mtilley/src/testingke /Users/mtilley/src/node.

Ironisnya, ini berarti path.resolve()menghasilkan jalur relatif dalam istilah absolut (Anda bisa mengeksekusinya di mana saja, dan itu akan menghasilkan hasil yang sama), sedangkan path.normalize()menghasilkan jalur absolut dalam istilah relatif (Anda harus mengeksekusinya di jalur yang sesuai dengan yang Anda inginkan. hitung hasil absolut).

Michelle Tilley
sumber
Bagus. Terima kasih atas jawabannya! Ini telah mengganggu saya untuk sementara waktu. Dokumen Node, meskipun biasanya cukup bagus, membuat saya agak bingung tentang yang ini.
BMiner
14
Perhatikan juga bahwa path.normalize dapat menangani jalur apa pun yang mungkin ingin Anda normalkan dan berarti hanya manipulasi string dari jalur tersebut, sedangkan path.resolve akan menggunakan sistem file dan direktori saat ini untuk menyelesaikan jalur ke jalur absolut. Hal ini membuat mereka berperilaku sangat berbeda karena path.normalize dapat digunakan pada path di dalam file tar, pada filesystem remote, atau sesuatu yang sepenuhnya abstrak.
Nakedible
Apa perbedaannya dengan path.join?
Vijey
2

Dari dokumen:

Cara lain untuk memikirkan penyelesaian adalah sebagai urutan perintah cd di shell.

Tautan ke path.resolve dan path.normalize dalam dokumentasi. Saya kebanyakan tidak ingin hanya memberikan tautan dalam sebuah jawaban tetapi dokumen Node.js sangat layak.

Pickel
sumber
Saya kira saya tidak mengerti tujuan mengekspos fungsi normalisasi (...) ketika Anda cukup melewati jalur ke path.resolve (...)
BMiner
6
Path yang Anda normalkan mungkin sebenarnya tidak ada di filesystem, misalnya Anda mungkin menormalkan path ke file yang akan Anda buat, atau Anda mungkin menormalkan path URL relatif.
lanzz
Sebenarnya saya juga tidak tahu mengapa Anda menggunakan normalisasi daripada penyelesaian.
Pickel
1
normalisasi tidak menyelesaikan jalur ke jalur absolut. Sehingga bisa digunakan untuk mendapatkan jalur yang waras untuk beberapa sumber relatif terhadap sumber lain, yang bisa digunakan di dalam HTML untuk mereferensikan file yang dipilih oleh pengguna misalnya. Karena jalur yang dinormalisasi selalu sederhana (tanpa tambahan ../), maka dapat dengan mudah diperiksa untuk memastikan pengguna hanya memilih file dari lokasi tertentu dan tidak memiliki kesempatan untuk melihat file pribadi di luar lokasi ini.
dronus