Sự khác biệt giữa path.resolve và path.join invocation?


Câu trả lời:


254

Hai chức năng xử lý các phân đoạn bắt đầu bằng /những cách rất khác nhau; joinsẽ chỉ nối nó với đối số trước, tuy nhiên resolvesẽ coi đây là thư mục gốc và bỏ qua tất cả các đường dẫn trước đó - nghĩ về nó như là kết quả của việc thực thi cdvới mỗi đối số:

path.join('/a', '/b') // Outputs '/a/b'

path.resolve('/a', '/b') // Outputs '/b'

Một điều cần lưu ý là path.resolvesẽ luôn dẫn đến một URL tuyệt đối và sẽ sử dụng thư mục làm việc của bạn làm cơ sở để giải quyết đường dẫn này. Nhưng như __dirnamelà một con đường tuyệt đối dù sao điều này không quan trọng trong trường hợp của bạn.

Đối với cái nào bạn nên sử dụng, câu trả lời là: nó phụ thuộc vào cách bạn muốn các phân đoạn bắt đầu /hoạt động - chúng có nên được tham gia đơn giản hay chúng nên đóng vai trò là root mới?

Nếu các đối số khác được mã hóa cứng thì thực sự không có vấn đề gì, trong trường hợp đó bạn có thể nên xem xét (a) cách dòng này có thể thay đổi trong tương lai và (b) nó phù hợp như thế nào với các vị trí khác trong mã.


64
Nếu bạn vẫn không nhận được: path.join('/a', '/b', 'c')sẽ trả lại /a/b/c, trong khi path.resolve('/a', '/b', 'c')sẽ trả lại /b/c.
totymedli

28
Tôi sẽ nói tên của resolvekhông rõ ràng nhất, path.cd([starting dir], [final dir])sẽ trực quan hơn nhiều.
João Pimentel Ferreira

19
Điều think of it as the result of executing cd with each argumentkhiến tôi cuối cùng cũng hiểu nó. Cảm ơn
André Pena

@ JoãoPimentelFerreira, tôi đã cập nhật câu trả lời ở trên vì bạn đã đưa ra một điểm hợp lệ. :)
Rin Minase

vậy path.resolve => giải quyết đường dẫn coi thư mục làm việc là điểm bắt đầu đường dẫn?
Nữ web

15

Các hoạt động mặc định của đường dẫn hệ thống tệp khác nhau dựa trên hệ điều hành, chúng tôi cần một số thứ trừu tượng hóa nó. Các pathmô-đun cung cấp các tiện ích hay API để làm việc với tập tin và thư mục đường dẫn. bạn có thể đưa nó vào dự án của bạn bằng cách sử dụng

const path = require('path');

Các path.joinpath.resolvehai phương pháp khác nhau của các module con đường.

Cả hai phương thức này đều chấp nhận một chuỗi các đường dẫn hoặc các đoạn đường dẫn.

Các path.resolve()phương pháp giải quyết một chuỗi các con đường hoặc đoạn đường dẫn vào một đường dẫn tuyệt đối .

Các path.join()phương pháp tham gia tất cả các đoạn đường được cùng nhau bằng cách sử dụng dấu phân cách cụ nền tảng như một dấu phân cách, sau đó trở lại bình thường con đường dẫn.

Để hiểu rõ hơn và phân biệt các hành vi, hãy để tôi giải thích nó với các tình huống khác nhau.

1. Nếu chúng tôi không cung cấp bất kỳ đối số nào hoặc chuỗi rỗng

trong trường hợp của tôi, tên tệp của tôi là index.jsvà thư mục làm việc hiện tại làE:\MyFolder\Pjtz\node

const path = require('path');

console.log("path.join() : ", path.join());
// outputs .
console.log("path.resolve() : ", path.resolve());
// outputs current directory or equalent to __dirname of the node process

và về kết quả chạy như dưới đây

λ node index.js
path.join() :  .
path.resolve() :  E:\MyFolder\Pjtz\node

Suy luận từ thí nghiệm trên là path.resolve()phương thức tha sẽ xuất ra đường dẫn tuyệt đối trong đó là path.join()trả về. đại diện cho thư mục làm việc hiện tại hoặc đường dẫn tương đối nếu không có gì được cung cấp

2. Thêm một / đường dẫn như bất kỳ đối số.

const path=require('path');

console.log("path.join() : " ,path.join('abc','/bcd'));
console.log("path.resolve() : ",path.resolve('abc','/bcd'));

và kết quả là

λ node index.js
path.join() :  abc\bcd
path.resolve() :  E:\bcd

Suy luận chúng ta có thể tìm thấy với thí nghiệm này là path.join()chỉ ghép nối danh sách đầu vào với dấu phân tách cụ thể nền tảng trong khi path.resolve()xử lý chuỗi các đường dẫn từ phải sang trái, với mỗi đường dẫn tiếp theo được chuẩn bị cho đến khi một đường dẫn tuyệt đối được xây dựng.

path.join()nối từng đối số với các dấu tách riêng của HĐH trong khi path.resolve()sẽ giải quyết từng đối số bằng gốc và tạo đầu ra.


path.resolve()không tương đương với __dirname. Cái đầu tiên trả về thư mục làm việc, trong khi cái thứ hai là đường dẫn đến tệp hiện tại.
Emile Bergeron

@EmileBergeron Theo tôi hiểu cả hai đều là các hàm trên đường dẫn. Bạn có thể thử theo đoạn trích để kiểm tra xem cả hai đều giống nhau. const path = require('path'); console.log(path.resolve()) console.log(__dirname) console.log(path.resolve()===__dirname)
samuelj90

Chúng chỉ giống nhau khi tệp đang chạy nằm trong thư mục làm việc hiện tại.
Emile Bergeron

@EmileBergeron Ok tôi đồng ý. Nhưng tôi vẫn bối rối về nơi tôi đã chỉ địnhpath.resolve() is equivalent to __dirname
samuelj90

1
@EmileBergeron tôi đã cập nhật nhận xét Tôi nghĩ rằng nó sẽ giải quyết vấn đề
rắc rối

13

1) path.resolve tạo đường dẫn tuyệt đối.

Phương thức tạo đường dẫn absoulte từ phải sang trái cho đến khi đường dẫn tuyệt đối được xây dựng.

Ví dụ:

path.resolve('/a', 'b', 'c');     //    C:\a\b\c
path.resolve('/a', '/b', 'c');    //    C:\b\c
path.resolve('/a', '/b', '/c');   //    C:\c

Nếu đường dẫn tuyệt đối không được tạo, phương thức sử dụng thư mục làm việc hiện tại:

Ví dụ:

path.resolve('a', 'b', 'c');     //    C:\{current_working_directory}\a\b\c

2) path.join tham gia tất cả các đường dẫn và kết quả chuẩn hóa

Ví dụ:

path.join('/a', '/b', '/c');   //   \a\b\c
path.join('/a', '/b', 'c');    //   \a\b\c
path.join('/a', 'b', 'c');     //   \a\b\c
path.join('a', 'b', 'c');      //   \a\b\c

1
Ví dụ tham gia cuối cùng path.join('a','b','c')sẽ dẫn đến a\b\c.
spmdc
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.