Path.join vs path.resolve с именем __dirname

Есть ли разница при использовании как path.join, так и path.resolve с __dirname для разрешения абсолютного пути в Node.js?

Если один из них предпочтительнее при использовании (абсолютные разрешения в пути 90% случаев использования)?

т.е.

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

против.

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

Оба метода нормализуют путь.

Это не дубликат этого вопроса, потому что принятый ответ неверен.

Ответ 1

Да, есть разница между функциями, но то, как вы их используете в этом случае, приведет к такому же результату.

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 тот же путь, следующий за __dirname. В таких случаях это действительно вопрос предпочтения.

Ответ 2

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 соответствует корневому пути, то предыдущий путь будет опущен и оставим процесс, рассматривая его как root

Чтобы лучше понять концепцию, позвольте мне объяснить немного более подробно:

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

Ответ 3

от doc для path.resolve:

Результирующий путь нормализуется, а конечные косые черты удаляются, если путь не разрешен в корневой каталог.

Но path.join сохраняет трейлинг-косые черты

Так

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