2

假设我创建了一个库,./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魔法可以在这里很好地发挥作用?

4

2 回答 2

3

如果您调用“MainClass”来按需动态加载附加模块,这可能是可能的。但我怀疑这也意味着对 api 进行调整以访问模块。

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

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

我认为您从客户端编程中看到了这一点,当需要保存处理和/或 http 请求时加载脚本是有优势的。

在服务器上,您最多可以节省一些内存。

于 2012-08-27T09:58:05.000 回答
2

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

exports = {
    MainClass : require('main.js').MainClass,
    get a(){ return require('./a.js'); },
    get b(){ return require('./a.js'); }
}
于 2012-08-27T11:04:45.857 回答