path.join vs path.resolve con __dirname


142

¿Hay alguna diferencia al usar ambos path.join y path.resolvecon __dirnamepara resolver la ruta absoluta en Node.js?

¿Debería preferirse uno de ellos cuando se usa así (las resoluciones de ruta absolutas son el 90% de los casos de uso)?

Es decir

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

vs.

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

Ambos métodos normalizan el camino.

Esto no es un duplicado de esta pregunta porque la respuesta aceptada es incorrecta.


Esta pregunta se está discutiendo en meta
— Nino Filiu

Respuestas:


152

Sí, hay una diferencia entre las funciones, pero la forma en que las está utilizando en este caso dará como resultado el mismo resultado.

path.joindevuelve una ruta normalizada fusionando dos rutas juntas. Puede devolver un camino absoluto, pero no siempre lo hace necesariamente.

Por ejemplo:

path.join('app/libs/oauth', '/../ssl')

resuelve a app/libs/ssl

path.resolve, por otro lado, se resolverá en una ruta absoluta.

Por ejemplo, cuando ejecutas:

path.resolve('bar', '/foo');

La ruta devuelta será /fooya que es la primera ruta absoluta que se puede construir.

Sin embargo, si corres:

path.resolve('/bar/bae', '/foo', 'test');

La ruta devuelta será /foo/testnuevamente porque esa es la primera ruta absoluta que se puede formar de derecha a izquierda.

Si no proporciona una ruta que especifique el directorio raíz, las rutas dadas a la resolvefunción se agregan al directorio de trabajo actual. Entonces, si su directorio de trabajo era /home/mark/project/:

path.resolve('test', 'directory', '../back');

resuelve a

/home/mark/project/test/back

El uso __dirnamees la ruta absoluta al directorio que contiene el archivo fuente. Cuando lo uses path.resolveo path.jointe devolverán el mismo resultado si le das la misma ruta a continuación __dirname. En tales casos, es realmente solo una cuestión de preferencia.


25
Nit: __dirnamees la ruta absoluta al directorio que contiene el archivo fuente que se está ejecutando, no el directorio de trabajo actual . El primero siempre será el mismo (a menos que mueva el archivo); este último es un parámetro de todo el proceso que varía en función de cómo lanzó el nodo y si lo ha cambiado o no .
— josh3736

2
Entonces, ¿no hay diferencia entre __dirnamey path.resolve(__dirname)?
— georaldc

1
@georaldc: Encontré uno: nodo <<< "ruta = require ('ruta'); console.log (__ dirname); console.log (path.resolve (__ dirname))"
— Colin

8
Odio decirlo, pero esta respuesta realmente no tiene ningún sentido para mí y agradecería alguna aclaración. Usted observa que path.resolve('/bar/bae', '/foo', 'test');esencialmente descarta el primer argumento porque /foo/test"es el primer camino absoluto que se puede formar de derecha a izquierda", pero no explicó por qué , así que realmente no entiendo la lógica en el trabajo. Quiero decir que no tengo ninguna vista de la hipotética estructura de directorios que está usando en su ejemplo, así que no puedo concebir por qué /bar/bae/foo/testno es válida.
— temporary_user_name

3
@temporary_user_name La respuesta es correcta con respecto path.resolveal comportamiento de aquí: path.resolveopera desde el argumento más a la derecha, moviéndose hacia la izquierda a través de la lista de argumentos y anteponiendo el valor de cada argumento hasta una ruta absoluta (es decir, una que comienza con el directorio raíz /o [en Windows específicamente ] se construye una letra de unidad), luego devuelve esa ruta. Ignora /bar/baeporque en ese punto, ya tiene el camino absoluto /foo/testy, por lo tanto, no ve ninguna razón para ir más allá.
— Jamie Ridding

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

vs.

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

path.joinse concatenará, __dirnameque es el nombre del directorio del archivo actual concatenado con valores de somey dircon un separador específico de la plataforma.

Donde como

path.resolveprocesará __dirname, somey dires decir, de derecha a izquierda, precediéndola procesándola.

si alguno de los valores de someo dircorresponde a una ruta raíz, se omitirá la ruta anterior y el proceso se considerará como raíz

Para comprender mejor el concepto, permítanme explicarles un poco más detalladamente de la siguiente manera:

Los path.joiny path.resolveson dos métodos o funciones diferentes del módulo de ruta proporcionado por nodejs.

Donde ambos aceptan una lista de ruta pero la diferencia viene en el resultado, es decir, cómo procesan esta ruta.

path.joinconcatena todos los segmentos de ruta dados juntos usando el separador específico de la plataforma como delimitador, luego normaliza la ruta resultante. Mientras se path.resolve()procesa la secuencia de rutas de derecha a izquierda, se antepone cada ruta posterior hasta que se construye una ruta absoluta.

Cuando no hay argumentos suministrados

El siguiente ejemplo lo ayudará a comprender claramente ambos conceptos: -

Mi nombre de archivo es index.jsy el directorio de trabajo actual esE:\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

Resultado

λ node index.js
path.join() :  .
path.resolve() :  E:\MyFolder\Pjtz\node

path.resolve()El método generará la ruta absoluta donde se path.join()devuelve. representando el directorio de trabajo actual si no se proporciona nada

Cuando se pasa alguna ruta raíz como argumentos

const path=require('path');

console.log("path.join() : " ,path.join('abc','/bcd'));
console.log("path.resolve() : ",path.resolve('abc','/bcd'));

Resultado i

λ node index.js
path.join() :  abc\bcd
path.resolve() :  E:\bcd

path.join()solo concatena la lista de entrada con un separador específico de la plataforma mientras path.resolve()procesa la secuencia de rutas de derecha a izquierda, con cada ruta posterior antepuesta hasta que se construya una ruta absoluta.


La pregunta era específicamente sobre path.join vs path.resolve con __dirname .
— Estus Flas

Había actualizado la respuesta en función de sus comentarios gracias por la actualización
— samuelj90

3

del documento para path.resolve:

La ruta resultante se normaliza y se eliminan las barras diagonales finales a menos que la ruta se resuelva en el directorio raíz.

Pero path.joinsigue tajando

Entonces

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

¿Qué significa la palabra 'normalizado' en este contexto?
— Apolo

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.