Diferencia entre path.normalize y path.resolve en Node.js


86

¿Cuál es la diferencia (si la hay) entre path.normalize(your_path)y path.resolve(your_path)?

Sé que path.resolve(...)puedo aceptar múltiples argumentos, pero ¿el comportamiento con un solo argumento es lo mismo que llamar path.normalize()?

EDITAR: Si se supone que se comportan de la misma manera, no entiendo el propósito de exponer la path.normalize(...)función cuando simplemente puede pasar la ruta a path.resolve(...)O, tal vez, es para fines de documentación. Por ejemplo, dicen en la documentación para path.resolve(...):

... La ruta resultante se normaliza y ...

Exponer el path.normalize(...)hace que sea más fácil explicar qué significa "normalizado" ??? No se.

Respuestas:


182

path.normalizese deshace del extra ., ..etc. en el camino. path.resolveresuelve una ruta en una ruta absoluta. Ejemplo (mi directorio de trabajo actual era /Users/mtilley/src/testing):

> path.normalize('../../src/../src/node')
'../../src/node'
> path.resolve('../../src/../src/node')
'/Users/mtilley/src/node'

En otras palabras, path.normalizees "Cuál es el camino más corto que puedo tomar que me llevará al mismo lugar que la entrada", mientras que path.resolvees "Cuál es mi destino si tomo este camino".

Sin embargo, path.normalize()tenga en cuenta que es mucho más independiente del contexto que path.resolve(). Tenía path.normalize()sido al contexto de pendiente (es decir, si se hubiera tenido en cuenta el directorio de trabajo actual), el resultado en el ejemplo anterior hubiera sido ../node, porque eso es el más corto camino podría tomar de /Users/mtilley/src/testinga /Users/mtilley/src/node.

Irónicamente, esto significa que path.resolve()produce una ruta relativa en términos absolutos (podría ejecutarla en cualquier lugar y produciría el mismo resultado), mientras que path.normalize()produce una ruta absoluta en términos relativos (debe ejecutarla en la ruta relativa a la que desea calcular el resultado absoluto).


Agradable. ¡Gracias por la respuesta! Esto me ha estado molestando por un tiempo. Los documentos de Node, aunque suelen ser bastante agradables, me dejaron un poco desconcertado con este.
BMiner

14
También tenga en cuenta que path.normalize puede manejar cualquier ruta que desee normalizar y significa solo manipulación de cadenas de la ruta, mientras que path.resolve usará el sistema de archivos y el directorio actual para resolver la ruta a una ruta absoluta. Esto los hace comportarse de manera bastante diferente, ya que path.normalize podría usarse en una ruta dentro de un archivo tar, en un sistema de archivos remoto o en algo completamente abstracto.
Nakedible

¿En qué se diferencian de path.join?
Vijey

2

De los documentos:

Otra forma de pensar en resolve es como una secuencia de comandos cd en un shell.

Enlaces a path.resolve y path.normalize en la documentación. La mayoría de las veces no quiero solo proporcionar enlaces en una respuesta, pero los documentos de Node.js son muy decentes.


Supongo que no entiendo el propósito de exponer la función normalizar (...) cuando simplemente puede pasar la ruta a path.resolve (...)
BMiner

6
Es posible que la ruta que está normalizando no exista realmente en el sistema de archivos, por ejemplo, puede estar normalizando una ruta a un archivo que va a crear, o puede estar normalizando rutas de URL relativas.
Lanzz

En realidad, tampoco sé por qué usaría normalizar sobre resolver.
Pickels

1
normalizar no completa la ruta a una ruta absoluta. Por lo tanto, se puede usar para obtener una ruta sana para algunos recursos en relación con otro recurso, que se puede usar dentro de HTML para hacer referencia a un archivo elegido por el usuario, por ejemplo. Como la ruta normalizada es siempre simple (sin más ../), se puede verificar fácilmente para garantizar que el usuario solo elija archivos de ciertas ubicaciones y no tenga la posibilidad de ver archivos privados fuera de estas ubicaciones.
dronus
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.