按需要求()

时间:2012-08-27 09:02:36

标签: node.js require ondemand

假设我在./libname中创建了一个库,其中包含一个主文件:main.js和多个可选库文件,这些文件偶尔会与主对象一起使用:a.jsb.js

我使用以下内容创建index.js文件:

exports.MainClass = require('main.js').MainClass; // shortcut
exports.a = require('a');
exports.b = require('b');

现在我可以按如下方式使用该库:

var lib = require('./libname');
lib.MainClass;
lib.a.Something; // Here I need the optional utility object
lib.b.SomeOtherThing;

然而,这意味着,我总是加载'a.js'和'b.js',而不是在我真正需要它们的时候。

当然我可以用require('./libname/a.js')手动加载可选模块,但后来我失去了漂亮的lib.a点符号:)

有没有办法用某种索引文件实现按需加载?也许,一些package.json魔法可以在这里发挥好吗?

2 个答案:

答案 0 :(得分:3)

如果您调用“MainClass”以按需动态加载其他模块,则可以执行此操作。但我怀疑这也意味着在api中调整访问模块。

我猜你的动机是“避免”“非必需模块”使用的额外处理。 但请记住Node是单线程的,因此加载模块的内存占用量不是每个连接,而是每个进程。加载模块是一次性的,可以将其存入内存。

换句话说,只有在您启动服务器时才会加载模块,而不是每次有人发出请求时都会加载模块。

我认为你从客户端编程看这个,在需要节省处理和/或http请求时加载脚本是有好处的。

在服务器上,您将保存的最多内存是额外的一点。

答案 1 :(得分:2)

看起来唯一的方法是使用getter。简而言之,就像这样:

exports = {
    MainClass : require('main.js').MainClass,
    get a(){ return require('./a.js'); },
    get b(){ return require('./a.js'); }
}