Diferença entre path.normalize e path.resolve em Node.js


86

Qual é a diferença (se houver) entre path.normalize(your_path)e path.resolve(your_path)?

Eu sei que path.resolve(...)posso aceitar vários argumentos, mas o comportamento com um único argumento é o mesmo que chamar path.normalize()?

EDIT: Se eles deveriam se comportar da mesma maneira, eu não entendo o propósito de expor a path.normalize(...)função quando você pode simplesmente passar o caminho para path.resolve(...)Ou, talvez, seja para fins de documentação. Por exemplo, eles dizem na documentação para path.resolve(...):

... O caminho resultante é normalizado e ...

Expor o path.normalize(...)torna mais fácil explicar o que significa "normalizado" ??? Não sei.

Respostas:


182

path.normalizese livrar do adicional ., ..etc. no caminho. path.resolveresolve um caminho em um caminho absoluto. Exemplo (meu diretório de trabalho atual era /Users/mtilley/src/testing):

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

Em outras palavras, path.normalizeé "Qual é o caminho mais curto que posso tomar que me levará ao mesmo lugar da entrada", enquanto path.resolveé "Qual é o meu destino se eu seguir este caminho".

Observe, entretanto, que path.normalize()é muito mais independente do contexto do que path.resolve(). Tinha path.normalize()sido ao contexto de pendente (ou seja, se ele tinha tomado em consideração o atual diretório de trabalho), o resultado no exemplo acima teria sido ../node, porque isso é o mais curto caminho pode tomar a partir /Users/mtilley/src/testingde /Users/mtilley/src/node.

Ironicamente, isso significa que path.resolve()produz um caminho relativo em termos absolutos (você poderia executá-lo em qualquer lugar e produziria o mesmo resultado), enquanto path.normalize()produz um caminho absoluto em termos relativos (você deve executá-lo no caminho relativo ao qual deseja calcular o resultado absoluto).


Agradável. Obrigado pela resposta! Isso tem me incomodado por algum tempo. Os documentos do Node, embora sejam normalmente muito legais, me deixaram um pouco confuso.
BMiner

14
Observe também que path.normalize pode manipular qualquer caminho que você queira normalizar e significa apenas manipulação de string do caminho, enquanto path.resolve usará o sistema de arquivos e o diretório atual para resolver o caminho para um caminho absoluto. Isso faz com que eles se comportem de maneira bem diferente, já que path.normalize pode ser usado em um caminho dentro de um arquivo tar, em um sistema de arquivos remoto ou em algo totalmente abstrato.
Nakedible

Como eles são diferentes de path.join?
Vijey

2

Dos documentos:

Outra maneira de pensar em resolver é como uma sequência de comandos de cd em um shell.

Links para path.resolve e path.normalize na documentação. Eu geralmente não quero apenas fornecer links em uma resposta, mas os documentos do Node.js são muito decentes.


Eu acho que não entendo o propósito de expor a função normalize (...) quando você pode simplesmente passar o caminho para path.resolve (...)
BMiner

6
O caminho que você está normalizando pode não existir realmente no sistema de arquivos, por exemplo, você pode estar normalizando um caminho para um arquivo que vai criar ou pode estar normalizando caminhos de URL relativos.
lanzz

Na verdade, também não sei por que você usaria normalizar em vez de resolver.
Pickels

1
normalizar não completa o caminho para um caminho absoluto. Portanto, pode ser usado para obter um caminho lógico para alguns recursos em relação a outro recurso, que pode ser usado dentro do HTML para fazer referência a um arquivo escolhido pelo usuário, por exemplo. Como o caminho normalizado é sempre simples (sem extras ../), ele pode ser facilmente verificado para garantir que o usuário só escolha arquivos de determinados locais e não tenha chance de visualizar arquivos privados fora desses locais.
dronus
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.