Sự khác biệt giữa path.normalize và path.resolve trong Node.js


86

Sự khác biệt (nếu có) giữa path.normalize(your_path)path.resolve(your_path)?

Tôi biết path.resolve(...)có thể chấp nhận nhiều đối số, nhưng hành vi với một đối số có giống với gọi path.normalize()không?

CHỈNH SỬA: Nếu chúng được cho là hoạt động theo cùng một cách, tôi không hiểu mục đích của việc hiển thị path.normalize(...)hàm khi bạn có thể chỉ cần chuyển đường dẫn vào path.resolve(...)Hoặc, có thể, nó cho mục đích tài liệu. Ví dụ, trong tài liệu họ nói path.resolve(...):

... Đường dẫn kết quả được chuẩn hóa và ...

Việc path.normalize(...)giải thích "chuẩn hóa" nghĩa là gì dễ dàng hơn ??? Tôi không biết.

Câu trả lời:


182

path.normalizeđược thoát khỏi những phụ ., ..vv trong đường dẫn. path.resolvegiải quyết một đường dẫn thành một đường dẫn tuyệt đối. Ví dụ (thư mục làm việc hiện tại của tôi là /Users/mtilley/src/testing):

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

Nói cách khác, path.normalizelà "Con đường ngắn nhất mà tôi có thể đi sẽ đưa tôi đến cùng nơi với đầu vào", trong khi path.resolvelà "Đâu là điểm đến của tôi nếu tôi đi con đường này."

Tuy nhiên lưu ý rằng path.normalize()nhiều hơn bối cảnh độc lập hơn path.resolve(). Đã path.normalize()được context- de chưa xong (tức là nếu nó đã đưa vào xem xét các thư mục làm việc hiện hành), kết quả trong ví dụ trên sẽ đã ../node, bởi vì đó là một trong những con đường ngắn nhất có thể kéo dài từ /Users/mtilley/src/testingđến /Users/mtilley/src/node.

Trớ trêu thay, điều này có nghĩa là path.resolve()tạo ra một đường dẫn tương đối theo các điều kiện tuyệt đối (bạn có thể thực thi nó ở bất kỳ đâu và nó sẽ tạo ra cùng một kết quả), trong khi path.normalize()tạo ra một đường dẫn tuyệt đối về mặt tương đối (bạn phải thực thi nó trong đường dẫn liên quan đến mà bạn muốn tính kết quả tuyệt đối).


Đẹp. Cảm ơn vì câu trả lời! Điều này đã được lỗi tôi cho một lúc. Các tài liệu Node, trong khi chúng thường khá đẹp, khiến tôi hơi khó hiểu về tài liệu này.
BMiner

14
Cũng lưu ý rằng path.normalize có thể xử lý bất kỳ đường dẫn nào bạn có thể muốn chuẩn hóa và có nghĩa là chỉ thao tác chuỗi đối với đường dẫn, trong khi path.resolve sẽ sử dụng hệ thống tệp và thư mục hiện tại để giải quyết đường dẫn đến một đường dẫn tuyệt đối. Điều này làm cho chúng hoạt động khá khác nhau vì path.normalize có thể được sử dụng trên đường dẫn bên trong tệp tar, trên hệ thống tệp từ xa hoặc một cái gì đó hoàn toàn trừu tượng.
Nakedible

Chúng khác với path.join như thế nào?
Vijey

2

Từ các tài liệu:

Một cách khác để suy nghĩ về giải quyết là như một chuỗi các lệnh cd trong một trình bao.

Liên kết đến path.resolvepath.normalize trong tài liệu. Tôi hầu như không muốn chỉ cung cấp liên kết trong một câu trả lời nhưng tài liệu Node.js rất tốt.


Tôi đoán tôi không hiểu mục đích của việc hiển thị hàm normalize (...) khi bạn có thể chỉ cần chuyển đường dẫn vào path.resolve (...)
BMiner

6
Đường dẫn bạn đang chuẩn hóa có thể không thực sự tồn tại trong hệ thống tệp, ví dụ: bạn có thể đang chuẩn hóa đường dẫn đến tệp mà bạn sẽ tạo hoặc bạn có thể đang chuẩn hóa các đường dẫn URL tương đối.
lanzz

Trên thực tế, tôi không biết tại sao bạn cũng sẽ sử dụng normalize over Resolution.
Đón khách vào

1
normalize không hoàn thành đường dẫn đến một đường dẫn tuyệt đối. Vì vậy, nó có thể được sử dụng để lấy một đường dẫn lành mạnh cho một số nguồn ressource liên quan đến một nguồn ressource khác, có thể được sử dụng bên trong HTML để tham chiếu đến một tệp do người dùng chọn chẳng hạn. Vì đường dẫn chuẩn hóa luôn đơn giản (không có thêm ../) nên có thể dễ dàng kiểm tra để đảm bảo người dùng chỉ chọn tệp từ các vị trí nhất định và không có cơ hội xem các tệp riêng tư bên ngoài vị trí này.
dronus
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.