Câu trả lời:
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ã.
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.
resolvekhông rõ ràng nhất, path.cd([starting dir], [final dir])sẽ trực quan hơn nhiề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
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.joinvà path.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()là 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.
const path = require('path'); console.log(path.resolve()) console.log(__dirname) console.log(path.resolve()===__dirname)
path.resolve() is equivalent to __dirname
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
path.join('a','b','c')sẽ dẫn đến a\b\c.