В чем разница между path.join() и path.resolve()?

В чем разница между path.join() и path.resolve()?

5 апреля 2023 г.

Сколько раз вы сталкивались с path.join() и path.resolve() в проектах Node.js, но не понимали разницы между ними?

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

Содержание

  • Список важных терминов
  • Краткий обзор: как менять каталоги в терминале/приглашении
  • Что делает path.join()?
  • Что делает path.resolve()?
  • Основное отличие
  • Когда следует предпочесть одно другому?
  • Примеры использования

Список важных терминов

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

  1. Строка. Строка – это последовательность символов, интерпретируемых сценарием буквально (точно так, как она была написана), например, "это строка". Они должны быть заключены в кавычки, если их больше одного слова.

2. Путь. Путь — это просто строка, определяющая расположение файла или каталога на компьютере. , например, "/home/user/Documents/file.ext" или "/home/user/Downloads/". Я буду использовать здесь слово «файл» для обозначения как файлов, так и каталогов.

3. Относительный путь. Относительный путь — это строка, определяющая расположение файла относительно расположения другого файла.

Например, предположим, что у некоторого пользователя есть следующая структура каталогов:

Directory structure example

Если «Загрузки» являются текущим рабочим каталогом (CWD) и пользователь хочет получить доступ к файлу внутри каталога «Документы», ему придется перейти на один уровень вверх, а затем спуститься в каталог «Документы». Примерно так в POSIX-совместимых системах (Linux, MacOS и т. д.) cd ../Documents/file.ext или так в Windows cd ..Documentsfile.ext .

Примечание. В терминале или приглашении нам не нужно заключать строку в кавычки, если в именах файлов нет пробелов. Попытка выполнить cd ../Documents/my file.ext приведет к появлению сообщения об ошибке.

  1. Абсолютный путь. Упрощая, абсолютный путь – это строка, определяющая расположение файла относительно корня системы. Например, вместо того, чтобы пытаться получить доступ к файлу из предыдущего примера по относительному пути, пользователь мог бы указать абсолютный путь, подобный этому 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 — это просто строка абсолютного пути к местоположению файла.

  1. Нормализация пути. Как вы видели, существуют различия между строками, используемыми для указания пути в разных ОС. 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"));

Думаю, этого достаточно.

Если вы нашли эту статью полезной, поделитесь ею с друзьями.

Увидимся в следующий раз!


Оригинал