簡體   English   中英

在node.js中加載延遲

[英]Lazy loading in node.js

我想知道在node.js中使用require()是否相當於延遲加載?

例如,如果我有一個函數需要一個特定的node.js包,而我的代碼中的任何其他位置都不需要,我最好在該函數內部使用require()來僅在調用該函數時包含所需的包。

鑒於我對node.js架構缺乏了解,我也不確定這是否能提供任何性能改進? 我認為它將為我的服務器每個連接使用更少的內存。 但是,當它必須讀取包時會增加磁盤的I / O,還是一次性將它放入內存中?

如果是這種情況我應該采取多少措施,我應該盡可能多地嘗試編寫node.js軟件包嗎?

require()是按需加載。 加載模塊后,如果再次運行require()調用,則不會重新加載。 通過將其放在函數而不是頂級模塊代碼中,您可以延遲其加載,或者如果您從未實際調用該函數,則可能會避免加載。 但是, require()是同步的並從磁盤加載模塊,因此最佳做法是在應用程序開始提供請求之前加載應用程序啟動時所需的任何模塊,然后確保在應用程序運行時僅發生異步IO。

節點是單線程的,因此加載模塊的內存占用量不是每個連接,而是每個進程。 加載模塊是一次性進入內存。

在開始處理請求之前,請堅持使用此約定並在應用程序的頂級范圍內需要所需的模塊。 我認為這是一個例子,如果您不得不問是否需要以不尋常的方式編寫代碼,則不需要以不尋常的方式編寫代碼。

如果你想延遲加載模塊,現在可以使用ES6(Node v6)

編輯:如果您需要訪問require屬性(如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');

產量

Before require
After require
Module was loaded
3
After log module

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM