path.join vs path.resolve con __dirname

¿Hay alguna diferencia al usar tanto path.join como path.resolve con __dirname para resolver la ruta absoluta en Node.js?

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

Es decir

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

contra

 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.

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.join devuelve una ruta normalizada al combinar dos rutas juntas. Puede devolver una ruta absoluta, pero no siempre lo hace necesariamente.

Por ejemplo:

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

se resuelve en app/libs/ssl

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

Por ejemplo, cuando ejecuta:

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

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

Sin embargo, si ejecuta:

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

La ruta devuelta será /foo/test nuevamente porque es la primera ruta absoluta que puede formarse de derecha a izquierda.

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

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

resuelve a

/home/mark/project/test/back

El uso de __dirname da una ruta absoluta a su directorio de trabajo actual. Cuando uses path.resolve o path.join , devolverán el mismo resultado si das la misma ruta después de __dirname . En tales casos es realmente una cuestión de preferencia.

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

contra

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

path.join concatenará __dirname que es el nombre de directorio del archivo actual concatenado con los valores de some y dir con separador específico de la plataforma.

Donde como

path.resolve procesará __dirname , some y dir es decir, de izquierda a derecha prependiéndolo procesándolo.

Si alguno de los valores de some o dir corresponde a una ruta raíz, se omitirá la ruta anterior y el rest del proceso se considerará como raíz.

Para entender mejor el concepto, permítanme explicar un poco más detalladamente a continuación:

path.join y path.resolve son dos métodos o funciones diferentes del módulo de ruta proporcionado por nodejs.

Cuando ambos aceptan una lista de rutas pero la diferencia está en el resultado, es decir, cómo procesan estas rutas.

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

Cuando no se proporcionan argumentos

El siguiente ejemplo le ayudará a entender claramente ambos conceptos:

Mi nombre de archivo es index.js y el directorio de trabajo actual es 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 

Resultado

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

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

Cuando alguna ruta raíz se pasa 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 el separador específico de la plataforma mientras que path.resolve() procesa la secuencia de rutas de derecha a izquierda, con cada ruta subsiguiente precedida hasta que se construye una ruta absoluta.