path.join vs path.res.ve __dirname ile çözün


142

Kullanırken bir fark var mı hem path.join ve path.resolvebirlikte __dirnamenode.js mutlak yolunu çözmek için?

Bu şekilde kullanılırken bunlardan biri tercih edilmeli midir (mutlak yol çözünürlükleri kullanım örneklerinin% 90'ıdır)?

yani

const absolutePath = path.join(__dirname, some, dir);

vs.

const absolutePath = path.resolve(__dirname, some, dir);

Her iki yöntem de yolu normalleştirir.

Bu, bu sorunun bir kopyası değildir, çünkü kabul edilen cevap yanlıştır.


Bu soru meta üzerinde tartışılıyor
Nino Filiu

Yanıtlar:


152

Evet, işlevler arasında bir fark vardır, ancak bu durumda bunları kullanma şekliniz aynı sonuca neden olacaktır.

path.joiniki yolu bir araya getirerek normalleştirilmiş bir yol döndürür. Mutlak bir yol döndürebilir, ancak her zaman böyle olması gerekmez.

Örneğin:

path.join('app/libs/oauth', '/../ssl')

karar verir app/libs/ssl

path.resolve, diğer taraftan, mutlak bir yola giderir.

Örneğin, şunları çalıştırdığınızda:

path.resolve('bar', '/foo');

Döndürülen /fooyol, yapılandırılabilecek ilk mutlak yol olduğu için olacaktır.

Ancak, şunları çalıştırırsanız:

path.resolve('/bar/bae', '/foo', 'test');

Döndürülen yol tekrar olacaktır /foo/testçünkü sağdan sola oluşturulabilen ilk mutlak yol budur.

Kök dizini belirten bir yol sağlamazsanız, resolveişleve verilen yollar geçerli çalışma dizinine eklenir. Yani çalışma dizininiz /home/mark/project/:

path.resolve('test', 'directory', '../back');

karar verir

/home/mark/project/test/back

__dirnameKaynak dosyayı içeren dizinin mutlak yolu kullanmaktır . Kullandığınız zaman path.resolveveya path.joinaynı yolu aşağıdaki şekilde verirseniz aynı sonucu döndürürler __dirname. Bu gibi durumlarda gerçekten sadece bir tercih meselesi.


25
Nit: geçerli çalışma dizinini__dirname değil, yürütülmekte olan kaynak dosyayı içeren dizinin mutlak yoludur . Birincisi her zaman aynı olacaktır (dosyayı taşımazsanız); ikincisi, düğümü nasıl başlattığınıza ve değiştirip değiştirmediğinize bağlı olarak değişen süreç çapında bir parametredir .
josh3736

2
Yani __dirnameve arasında bir fark yok path.resolve(__dirname)mu?
georaldc

1
@georaldc: Birini buldum: düğüm <<< "yol = zorunlu ('yol'); console.log (__ dirname); console.log (path.resolve (__ dirname))"
Colin

8
Bunu söylemekten nefret ediyorum, ama bu cevap benim için gerçekten bir anlam ifade etmiyor ve bazı açıklamaları takdir ediyorum. path.resolve('/bar/bae', '/foo', 'test');İlk argümanı esasen ortadan kaldırdığına dikkat çekiyorsunuz çünkü /foo/test“sağdan sola oluşturulabilecek ilk mutlak yol”, ama nedenini açıklamadınız , bu yüzden işteki mantığı gerçekten anlamıyorum. Örnekte kullandığınız varsayımsal dizin yapısı hakkında herhangi bir görüşüm yok, bu yüzden neden /bar/bae/foo/testgeçersiz olduğunu anlayamıyorum .
temporary_user_name

3
@temporary_user_name Buradaki path.resolvedavranışı ile ilgili cevap doğrudur : path.resolveen sağdaki argümandan çalışır, soyadını argüman listesinde hareket ettirir ve her argümanın değerini mutlak bir yol (yani kök dizinden başlayarak /veya [özellikle Windows'da) ] bir sürücü harfi) oluşturulur ve ardından bu yolu döndürür. Görmezden gelir, /bar/baeçünkü o noktaya kadar, zaten mutlak yolu vardır /foo/testve bu nedenle daha ileri gitmek için hiçbir neden görmez.
Jamie Ridding

23
const absolutePath = path.join(__dirname, some, dir);

vs.

const absolutePath = path.resolve(__dirname, some, dir);

path.joinsıralamak olacak __dirnamedeğerleri ile birleştirilmiş akım dosyanın dizin adı olan someve dirplatforma özel ayırıcı ile.

Buna karşılık

path.resolveişleyecek __dirname, someve diryani sağ onu işleyerek bunu prepending sola.

bir kök yolun değerlerinden herhangi biri someveya dirbir kök yoluna karşılık gelirse, önceki yol atlanır ve kök olarak düşünülerek işlenir.

Kavramı daha iyi anlamak için hem biraz daha ayrıntılı olarak açıklayayım: -

path.joinVe path.resolveiki farklı yöntem veya nodejs tarafından sağlanan yol modülünün bir fonksiyonudur.

Her ikisi de bir yol listesini kabul eder, ancak fark sonuç olarak gelir, yani bu yolu nasıl işledikleri.

path.joinplatforma özgü ayırıcıyı bir sınırlayıcı olarak kullanarak verilen tüm yol parçalarını birleştirir, sonra ortaya çıkan yolu normalleştirir. Birlikte path.resolve()işlemi sağdan mutlak bir yol inşa kadar önüne sonraki her yolu ile sola doğru yolları dizisi.

Hiçbir argüman sağlanmadığında

Aşağıdaki örnek, her iki kavramı da açıkça anlamanıza yardımcı olacaktır: -

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

Sonuç

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

path.resolve()yöntemi, mutlak yolu çıktı olarak path.join()döndürür. hiçbir şey sağlanmamışsa geçerli çalışma dizinini temsil etme

Bazı kök yollar bağımsız değişken olarak iletildiğinde

const path=require('path');

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

Sonuç i

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

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


Soru özellikle path.join vs path.resolve __dirname ile ilgiliydi .
Estus Flask

Güncelleme için teşekkürler yorumlarınıza göre cevap güncelledim
samuelj90

3

için doc path.resolve:

Ortaya çıkan yol normalleştirilir ve yol kök dizine çözümlenmediği sürece sondaki eğik çizgiler kaldırılır.

Ama path.joinsonunda eğik çizgiler var

Yani

__dirname = '/';
path.join(__dirname, 'foo/'); // '/foo/'
path.resolve(__dirname, 'foo/'); // '/foo'

bu bağlamda 'normalleştirilmiş' kelimesinin anlamı nedir?
apollo

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.