В чем разница между path.join() и path.resolve()?
5 апреля 2023 г.Сколько раз вы сталкивались с path.join()
и path.resolve()
в проектах Node.js, но не понимали разницы между ними?
По моему собственному опыту, я видел разные проекты с одинаковой структурой, использующие один над другим, и я не мог понять, почему. Узнав о недостатке знаний, я решил провести расследование и поделиться своими знаниями с вами.
Содержание
- Список важных терминов
- Краткий обзор: как менять каталоги в терминале/приглашении
- Что делает path.join()?
- Что делает path.resolve()?
- Основное отличие
- Когда следует предпочесть одно другому?
- Примеры использования
Список важных терминов
Я полагаю, что как только вы поймете термины, перечисленные ниже, вам будет легче понять различия между двумя методами.
- Строка. Строка – это последовательность символов, интерпретируемых сценарием буквально (точно так, как она была написана), например,
"это строка"
. Они должны быть заключены в кавычки, если их больше одного слова.
2. Путь. Путь — это просто строка, определяющая расположение файла или каталога на компьютере. , например, "/home/user/Documents/file.ext"
или "/home/user/Downloads/"
. Я буду использовать здесь слово «файл» для обозначения как файлов, так и каталогов.
3. Относительный путь. Относительный путь — это строка, определяющая расположение файла относительно расположения другого файла.
Например, предположим, что у некоторого пользователя есть следующая структура каталогов:
Если «Загрузки» являются текущим рабочим каталогом (CWD) и пользователь хочет получить доступ к файлу внутри каталога «Документы», ему придется перейти на один уровень вверх, а затем спуститься в каталог «Документы». Примерно так в POSIX-совместимых системах (Linux, MacOS и т. д.) cd ../Documents/file.ext
или так в Windows cd ..Documentsfile.ext
.
Примечание. В терминале или приглашении нам не нужно заключать строку в кавычки, если в именах файлов нет пробелов. Попытка выполнить cd ../Documents/my file.ext
приведет к появлению сообщения об ошибке.
- Абсолютный путь. Упрощая, абсолютный путь – это строка, определяющая расположение файла относительно корня системы. Например, вместо того, чтобы пытаться получить доступ к файлу из предыдущего примера по относительному пути, пользователь мог бы указать абсолютный путь, подобный этому
cd /home/user/Documents/file.ext
. Мы можем указать абсолютный путь из любого места.
5. Сегмент пути. Сегмент пути — это фрагмент пути. Например, у нас есть /home
, /user
и /Documents
как сегменты /home/user/Documents/file.ext. код>.
6. __dirname: это переменная среды Node.js, которая указывает абсолютный путь для каталога, содержащего исполняемый в данный момент файл. .
Например, если у вас есть webpack.config.js:
console.log(__dirname)
Ожидаемый вывод на консоли будет
/home/user/Documents/project
Если webpack.config.js находится внутри каталога project
.
Другими словами, __dirname — это просто строка абсолютного пути к местоположению файла.
- Нормализация пути. Как вы видели, существуют различия между строками, используемыми для указания пути в разных ОС. Windows использует
, в то время как POSIX-совместимые ОС используют
/
в качестве разделителя каталогов, например. Нормализация пути происходит, когда строка изменяется таким образом, чтобы она соответствовала допустимому пути в целевой операционной системе. Если вы хотите узнать больше о шагах, необходимых для нормализации пути, см. https: //learn.microsoft.com/en-us/dotnet/standard/io/file-path-formats.
Краткий обзор — как менять каталоги в терминале/приглашении
.
и./
представляют CWD;..
и../
представляют родителя CWD;/
представляет корневой каталог
Если поставить перед ними cd
, они перенесут вас в нужное место.
Я сказал, что это будет кратко 😂
Что делает path.join()?
<цитата>Метод path.join()
объединяет все заданные сегменты path
вместе, используя разделитель для конкретной платформы в качестве разделителя, а затем нормализует полученный путь.
Синтаксис довольно прост: path.join(…paths)
, где …paths
— это последовательность сегментов.
Например, вызов path.join("path", "/to", "some", "file")
возвращает следующую строку path/to/some/file< /code> в POSIX-совместимой системе.
Если вы не понимаете, что означает …
, взгляните на https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax.
Что делает path.resolve()?
<цитата>Метод path.resolve()
преобразует последовательность путей или сегментов пути в абсолютный путь.
Почти идентичный синтаксис: path.resolve(…paths)
. Этот метод обрабатывает пути справа налево и, когда находит /
, рассматривает его как корень системы.
Например, вызов path.resolve(__dirname, "/path")
вернет /path
, так как второй аргумент имеет начальный /
и таким образом, будет рассматриваться как корень системы.
Ключевое отличие
path.join()
просто объединяет сегменты, и его возврат может или не может привести к абсолютному пути. path.resolve()
всегда возвращает абсолютный путь, используя корень целевой операционной системы в качестве корня или первого аргумента с начальным /
в качестве новый корень.
Когда следует предпочесть одно другому?
Это зависит. Требует ли ваш инструмент абсолютный путь? Затем используйте path.resolve()
. Вам нужно только конкатенировать сегменты путей? Используйте path.join()
.
На практике я не могу припомнить, чтобы path.join()
или path.resolve()
использовались без __dirname
, что делает оба метода приводит к абсолютному пути с корнем ОС, являющимся корнем.
Опять же, вызов path.resolve(__dirname, "/path")
не имеет смысла, так как __dirname
будет полностью проигнорирован, поскольку второй аргумент начинается с / код>. Ниже приведен допустимый вариант использования:
path.resolve(__dirname, 'dist/assets')
.
Примеры использования
console.log(path.join(__dirname, "path"));
console.log(path.join(__dirname, "/path"));
console.log(path.join(__dirname, "./path"));
console.log(path.join(__dirname, "../path"));
console.log(path.resolve(__dirname, "path"));
console.log(path.resolve(__dirname, "/path"));
console.log(path.resolve(__dirname, "./path"));
console.log(path.resolve(__dirname, "../path"));
Output:
// path.join()
/home/user/some/other/segments/path
/home/user/some/other/segments/path
/home/user/some/other/segments/path
/home/user/some/other/path
//path.resolve()
/home/user/some/other/segments/path
/path
/home/user/some/other/segments/path
/home/user/some/other/path
Как видите, если вам нужен абсолютный путь к текущему исполняемому файлу, вы можете выбрать любой из следующих вариантов:
console.log(path.join(__dirname, "path"));
console.log(path.join(__dirname, "/path"));
console.log(path.join(__dirname, "./path"));
console.log(path.resolve(__dirname, "path"));
console.log(path.resolve(__dirname, "./path"));
Думаю, этого достаточно.
Если вы нашли эту статью полезной, поделитесь ею с друзьями.
Увидимся в следующий раз!
Оригинал