在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