Différence entre path.normalize et path.resolve dans Node.js

86

Quelle est la différence (le cas échéant) entre path.normalize(your_path)et path.resolve(your_path)?

Je sais que je path.resolve(...)peux accepter plusieurs arguments, mais le comportement avec un seul argument est-il le même que celui d'appeler path.normalize()?

EDIT: S'ils sont censés se comporter de la même manière, je ne comprends pas le but d'exposer la path.normalize(...)fonction lorsque vous pouvez simplement passer le chemin dans path.resolve(...)Ou, peut-être, c'est à des fins de documentation. Par exemple, ils disent dans la documentation pour path.resolve(...):

... Le chemin résultant est normalisé, et ...

Exposer le path.normalize(...)permet d'expliquer plus facilement ce que signifie «normalisé» ??? Je ne sais pas.

BMiner
la source

Réponses:

182

path.normalizese débarrasse de l'extra ., ..etc. dans le chemin. path.resolverésout un chemin en un chemin absolu. Exemple (mon répertoire de travail actuel était /Users/mtilley/src/testing):

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

En d'autres termes, path.normalizeest "Quel est le chemin le plus court que je puisse emprunter qui me mènera au même endroit que l'entrée", alors que path.resolve"Quelle est ma destination si je prends ce chemin."

Notez cependant que path.normalize()c'est beaucoup plus indépendant du contexte que path.resolve(). Avait path.normalize()été context- de pendants ( par exemple , si elle avait pris en considération le répertoire de travail courant), le résultat dans l'exemple ci - dessus aurait été ../node, parce que c'est un chemin le plus court pourrait prendre de /Users/mtilley/src/testingla /Users/mtilley/src/node.

Ironiquement, cela signifie que path.resolve()produit un chemin relatif en termes absolus (vous pouvez l'exécuter n'importe où, et cela produirait le même résultat), alors que path.normalize()produit un chemin absolu en termes relatifs (vous devez l'exécuter dans le chemin relatif auquel vous voulez calculer le résultat absolu).

Michelle Tilley
la source
Agréable. Merci d'avoir répondu! Cela me dérange depuis un moment. Les documents Node, bien qu'ils soient généralement assez sympas, m'ont laissé un peu perplexe sur celui-ci.
BMiner
14
Notez également que path.normalize peut gérer tous les chemins que vous souhaitez normaliser et signifie uniquement une manipulation de chaîne du chemin, tandis que path.resolve utilisera le système de fichiers et le répertoire courant pour résoudre le chemin vers un chemin absolu. Cela les fait se comporter très différemment car path.normalize peut être utilisé sur un chemin à l'intérieur d'un fichier tar, sur un système de fichiers distant ou sur quelque chose de totalement abstrait.
Nakedible
En quoi sont-ils différents de path.join?
Vijey
2

À partir de la documentation:

Une autre façon de penser à la résolution est une séquence de commandes cd dans un shell.

Liens vers path.resolve et path.normalize dans la documentation. Je ne veux surtout pas simplement fournir des liens dans une réponse, mais les documents Node.js sont très décents.

Pickels
la source
Je suppose que je ne comprends pas le but d'exposer la fonction normaliser (...) lorsque vous pouvez simplement passer le chemin dans path.resolve (...)
BMiner
6
Le chemin que vous normalisez peut ne pas exister réellement dans le système de fichiers, par exemple vous pouvez normaliser un chemin vers un fichier que vous allez créer, ou vous pouvez normaliser des chemins URL relatifs.
lanzz
En fait, je ne sais pas non plus pourquoi vous utiliseriez la normalisation plutôt que la résolution.
Pickels
1
normaliser ne termine pas le chemin vers un chemin absolu. Il peut donc être utilisé pour obtenir un chemin sain pour certaines ressources par rapport à une autre ressource, qui peut être utilisé à l'intérieur du HTML pour référencer un fichier choisi par l'utilisateur par exemple. Comme le chemin normalisé est toujours simple (sans supplément ../), il peut être facilement vérifié pour s'assurer que l'utilisateur ne choisit que les fichiers de certains emplacements et n'a aucune chance de voir les fichiers privés en dehors de ces emplacements.
dronus