Ý chính
Trong Node.js, __dirname
luôn là thư mục chứa tập lệnh hiện đang thực thi ( xem phần này ). Vì vậy, nếu bạn gõ __dirname
vào /d1/d2/myscript.js
, giá trị sẽ là /d1/d2
.
Ngược lại, .
cung cấp cho bạn thư mục mà bạn đã chạy node
lệnh trong cửa sổ đầu cuối (tức là thư mục làm việc của bạn) khi bạn sử dụng các thư viện như path
và fs
. Về mặt kỹ thuật, nó bắt đầu như thư mục làm việc của bạn nhưng có thể được thay đổi bằng cách sử dụng process.chdir()
.
Ngoại lệ là khi bạn sử dụng .
với require()
. Đường dẫn bên trong require
luôn liên quan đến tệp chứa lệnh gọi đến require
.
Ví dụ...
Giả sử cấu trúc thư mục của bạn là
/dir1
/dir2
pathtest.js
và pathtest.js
chứa
var path = require("path");
console.log(". = %s", path.resolve("."));
console.log("__dirname = %s", path.resolve(__dirname));
và bạn làm
cd /dir1/dir2
node pathtest.js
bạn lấy
. = /dir1/dir2
__dirname = /dir1/dir2
Thư mục làm việc của bạn là /dir1/dir2
như vậy đó là những gì .
giải quyết. Vì pathtest.js
nằm ở /dir1/dir2
đó là những gì __dirname
giải quyết là tốt.
Tuy nhiên, nếu bạn chạy tập lệnh từ /dir1
cd /dir1
node dir2/pathtest.js
bạn lấy
. = /dir1
__dirname = /dir1/dir2
Trong trường hợp đó, thư mục làm việc của bạn là /dir1
những gì đã .
được giải quyết, nhưng __dirname
vẫn giải quyết /dir1/dir2
.
Sử dụng .
bên trong require
...
Nếu bên trong dir2/pathtest.js
bạn có một require
cuộc gọi bao gồm một tập tin bên trong dir1
bạn sẽ luôn luôn làm
require('../thefile')
bởi vì đường dẫn bên trong require
luôn liên quan đến tệp mà bạn đang gọi nó. Nó không có gì để làm với thư mục làm việc của bạn.