在node.js中延迟加载

我想知道是否在node.js中使用require()相当于延迟加载?

例如,如果我有一个函数需要一个特定的node.js包在我的代码中不需要的地方,那么我最好使用该函数内的require()来仅在调用该函数时包含所需的包。

由于我对node.js架构缺乏了解,我还不确定这是否会提供任何性能改进? 我认为它将使用每个连接到我的服务器更less的内存。 但是,当它必须读取包时,是否会增加磁盘的I / O,或者这将是一次性将其存储在内存中?

如果是这种情况,我应该采取多less,我应该尽可能多的代码编写node.js包?

require()是按需加载的。 一旦模块被加载,如果再次运行require()调用,它将不会被重新加载。 通过把它放在一个函数内而不是你的顶级模块代码中,你可以延迟它的加载,或者如果你没有真正调用这个函数,可能会避免它的加载。 然而, require()是同步的并且从磁盘加载模块,所以最好的做法是在应用程序启动之前加载你需要的任何模块,然后在你的应用程序开始服务请求之前确保只有asynchronousIO在你的应用程序运行时才会发生。

节点是单线程的,因此加载模块的内存占用不是每个连接,而是每个进程。 加载一个模块是一次性的把它存入内存。

只要坚持这里的约定,在开始处理请求之前,需要在应用程序的顶级范围内使用所需的模块。 我认为这是一个例子,如果你要问你是否需要以不寻常的方式编写你的代码,你不需要以不寻常的方式编写代码。

如果你想延迟加载模块,现在可以使用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(ad) console.log('After log module'); 

产量

 Before require After require Module was loaded 3 After log module