Path.resolve ve path.jooc çağırma arasındaki fark?


192

Aşağıdaki çağrılar arasında bir fark var mı?

path.join(__dirname, 'app')

vs.

path.resolve(__dirname, 'app')

Hangisi tercih edilmeli?


Bu soru meta
Nino Filiu

Yanıtlar:


257

İki işlev /çok farklı şekillerde başlayan bölümlerle ilgilenir ; joinyalnızca önceki bağımsız değişkenle birleştirir, ancak resolvebunu kök dizin olarak ele alır ve önceki tüm yolları yoksayar - cdher bağımsız değişkenle yürütmenin sonucu olarak düşünün :

path.join('/a', '/b') // Outputs '/a/b'

path.resolve('/a', '/b') // Outputs '/b'

Dikkat edilmesi gereken başka bir şey path.resolve, her zaman mutlak bir URL ile sonuçlanacağı ve bu dizini çözmek için çalışma dizininizi temel olarak kullanacağıdır. Ama __dirnameyine de mutlak bir yol olduğu gibi , bu sizin durumunuzda önemli değil.

Hangisini kullanmanız gerektiği konusunda, cevap şudur: bu, başlangıçta başlayan segmentlerin nasıl /davranmasını istediğinize bağlıdır - basitçe birleştirilmeli mi yoksa yeni kök olarak mı davranmalılar?

Diğer argümanlar sabit kodlanmışsa, gerçekten önemli değil, bu durumda (a) bu satırın gelecekte nasıl değişebileceğini ve (b) koddaki diğer yerlerle ne kadar tutarlı olduğunu düşünmelisiniz.


65
Hala alamıyorsanız: path.join('/a', '/b', 'c')geri döner /a/b/c, path.resolve('/a', '/b', 'c')geri döner /b/c.
totymedli

29
İsminin resolveen açık değil, path.cd([starting dir], [final dir])çok daha sezgisel olacağını söyleyebilirim .
João Pimentel Ferreira

20
think of it as the result of executing cd with each argumentBana nihayet bunu anlamak yaptı. Teşekkürler
André Pena

@ JoãoPimentelFerreira, geçerli bir noktaya değindiğiniz için yukarıdaki cevabı güncelledim. :)
Rin Minase

yani path.resolve => çalışma dizinini yol başlangıç ​​noktası olarak kabul ederek yolu çözmeli?
Webwoman

15

Dosya sistemi yolunun varsayılan işlemleri, işletim sistemine bağlı olarak onu soyutlayan bir şeye ihtiyacımız var. pathModül dosya ve dizin yolları ile çalışmak için yardımcı programları veya API sağlar. kullanarak projenize ekleyebilirsiniz

const path = require('path');

path.joinVe path.resolveyol modülünün iki farklı yöntem vardır.

Her iki yöntem de bir dizi yolu veya yol parçasını kabul eder.

path.resolve()Yöntem, içine yolları veya yol bölümlerinin bir sırasını giderir mutlak yol .

path.join()Usul, sonra, bir araya sınırlayıcı olarak platforma özel bir ayırıcı kullanarak verilen tüm yol parçalarını birleştiren elde edilen yol normalleştirir.

Davranışları daha iyi anlamak ve farklılaştırmak için, bunu farklı senaryolarla açıklayayım.

1. Dize için herhangi bir argüman sağlamazsak

benim durumumda, dosya adım index.jsve geçerli çalışma diziniE:\MyFolder\Pjtz\node

const path = require('path');

console.log("path.join() : ", path.join());
// outputs .
console.log("path.resolve() : ", path.resolve());
// outputs current directory or equalent to __dirname of the node process

ve koşu sonucu aşağıdaki gibidir

λ node index.js
path.join() :  .
path.resolve() :  E:\MyFolder\Pjtz\node

Yukarıdaki deneyden çıkarım bu path.resolve()yöntem mutlak yolun çıktı olarak path.join()döndürülmesidir. hiçbir şey sağlanmamışsa geçerli çalışma dizinini veya göreli yolu temsil eder

2. Bağımsız değişkenlerden herhangi biri olarak bir / yol ekleme.

const path=require('path');

console.log("path.join() : " ,path.join('abc','/bcd'));
console.log("path.resolve() : ",path.resolve('abc','/bcd'));

ve sonuç

λ node index.js
path.join() :  abc\bcd
path.resolve() :  E:\bcd

Bu deneyde bulabileceğimiz çıkarım path.join(), giriş listesini yalnızca platforma özgü ayırıcı ile birleştirirken, path.resolve()işlem dizisi sağdan sola doğru işlenirken, sonraki her yol mutlak bir yol oluşturuluncaya kadar önceden eklenir.

path.join()her bağımsız değişkeni işletim sistemine özgü ayırıcılar ile birleştirirken, her bağımsız path.resolve()değişkeni root ile üretir ve çıktı üretir.


path.resolve()olduğu eşdeğer değildir için __dirname. Birincisi çalışma dizinini, ikincisi ise geçerli dosyanın yolunu döndürür.
Emile Bergeron

@EmileBergeron Anladığım kadarıyla ikisi de yoldaki işlevler. Her ikisinin de aynı olduğunu kontrol etmek için snippet'i takip etmeyi deneyebilirsiniz. const path = require('path'); console.log(path.resolve()) console.log(__dirname) console.log(path.resolve()===__dirname)
samuelj90

Bunlar, yalnızca çalışmakta olan dosya geçerli çalışma dizinindeyken aynı olur.
Emile Bergeron

@EmileBergeron Tamam katılıyorum.Ama hala belirlediğim yerde kafam karıştıpath.resolve() is equivalent to __dirname
samuelj90

1
@EmileBergeron Ben karışıklığı çözmek wil düşünüyorum yorum güncelledi
samuelj90

14

1) path.resolve mutlak yolu oluşturur.

Yöntem, mutlak bir yol oluşturuluncaya kadar sağdan sola absoulte yolu oluşturur .

Örneğin:

path.resolve('/a', 'b', 'c');     //    C:\a\b\c
path.resolve('/a', '/b', 'c');    //    C:\b\c
path.resolve('/a', '/b', '/c');   //    C:\c

Mutlak yol oluşturulmazsa, geçerli çalışma dizinini kullanan yöntem:

Örneğin:

path.resolve('a', 'b', 'c');     //    C:\{current_working_directory}\a\b\c

2) path.join tüm yola katılır ve sonucu normalleştirir

Örneğin:

path.join('/a', '/b', '/c');   //   \a\b\c
path.join('/a', '/b', 'c');    //   \a\b\c
path.join('/a', 'b', 'c');     //   \a\b\c
path.join('a', 'b', 'c');      //   \a\b\c

2
Son birleştirme örneği path.join('a','b','c')bunun sonucunu vermelidir a\b\c.
spmdc
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.