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


192

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

path.join(__dirname, 'app')

против

path.resolve(__dirname, 'app')

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


Этот вопрос обсуждается на мета
Нино Филиу

Ответы:


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.
Тотимедли

29
Я бы сказал, что имя resolveне самое понятное, path.cd([starting dir], [final dir])было бы гораздо более интуитивно понятным.
Жоао Пиментел Феррейра

20
Это think of it as the result of executing cd with each argumentзаставило меня наконец понять это. Спасибо
Андре Пена

@ JoãoPimentelFerreira, я обновил ответ выше, так как вы сделали правильное замечание. :)
Рин Минасэ

так 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 Я обновил комментарий, я думаю, что он разрешит путаницу
samuelj90

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.