2013-05-24 25 views
12

Tôi đang xem Nodejs/expressjs và đã xem các hướng dẫn khác nhau sử dụng __diranme + "/my_folder", "./my_folder" hoặc chỉ "my_folder".Node js/Express js đường dẫn tương đối (dấu chấm hoặc __dirname hoặc không có tiền tố)?

Ví dụ:

app.use("/static", express.static(__dirname + "/my_folder")); 
app.use("/static", express.static("./my_folder")); 
app.use("/static", express.static("my_folder")); 

tôi đã cố gắng tất cả chúng và tất cả họ đều có vẻ làm việc; cái nào tôi nên sử dụng cho đường dẫn tương đối?

Tôi cũng đã xem require('./my_file.js')require('my_file'). Có sự khác biệt nào không? Tôi nên sử dụng cái gì?

+0

Tôi tin rằng cách xác định vị trí cuối cùng sẽ phá vỡ trên Windows. Tôi là 90% sử dụng '__dirname + '/ folder'' là cách tiếp cận an toàn nhất (không có bằng chứng cụ thể, chỉ là trải nghiệm ngẫu nhiên rối tung xung quanh với nút trong Windows). –

Trả lời

15

Hầu hết mọi chức năng (trừ require) có đường dẫn tệp làm đối số, sẽ sử dụng một hàm từ mô-đun fs để đọc hoặc viết cho chúng.

Node.js documentation for fs module nói:

đường So với tên tập tin có thể được sử dụng, tuy nhiên hãy nhớ rằng con đường này sẽ liên quan đến process.cwd().

Khi bạn nghĩ về điều đó, điều này sẽ yêu cầu phải có những thủ thuật chính để các chức năng này hoạt động khác. Sau khi tất cả, các chức năng fs là Javascript thường xuyên và họ không có quyền truy cập đặc biệt vào thông tin về người gọi. Chỉ __dirname họ có thể truy cập sẽ là __dirname của mô-đun riêng của họ (mô-đun lõi fs).

Thực tế là require chức năng thể quyết tâm đường dẫn tương đối so với hiện tại __dirname, mà không chỉ định này một cách rõ ràng, là bởi vì require là một chức năng duy nhất cho mỗi tập tin duy nhất xuất hiện trong. Bằng cách này, nó có quyền truy cập vào các hiện các chi tiết cụ thể của mô-đun và đặc biệt là đường dẫn của mô-đun.

Lý do mã của bạn hoạt động là hiện tại, mã số app.js (hoặc tương tự) ở trên xuất hiện trong cùng một thư mục với tên process.cwd() hiện tại. I E. bắt đầu ứng dụng với node app.js sẽ hoạt động, trong khi khởi động ứng dụng với node myappdir/app.js (chạy từ thư mục chính) sẽ không hoạt động. process.cwd() sẽ khác.

Miễn là bạn ghi nhớ rằng đường dẫn tương đối sẽ được giải quyết qua process.cwd(), thì bạn có thể sử dụng cú pháp ngắn hơn. Trong một số trường hợp, nó có thể là một lợi thế. Nó làm cho mã của bạn phụ thuộc vào cách nó được gọi là mặc dù. Cá nhân tôi thích sử dụng __dirname, vì nó hơi minh bạch hơn về những gì đang xảy ra và các đường dẫn tương đối phù hợp với đường dẫn bạn sử dụng trong tuyên bố require cho cùng một tệp.

+0

Cảm ơn, rất nhiều thông tin. Vì vậy, nếu tôi hiểu: 'require' sẽ luôn liên quan đến tệp hiện tại (sử dụng' dấu chấm' hoặc '__dirname'). Tất cả các đường dẫn khác - có thể đi qua 'fs', có thể liên quan đến quá trình với dấu chấm và liên quan đến tệp gọi nếu được chuyển với' __dirname' – Raekye

+1

Chính xác. Nhưng làm '__dirname +" một số đường dẫn "' chỉ là chuỗi nối thường xuyên. Đó là một cách đặc biệt để gọi một chức năng hay như vậy. Nó dẫn đến một con đường tuyệt đối, rời khỏi bất kỳ căn phòng nào để giải thích. –

0

tôi sử dụng app.use(express.static(path.join(__dirname, 'public'))); mà tôi sau đó có ba thư mục bên trong của công chúng, stylesheets, javascript và hình ảnh của tôi cho phép tôi để truy cập các tập tin tĩnh bởi

<link rel="stylesheet" href="/stylesheets/jquery-ui.css" /> 
    <script type="text/javascript" src="/javascripts/jquery-1.9.1.js"></script> 

cách tiếp cận ./myfolder Tôi tin rằng về cơ bản là giống nhau. Tôi chưa bao giờ sử dụng nó.
cách tiếp cận /myfolder Tôi chưa bao giờ thấy.

require('./my_file.js') I use as 
    require('./routes/my_file.js') aand is where I store all my express routes. 

require('myfile') là cuộc gọi đến các gói mà bạn cài đặt hoặc cài đặt nhanh.

4

Phiên bản __dirname là mạnh mẽ nhất kể từ __dirname sẽ luôn luôn là thư mục chứa các hiện đang thực hiện .js tập tin, mà là một neo tốt hơn so với "my_folder" hoặc "./my_folder" mà là cả hai đường dẫn tương đối và sẽ thất bại nếu thư mục làm việc hiện hành của quá trình (process.cwd()) là điều bất ngờ, điều này hoàn toàn có thể xảy ra. Lưu ý rằng đó là một câu chuyện khác nhau cho các đường dẫn được chuyển đến require, vì đường dẫn tương đối được giải quyết liên quan đến vị trí của mô-đun gọi mà không quan tâm đến thư mục làm việc hiện tại của quy trình (một lần nữa, điều này khiến chúng ít mong manh hơn).

+0

Đối với yêu cầu, tôi có nên bao gồm phần mở rộng không? Giống như tôi thường thấy 'require (__ dirname +"/something ")' nhưng tại sao không 'require (__ diranem +" /something.js ")' (có vẻ như cũng hoạt động)? – Raekye

+0

Chỉnh sửa: Tìm thấy 'Nếu không tìm thấy tên tập tin chính xác, thì nút sẽ cố tải tên tệp được yêu cầu với phần mở rộng thêm của .js, .json, và sau đó .node.' Trên tài liệu (bỏ qua nó trước đó, tìm thấy nó cho cái gì khác). Vì vậy, bây giờ tôi biết làm thế nào nó hoạt động, nhưng bạn có nghĩ rằng đó là một thói quen tốt để được rõ ràng hoặc ... tiềm ẩn (nhắc tôi về python xD) – Raekye

+0

Công ước không có tên tập tin (ngầm) và tôi nghĩ rằng đó là tốt. Bạn cũng có thể chuyển từ 'module.js' sang' module/index.js' và các chương trình bằng thư viện của bạn không phải quan tâm hoặc cập nhật. –

Các vấn đề liên quan