Есть ли разница между следующими вызовами?
path.join(__dirname, 'app')
против.
path.resolve(__dirname, 'app')
Какой из них предпочтительнее?
Есть ли разница между следующими вызовами?
path.join(__dirname, 'app')
против.
path.resolve(__dirname, 'app')
Какой из них предпочтительнее?
Две функции относятся к сегментам, начинающимся с /
, по-разному; join
будет просто конкатенировать его с предыдущим аргументом, однако resolve
будет рассматривать это как корневую директорию и игнорировать все предыдущие пути - подумайте об этом как результат выполнения cd
с каждым аргументом:
path.join('/a', '/b') // Outputs '/a/b'
path.resolve('/a', '/b') // Outputs '/b'
Еще одно замечание: path.resolve
всегда будет иметь абсолютный URL-адрес и будет использовать ваш рабочий каталог в качестве базы для разрешения этого пути. Но поскольку __dirname
- абсолютный путь, в любом случае это не имеет значения.
В соответствии с тем, который вы должны использовать, ответ таков: это зависит от того, как вы хотите, чтобы сегменты, начинающиеся в /
, вели себя - должны ли они просто соединяться или должны действовать как новый корень?
Если другие аргументы жестко закодированы, это действительно не имеет значения, и в этом случае вам следует, вероятно, рассмотреть (а), как эта строка может измениться в будущем, и (б) насколько это согласовано с другими местами в коде.
⚠️ Как указано в комментариях, этот ответ неверен. См. Ответ NeonPaul ниже или этот ответ на аналогичный вопрос. Извините, что не заметил ранее.
path.join()
в значительной степени просто объединяет аргументы, которые вы передаете ему (используя правый разделитель, как правило, косую черту), тогда как path.resolve()
возвращает путь, как если бы вы последовательно переходили в каталоги (и разрешали фактическое местоположение файла/каталога).
Например:
path.join("a", "b1", "..", "b2") === "a/b1/../b2"
но
path.resolve("a", "b1", "..", "b2") === "a/b2"
В некоторых случаях эти 2 функции возвращают одно и то же значение. Я не знаю каких-либо различий в производительности, хотя я бы считал, что path.join
будет немного быстрее.
Операции с файловой системой по умолчанию меняются в зависимости от операционной системы, нам нужно что-то, что ее абстрагирует.
Модуль 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()
разрешает каждый аргумент с корнем и производит вывод.
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