Різниця між path.resolve та path.join invocation?


Відповіді:


257

Дві функції стосуються сегментів, що починаються /дуже різними способами; joinпросто з'єднає його з попереднім аргументом, однак resolveбуде трактувати це як основний каталог та ігнорувати всі попередні шляхи - подумайте про це як результат виконання cdкожного аргументу:

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

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

Ще одне, що слід зазначити, це те path.resolve, що завжди призведе до абсолютної URL-адреси, і ваш робочий каталог використовуватиме як основу для вирішення цього шляху. Але як __dirnameце абсолютний шлях у будь-якому випадку, це не має значення у вашому випадку.

Щодо того, який з них ви повинні використовувати, відповідь така: залежить від того, як ви хочете, щоб сегменти починали /вести себе - чи просто їх слід з'єднати чи вони повинні діяти як новий корінь?

Якщо інші аргументи важко закодовані, це насправді не має значення, і в цьому випадку ви, мабуть, повинні подумати (а) про те, як цей рядок може змінитися в майбутньому, і (б) наскільки він узгоджується з іншими місцями коду.


65
Якщо ви все одно цього не отримаєте: path.join('/a', '/b', 'c')повернетесь /a/b/c, тоді як path.resolve('/a', '/b', 'c')повернетесь /b/c.
— totymedli

29
Я б сказав, що назва resolveне є найбільш зрозумілим, path.cd([starting dir], [final dir])було б набагато інтуїтивнішим.
— Жоао Піментел Феррейра

20
think of it as the result of executing cd with each argumentМене , нарешті , зрозуміти його. Спасибі
— Андре Пена

@ JoãoPimentelFerreira, я оновив відповідь вище, як ви зробили дійсну точку. :)
— Rin Minase

так path.resolve => вирішити шлях, розглядаючи робочий каталог як вихідну точку шляху?
— Веб-жінка

15

Операції шляху файлової системи за замовчуванням залежать від операційної системи, нам потрібна річ, яка її абстрагує. pathМодуль надає утиліти або API для роботи з файлами і каталогами шляхами. ви можете включити його у свій проект, використовуючи

const path = require('path');

Два path.joinта path.resolveрізні методи модуля шляху.

Обидва ці способи приймають послідовність шляхів або сегментів шляху.

path.resolve()Метод вирішує послідовність шляхів або сегментів шляху в абсолютний шлях .

path.join()Метод об'єднує всі задані відрізки шляху разом з допомогою конкретної платформи роздільник в якості роздільника, а потім нормалізує вийшов шлях.

Щоб краще зрозуміти та диференціювати поведінку, дозвольте мені пояснити це за різними сценаріями.

1. Якщо ми не надаємо жодних аргументів або порожній рядок

у моєму випадку моє ім’я файлу - 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 of the node process

а на запущений результат такий, як показано нижче

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

Висновок з вищевказаного експерименту path.resolve()методом буде виводити абсолютний шлях, де як path.join()повертається. що представляє поточний робочий каталог або відносний шлях, якщо нічого не передбачено

2. Додавання / шляху в якості будь-якого аргументу.

const path=require('path');

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

і результат є

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

Висновок, який ми можемо знайти за допомогою цього експерименту, полягає в тому, що path.join()лише об'єднує список вхідних даних з певним роздільником, в той час як path.resolve()обробляє послідовність шляхів справа наліво, при цьому кожен наступний шлях є попереднім, поки не буде побудований абсолютний шлях.

path.join()з'єднує кожен аргумент із специфічними роздільниками ОС, в той час як path.resolve()кожний аргумент буде вирішений з коренем і дасть вихід.


path.resolve()це не еквівалентне в __dirname. Перший повертає робочий каталог, а другий - шлях до поточного файлу.
— Еміль Бержерон

@EmileBergeron Наскільки я розумію, вони обидві функції на шляху. Ви можете спробувати наступний фрагмент, щоб перевірити, чи обидва вони однакові, я думаю. const path = require('path'); console.log(path.resolve()) console.log(__dirname) console.log(path.resolve()===__dirname)
— samuelj90

Вони однакові лише тоді, коли запущений файл знаходиться в поточному робочому каталозі.
— Еміль Бержерон

@EmileBergeron Добре, що я згоден. Але я все ще плутаю те, де я вказавpath.resolve() is equivalent to __dirname
— samuelj90

1
@EmileBergeron Я оновив коментар, я думаю, це вирішить
— плутанину

14

1) path.resolve створює абсолютний шлях.

Метод створює абсолютний шлях справа наліво, поки не побудований абсолютний шлях.

Наприклад:

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

Якщо абсолютний шлях не генерується, метод використовує поточний робочий каталог:

Наприклад:

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

2) path.join приєднується до всього шляху і нормалізує результат

Наприклад:

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
Останній приклад з'єднання path.join('a','b','c')повинен призвести до a\b\c.
— spmdc
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.