Разница между path.resolve и вызовом path.join?

Есть ли разница между следующими вызовами?

path.join(__dirname, 'app')

против.

path.resolve(__dirname, 'app')

Какой из них предпочтительнее?

Ответ 1

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

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

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

Еще одно замечание: path.resolve всегда будет иметь абсолютный URL-адрес и будет использовать ваш рабочий каталог в качестве базы для разрешения этого пути. Но поскольку __dirname - абсолютный путь, в любом случае это не имеет значения.

В соответствии с тем, который вы должны использовать, ответ таков: это зависит от того, как вы хотите, чтобы сегменты, начинающиеся в /, вели себя - должны ли они просто соединяться или должны действовать как новый корень?

Если другие аргументы жестко закодированы, это действительно не имеет значения, и в этом случае вам следует, вероятно, рассмотреть (а), как эта строка может измениться в будущем, и (б) насколько это согласовано с другими местами в коде.

Ответ 2


⚠️ Как указано в комментариях, этот ответ неверен. См. Ответ NeonPaul ниже или этот ответ на аналогичный вопрос. Извините, что не заметил ранее.


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

Например:

path.join("a", "b1", "..", "b2") === "a/b1/../b2"

но

path.resolve("a", "b1", "..", "b2") === "a/b2"

В некоторых случаях эти 2 функции возвращают одно и то же значение. Я не знаю каких-либо различий в производительности, хотя я бы считал, что path.join будет немного быстрее.

Ответ 3

Операции с файловой системой по умолчанию меняются в зависимости от операционной системы, нам нужно что-то, что ее абстрагирует. Модуль 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

а результат выполнения - ниже

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

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

2. Добавление /path как любой из аргументов.

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() разрешает каждый аргумент с корнем и производит вывод.

Ответ 4

1) path.resolve создает абсолютный путь.

Метод создает путь absoulte справа налево, пока не будет создан абсолютный путь.

Например:

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