2012-02-03 51 views
13

Tôi đã tự hỏi liệu việc sử dụng require() trong node.js có tương đương với tải chậm không? Ví dụ: nếu tôi có chức năng yêu cầu gói node.js cụ thể không cần ở bất kỳ nơi nào khác trong mã của tôi, tôi nên sử dụng hàm require() bên trong hàm đó để bao gồm gói cần thiết chỉ khi chức năng đó được gọi .Tải trọng lười biếng trong node.js

Tôi cũng không chắc liệu điều này có cung cấp bất kỳ cải tiến hiệu suất nào do thiếu hiểu biết về kiến ​​trúc node.js không? Tôi đoán nó sẽ sử dụng ít bộ nhớ hơn cho mỗi kết nối đến máy chủ của tôi. Tuy nhiên nó sẽ tăng I/O vào đĩa khi nó phải đọc gói, hoặc đây sẽ là một cái để có được nó trong bộ nhớ?

Nếu đây là trường hợp tôi nên thực hiện điều này bao lâu, tôi có nên cố gắng viết các gói node.js để có nhiều mã nhất có thể không?

Trả lời

21

require() là tải theo yêu cầu. Khi một mô-đun đã được tải, nó sẽ không được tải lại nếu cuộc gọi require() được chạy lại. Bằng cách đặt nó bên trong một hàm thay vì mã mô-đun cấp cao nhất của bạn, bạn có thể trì hoãn việc tải của nó hoặc có khả năng tránh nó nếu bạn không bao giờ thực sự gọi hàm đó. Tuy nhiên, require() là đồng bộ và tải mô-đun từ đĩa để thực hành tốt nhất là tải bất kỳ mô-đun nào bạn cần lúc bắt đầu ứng dụng trước khi ứng dụng của bạn bắt đầu phân phối các yêu cầu mà sau đó đảm bảo rằng chỉ IO không đồng bộ xảy ra trong khi ứng dụng của bạn đang hoạt động.

Nút là một luồng duy nhất để dấu chân bộ nhớ tải mô-đun không phải là kết nối, mỗi lần xử lý. Tải một mô-đun là một lần duy nhất để đưa nó vào bộ nhớ.

Chỉ cần tuân thủ quy ước tại đây và yêu cầu các mô-đun bạn cần ở phạm vi cấp cao nhất của ứng dụng trước khi bắt đầu xử lý yêu cầu. Tôi nghĩ đây là trường hợp, nếu bạn phải hỏi liệu bạn có cần viết mã của mình theo cách khác thường hay không, bạn không cần phải viết mã theo cách khác thường.

+0

Cảm ơn Peter, điều này đã làm cho nó tất cả có ý nghĩa hơn rất nhiều. –

+6

Tải ban đầu không có ý nghĩa đối với các công cụ CLI (ngoại trừ kiểm tra, nơi bạn có thể tắt tạm thời). – sheerun

+1

@ PeterLyons bạn có thể giải thích cho tôi dòng "Node là đơn luồng nên bộ nhớ của tải một mô-đun không phải là cho mỗi kết nối, đó là mỗi quá trình. Tải một mô-đun là một lần để có được nó vào bộ nhớ". Tôi hiểu những gì một chủ đề duy nhất là, bạn có nghĩa là để nói rằng bất cứ số lượng kết nối đến máy chủ, một mô-đun cụ thể sẽ được nạp chỉ một lần trên toàn bộ ứng dụng? – Deepak

2

Nếu bạn muốn module tải lười biếng, nó bây giờ có thể với ES6 (Node v6)

Chỉnh sửa: Điều này sẽ không hoạt động nếu bạn cần truy cập vào tính chất của yêu cầu (như require.cache).

module.js

console.log('Module was loaded') 
exports.d=3 

main.js

var _require = require; 
var require = function (moduleName) { 
    var module; 
    return new Proxy(function() { 
     if (!module) { 
      module = _require(moduleName) 
     } 
     return module.apply(this, arguments) 
    }, { 
     get: function (target, name) { 
      if (!module) { 
       module = _require(moduleName) 
      } 
      return module[name]; 
     } 
    }) 
}; 

console.log('Before require'); 
var a = require('./module') 
console.log('After require'); 
console.log(a.d) 
console.log('After log module'); 

đầu ra

Before require 
After require 
Module was loaded 
3 
After log module 
Các vấn đề liên quan