【发布时间】:2013-02-28 08:22:51
【问题描述】:
目前Express框架中的路由需要先加载模块。但这在有数百个模块的现实生活场景中效率不高。我只想加载需要的模块。有没有一种方法可以在不预加载模块的情况下定义到目标模块的路由。
类似的东西
app.get('user/showall', 'user.list');
所以我希望仅在需要加载特定请求时才加载用户模块。
【问题讨论】:
目前Express框架中的路由需要先加载模块。但这在有数百个模块的现实生活场景中效率不高。我只想加载需要的模块。有没有一种方法可以在不预加载模块的情况下定义到目标模块的路由。
类似的东西
app.get('user/showall', 'user.list');
所以我希望仅在需要加载特定请求时才加载用户模块。
【问题讨论】:
我宁愿慢速启动和快速请求处理,也不愿快速启动和慢速请求处理,因为模块必须在运行时加载。
但如果你真的想要,你可以创建一个中间件来实现这种行为(完全未经测试):
var lazyload = function(route) {
var s = route.split('.');
var mod = s[0];
var exp = s[1];
return function(req, res, next) {
require(mod)[exp](req, res);
};
};
...
app.get('user/showall', lazyload('user.list'));
(假设路由始终命名为MODULENAME.EXPORTEDNAME)。
【讨论】:
我赞同@robertklep 所说的“我宁愿启动缓慢但请求处理速度快,而不是快速启动但请求处理速度慢”。
但我强烈建议不要使用require 来处理请求,因为第一次调用是同步的并且会阻塞服务器,这不仅会影响当前请求,还会阻止处理任何其他请求。如果此类请求足够多,您的服务器将停止响应请求。
基本上:预加载您需要的所有代码,但延迟加载数据(以异步方式)。
(这不是您所要求的,但这会被认为是不好的做法)。
【讨论】: