path.join vs path.resolve __dirname के साथ


142

वहाँ एक अंतर का उपयोग करते समय है दोनों path.join और path.resolveके साथ __dirnameNode.js में निरपेक्ष पथ हल करने के लिए?

जब उनमें से एक का उपयोग किया जा रहा है तो उनमें से एक को प्राथमिकता दी जानी चाहिए (निरपेक्ष पथ संकल्प 90% उपयोग के मामले हैं)?

अर्थात

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

बनाम

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

दोनों ही तरीके सामान्य करते हैं।

यह इस प्रश्न का दोहराव नहीं है क्योंकि स्वीकृत उत्तर गलत है।


इस सवाल पर मेटा
Nino Filiu

क्या इससे आपके सवाल का जवाब मिलता है? Path.resolve और path.join आह्वान के बीच अंतर?
user5532169

जवाबों:


152

हां कार्यों के बीच अंतर है लेकिन आप जिस तरह से इस मामले में उनका उपयोग कर रहे हैं, उसी परिणाम में परिणाम होगा।

path.joinदो रास्तों को एक साथ मर्ज करके एक सामान्यीकृत पथ देता है। यह एक निरपेक्ष पथ पर लौट सकता है, लेकिन यह हमेशा ऐसा नहीं करता है।

उदाहरण के लिए:

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

को हल करता है app/libs/ssl

path.resolveदूसरी ओर, एक निरपेक्ष मार्ग का समाधान करेगा।

उदाहरण के लिए, जब आप दौड़ते हैं:

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

लौटाया हुआ मार्ग /fooतब से होगा जब तक कि पूर्ण निरपेक्ष पथ का निर्माण किया जा सकता है।

हालाँकि, यदि आप चलाते हैं:

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

वापस किया /foo/testगया मार्ग फिर से होगा क्योंकि यह पहला पूर्ण पथ है जो दाएं से बाएं की ओर बन सकता है।

यदि आप एक पथ प्रदान नहीं करते हैं जो रूट निर्देशिका को निर्दिष्ट करता है तो resolveफ़ंक्शन को दिए गए पथ वर्तमान कार्यशील निर्देशिका में संलग्न होते हैं। तो अगर आपकी वर्किंग डायरेक्टरी थी /home/mark/project/:

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

को हल करता है

/home/mark/project/test/back

__dirnameस्रोत फ़ाइल युक्त निर्देशिका के लिए निरपेक्ष पथ का उपयोग करना है। जब आप उपयोग करते हैं path.resolveया path.joinवे उसी परिणाम को वापस करेंगे यदि आप उसी मार्ग का अनुसरण करते हैं __dirname। ऐसे मामलों में यह वास्तव में वरीयता का मामला है।


25
Nit: __dirnameनिर्देशिका का पूर्ण पथ है जिसमें स्रोत फ़ाइल है जिसे निष्पादित किया जा रहा है, न कि वर्तमान कार्यशील निर्देशिका । पूर्व हमेशा एक जैसा रहेगा (जब तक आप फ़ाइल को स्थानांतरित नहीं करते); उत्तरार्द्ध एक प्रक्रिया-व्यापी पैरामीटर है, जो इस बात के आधार पर भिन्न होता है कि आपने नोड कैसे लॉन्च किया है और आपने इसे बदला है या नहीं ।
josh3736

2
तो वहाँ कोई अंतर नहीं है __dirnameऔर path.resolve(__dirname)?
18

1
@georaldc: मैंने एक: नोड <<< "पाथ = आवश्यकता ('पथ'); कंसोल.लॉग (__ dirname); कंसोल.लॉग (path.resolve (__ dirname))"
कॉलिन

8
मुझे यह कहने से नफरत है, लेकिन यह जवाब वास्तव में मेरे लिए कोई मायने नहीं रखता है और मैं कुछ स्पष्टीकरण की सराहना करूंगा। आप टिप्पणी करते हैं कि path.resolve('/bar/bae', '/foo', 'test');अनिवार्य रूप से पहला तर्क छोड़ देता है क्योंकि /foo/test"पहला निरपेक्ष मार्ग है जिसे दाएं से बाएं बनाया जा सकता है," लेकिन आपने यह नहीं बताया कि क्यों , इसलिए मुझे वास्तव में काम में तर्क समझ में नहीं आता है। मेरा मतलब है कि आपके उदाहरण में आपके द्वारा उपयोग की जा रही काल्पनिक निर्देशिका संरचना में मेरा कोई विचार नहीं है, इसलिए मैं यह नहीं सोच सकता कि /bar/bae/foo/testअमान्य क्यों है।
temporary_user_name

