假设我在./libname
中创建了一个库,其中包含一个主文件:main.js
和多个可选库文件,这些文件偶尔会与主对象一起使用:a.js
和b.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
魔法可以在这里发挥好吗?
答案 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'); }
}