2013-09-24 68 views
6

Tôi muốn chia ứng dụng Node thành nhiều tệp riêng biệt để làm cho mô đun trở nên kiểu mô-đun hơn và dễ bảo trì hơn.Có một Node.js tương đương với PHP bao gồm, do đó mã bao gồm có quyền truy cập vào các biến của tệp gốc không?

Nhưng vì không có cách nào để 'bao gồm' tệp trực tiếp vào tệp được phân tích cú pháp hiện tại như trong các ngôn ngữ khác như PHP, 'mô-đun' hoặc 'tệp riêng' không tự động truy cập vào các biến được xác định trong tập lệnh rằng 'đòi hỏi' chúng.

Làm thế nào tôi có thể làm điều này?

Tôi đã suy nghĩ về làm điều gì đó như thế này trong các tập tin riêng của tôi:

module.exports = function(stuff) { 
    //I now have access to 'stuff'. 
} 

Nhưng nó hơi cồng kềnh.

Tôi chắc chắn ai đó đã giải quyết vấn đề này trước tôi ... bạn đề xuất gì?

+1

đọc các tài liệu: http://nodejs.org/docs/v0.5.5/api/modules.html Sử dụng đối tượng 'exports' trong một mô-đun cho phép bạn tạo một số vari nhất định ables hoặc chức năng công khai trong khi các biến khác vẫn là riêng tư. Nó khá là đẹp. –

+2

"của tôi 'mô-đun' hoặc 'tệp riêng biệt' không tự động nhận quyền truy cập vào các biến được xác định trong tập lệnh 'yêu cầu' chúng" - điều đó có làm cho mã của bạn * khó hơn * để duy trì không? Ý tưởng của mô-đun require.js là chúng cung cấp chức năng được sử dụng bởi các tập lệnh khác; nếu họ muốn truy cập vào dữ liệu/phương thức công khai của các mô-đun khác, họ phải tự yêu cầu các mô-đun đó. –

+0

Hãy xem xét mô hình 'middleware' và nhớ - module của bạn là trong thực tế chỉ là một đối tượng với danh sách các chức năng 'xuất khẩu' đã được thực hiện trong lần đầu tiên 'require'. – moka

Trả lời

2

Cách dễ nhất để chia sẻ các biến trên mô-đun là gán các biến cho đối tượng vùng tên chung. Các biến được khai báo cách chúng được khai báo trên toàn cầu trong trình duyệt vẫn là mô-đun cụ thể trong Nút, vì vậy có một đối tượng global.

Sử dụng phạm vi toàn cầu được coi là xấu thực tế, nhưng có thể đơn giản hơn nhiều so với các phương pháp khác:

foo.js

global.num = 3; 
global.str = 'a string'; 
require('./bar'); 

bar.js

console.log(num); // 3 
console.log(str); // a string 
+0

Đây là thực tế vô cùng tồi tệ. Nó là tốt cho nhanh chóng, thử nghiệm bẩn hoặc singletons tự nhiên (chúng tôi giữ logger của chúng tôi toàn cầu, ví dụ). Cách thích hợp là sử dụng 'module.exports' hoặc' exports.NAME'. – Tony

+1

Đó không phải là những gì câu hỏi được yêu cầu, và tôi đã nói trong câu trả lời rằng đó là thực hành xấu.Câu hỏi đặt ra là tìm kiếm một cách đơn giản để chuyển các biến từ một kịch bản chính sang một mô-đun mà không gán một hàm cho 'module.exports'. Ngoài ra, tôi không xuất khẩu các giá trị từ một mô-đun cho phụ huynh của nó, tôi đang chuyển các biến từ cha mẹ sang mô-đun. – hexacyanide

+0

Tôi đã tái khẳng định sự thừa nhận hành vi xấu của bạn, điều đó chắc chắn không rõ ràng từ nhận xét của tôi. Nhưng, trong khi nó giải quyết vấn đề, chúng ta có nên thúc đẩy thực hành xấu không? – Tony