3
@temporary_user_name इसका उत्तर path.resolveयहां के व्यवहार के बारे में सही है: path.resolveदाएं-सबसे तर्क से संचालित होता है, तर्क सूची के माध्यम से बाएं-वार्ड को आगे बढ़ाता है और प्रत्येक तर्क के मूल्य को निरपेक्ष पथ (यानी रूट डायरेक्टरी /या विशेष रूप से विंडोज के साथ एक शुरुआत तक) को रोक देता है ] एक ड्राइव लेटर) का निर्माण किया जाता है, फिर उस रास्ते को लौटाता है। यह नजरअंदाज करता है /bar/baeक्योंकि उस बिंदु से, यह पहले से ही पूर्ण पथ है /foo/testऔर इसलिए आगे जाने का कोई कारण नहीं देखता है।
जेमी रिडिंग

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

बनाम

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

path.joinको सम्‍मिलित करेगा __dirnameजो कि वर्तमान फ़ाइल का निर्देशिका नाम है जिसे प्लेटफ़ॉर्म विशिष्ट विभाजक के मान के साथ someऔर उसके dirसाथ समाहित किया गया है।

जहाँ तक

path.resolveप्रक्रिया करेगा __dirname, someऔर dirयानी दाएं से बाएं इसे संसाधित करके इसे प्रस्तुत करेगा।

यदि कोई भी मान someया dirकिसी रूट पथ से मेल खाता है, तो पिछले पथ को छोड़ दिया जाएगा और इसे रूट मानकर बाकी प्रक्रिया करें

इस अवधारणा को बेहतर ढंग से समझने के लिए मुझे दोनों को थोड़ा और विस्तृत रूप से समझाना चाहिए: -

path.joinऔर path.resolveदो अलग अलग तरीकों या पथ मॉड्यूल के कार्यों NodeJS द्वारा प्रदान कर रहे हैं।

जहाँ दोनों पथ की एक सूची को स्वीकार करते हैं लेकिन परिणाम में अंतर आता है अर्थात वे इन पथों को कैसे संसाधित करते हैं।

path.joinमंच विशिष्ट विभाजक को एक सीमांकक के रूप में उपयोग करके सभी दिए गए पथ खंडों को एक साथ मिलाता है, फिर परिणामी पथ को सामान्य करता है। इस path.resolve()प्रक्रिया के दौरान दाएं से बाएं रास्ते के अनुक्रम की प्रक्रिया होती है, जब तक कि बाद में एक निरपेक्ष पथ का निर्माण नहीं हो जाता।

जब कोई तर्क नहीं दिया गया

निम्नलिखित उदाहरण आपको दोनों अवधारणाओं को स्पष्ट रूप से समझने में मदद करेंगे: -

मेरा फ़ाइल नाम है index.jsऔर वर्तमान कार्यशील निर्देशिका हैE:\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

परिणाम

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

path.resolve()विधि निरपेक्ष पथ का उत्पादन करेगी जहां path.join()रिटर्न के रूप में । यदि कुछ भी नहीं दिया गया है तो वर्तमान कार्य निर्देशिका का प्रतिनिधित्व करना

जब कुछ मूल मार्ग को तर्क के रूप में पारित किया जाता है

const path=require('path');

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

परिणाम I

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

path.join()केवल प्लेटफ़ॉर्म विशिष्ट विभाजक के साथ इनपुट सूची को सम्‍मिलित करता है जबकि path.resolve()प्रक्रिया दायें से बाएँ तक के पथ के अनुक्रम के साथ होती है, जब तक कि कोई निरपेक्ष पथ का निर्माण नहीं हो जाता।


सवाल विशेष रूप से path.join vs path.resolve के साथ __dirname के बारे में था ।
एस्टुस फ्लास्क

मैंने अपडेट के लिए आपकी टिप्पणियों के आधार पर उत्तर अपडेट किया था
samuelj90

3

के लिए डॉक्टर से path.resolve:

परिणामस्वरूप पथ को सामान्य किया जाता है और अनुगामी स्लैश को हटा दिया जाता है जब तक कि पथ को रूट निर्देशिका में हल नहीं किया जाता है।

लेकिन path.joinटालमटोल करता रहता है

इसलिए

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

इस संदर्भ में 'सामान्यीकृत' शब्द का क्या अर्थ है?
अपोलो

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.