2012-01-22 25 views
23

Tôi vừa bắt đầu làm việc với các nút. Tôi tự hỏi nếu có một cách để "yêu cầu" một tập tin chỉ một lần trong một ứng dụng. Tôi đang sử dụng một khung lớp để nhận OOPS cổ điển trong dự án JS của tôi. Mỗi "lớp" được chứa trong tệp JS của chính nó. Tôi muốn "yêu cầu" khung công tác lớp trong mỗi tệp để chúng có thể hoạt động độc lập nhưng chỉ muốn mã init của khung công tác được thực hiện một lần.Có cách nào để "yêu cầu" một tệp JS chỉ một lần trong các nút không?

Tôi có thể sử dụng cờ để tự thực hiện việc này nhưng cách tích hợp sẽ tốt đẹp. Tìm kiếm "yêu cầu một lần" dẫn tôi đến tất cả các câu hỏi liên quan đến PHP.

Trả lời

59

require luôn là "yêu cầu một lần". Sau khi bạn gọi require lần đầu tiên, require sử dụng bộ nhớ cache và sẽ luôn trả về cùng một đối tượng.

Bất kỳ mã thực thi nào nổi trong mô-đun sẽ chỉ được chạy một lần.

Mặt khác, nếu bạn muốn nó chạy mã khởi tạo nhiều lần, chỉ cần ném mã đó vào phương thức đã xuất.

chỉnh sửa: Đọc phần 'Cache' của http://nodejs.org/docs/latest/api/modules.html#modules

+1

Tuyệt vời! Cảm ơn đã trả lời nhanh chóng. – atlantis

+0

Bạn có thể giải thích hoặc đưa ra ví dụ khi bạn nói 'chạy mã khởi tạo nhiều lần, chỉ cần ném mã đó vào phương thức đã xuất.' –

+1

@sudo thay vì để lại mã trong phần mô-đun, đặt nó vào hàm bạn xuất . Các mô-đun yêu cầu mô đun của bạn có thể thực hiện chức năng này để chạy lại mã khởi tạo. ví dụ: '' 'js var db = connect(); module.exports = db '' ' vs ' '' js module.exports = kết nối '' ' Một cách khác để nghĩ về nó là: module Node luôn độc thân. Singleton của bạn có thể trưng ra một nhà xây dựng/nhà máy để tạo ra các cá thể. – timoxley

1

Nếu bạn thực sự muốn mã cấp cao nhất trong mô-đun của bạn (mã mà không được chứa trong các phương pháp hoặc các chức năng trong module của bạn) để thực hiện nhiều hơn một lần bạn có thể xóa đối tượng mô-đun của nó được lưu trữ trong đối tượng require.cache như sau:

delete require.cache[require.resolve('./mymodule.js')]; 

Thực hiện việc này trước khi bạn yêu cầu mô-đun lần thứ hai.

Hầu hết thời gian mặc dù bạn có thể chỉ muốn mã cấp cao nhất của mô-đun chạy một lần và bất kỳ lúc nào khác bạn yêu cầu mô-đun bạn chỉ muốn truy cập vào mô-đun xuất.

var myMod = require("./mymodule.js"); //the first time you require the 
             //mymodule.js module the top level code gets 
             //run and you get the module value returned. 


var myMod = require("./mymodule.js"); //the second time you require the mymodule.js 
             //module you will only get the module value 
             //returned. Obviously the second time you 
             //require the module it will be in another 
             //file than the first one you did it in. 
Các vấn đề liên quan