Differenza tra path.normalize e path.resolve in Node.js


86

Qual è la differenza (se presente) tra path.normalize(your_path)e path.resolve(your_path)?

So di path.resolve(...)poter accettare più argomenti, ma il comportamento con un singolo argomento è lo stesso della chiamata path.normalize()?

EDIT: Se si suppone che si comportino allo stesso modo, non capisco lo scopo di esporre la path.normalize(...)funzione quando puoi semplicemente passare il percorso in path.resolve(...)O, forse, è per scopi di documentazione. Ad esempio, dicono nella documentazione per path.resolve(...):

... Il percorso risultante è normalizzato e ...

Esporre il path.normalize(...)rende più facile spiegare cosa significa "normalizzato" ??? Non so.

Risposte:


182

path.normalizesi libera di extra ., ..ecc nel percorso. path.resolverisolve un percorso in un percorso assoluto. Esempio (la mia directory di lavoro corrente era /Users/mtilley/src/testing):

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

In altre parole, path.normalizeè "Qual è il percorso più breve che posso prendere che mi porterà nello stesso posto dell'input", mentre path.resolveè "Qual è la mia destinazione se prendo questo percorso".

Si noti tuttavia che path.normalize()è molto più indipendente dal contesto di path.resolve(). Aveva path.normalize()stato al contesto de pendente (cioè se fosse preso in considerazione la directory di lavoro corrente), il risultato nell'esempio di cui sopra sarebbe stato ../node, perché questo è il percorso più breve si poteva prendere da /Users/mtilley/src/testinga /Users/mtilley/src/node.

Ironia della sorte, questo significa che path.resolve()produce un percorso relativo in termini assoluti (potresti eseguirlo ovunque, e produrrebbe lo stesso risultato), mentre path.normalize()produce un percorso assoluto in termini relativi (devi eseguirlo nel percorso relativo a cui vuoi calcolare il risultato assoluto).


Bello. Grazie per la risposta! Questo mi ha infastidito per un po '. I documenti di Node, sebbene siano tipicamente piuttosto carini, mi hanno lasciato un po 'perplesso su questo.
BMiner

14
Nota anche che path.normalize può gestire tutti i percorsi che potresti voler normalizzare e significa solo manipolare le stringhe del percorso, mentre path.resolve userà il filesystem e la directory corrente per risolvere il percorso in un percorso assoluto. Questo li fa comportare in modo abbastanza diverso in quanto path.normalize potrebbe essere usato su un percorso all'interno di un file tar, su un filesystem remoto o qualcosa di completamente astratto.
Nakedible

In che modo sono diversi da path.join?
Vijey

2

Dai documenti:

Un altro modo di pensare alla risoluzione è come una sequenza di comandi cd in una shell.

Collegamenti a path.resolve e path.normalize nella documentazione. Per lo più non voglio fornire solo collegamenti in una risposta, ma i documenti di Node.js sono molto decenti.


Immagino di non capire lo scopo di esporre la funzione normalize (...) quando puoi semplicemente passare il percorso in path.resolve (...)
BMiner

6
Il percorso che stai normalizzando potrebbe non esistere effettivamente nel filesystem, ad esempio potresti normalizzare un percorso a un file che stai per creare, o potresti normalizzare i percorsi URL relativi.
lanzz

In realtà non so nemmeno perché dovresti usare la normalizzazione rispetto alla risoluzione.
Pickels

1
normalize non completa il percorso a un percorso assoluto. Quindi può essere utilizzato per ottenere un percorso sano per alcune risorse relative a un'altra risorsa, che può essere utilizzato all'interno dell'HTML per fare riferimento a un file scelto dall'utente, ad esempio. Poiché il percorso normalizzato è sempre semplice (senza extra ../), può essere facilmente controllato per garantire che l'utente scelga solo i file da determinate posizioni e non abbia alcuna possibilità di visualizzare i file privati ​​al di fuori di queste posizioni.
dronus
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.