点播需要()(On-demand require())

2019-06-27 09:43发布

说我在库中创建./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魔能很好地在这里打球?

Answer 1:

这也许可能的,如果你叫“MainClass”动态加载点播的附加模块。 但我怀疑这也将意味着在API来访问模块进行调整。

我猜你的动机是为了“避免”,由“非必需的模块”用于额外的处理。 但是,请记住节点是单线程所以加载模块的内存占用是不是每个连接,它的每个进程。 加载一个模块是一次性的得到它到内存中。

换句话说,模块只有永远加载,当你启动服务器并不是每一次有人发出请求。

我认为你从客户端编程,其中当要求他们以节省加工和或HTTP请求它的优势来加载脚本看这个。

在服务器上最让你将节省在存储一些额外的叮咬。



Answer 2:

貌似唯一的办法是用干将。 总之,像这样:

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


文章来源: On-demand require()