目前 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 所说的“我宁愿以快速请求处理的速度启动慢速启动,也不愿以缓慢的请求处理快速启动”。
但是我强烈建议不要使用 arequire
来处理请求,因为第一次调用是同步的,并且会阻塞服务器,这不仅会影响当前请求,还会阻止处理任何其他请求。有了足够多的此类请求,您的服务器将停止响应请求。
基本上:预加载您需要的所有代码,但延迟加载数据(以异步方式)。
(这不是您所要求的,但这将被视为不好的做法)。