我想知道我是否正在构建我的nodejs应用程序以考虑最佳性能。我主要关注的是如何通过模块移动我的应用程序参考。
基本上在我的app.js文件中,我正在声明我的所有要求,库等:
var app = {
config : require('../../config.json'),
restify : require('restify'),
path : require('path'),
mongo : require('mongodb'),
model : require('./models.js'),
step : require('step'),
q : require('q'),
api : require('./api_util.js'),
underscore : require('underscore')
};
在我的导出中,我传递了整个app对象。现在根据我对JavaScript的了解(如果我错了你可以纠正我),这不会创建对象的新实例,它只是将对象作为指针传入并在内存中引用相同的对象。
现在我发现自己做的事情(为了方便)是在我的restify库中(同样可以用Express完成),我将app值附加到服务器请求对象,如下所示:
app.server.pre(function (request, response, next) {
request.app = app;
return next();
});
因此,对于每一个请求,如果我需要快速访问我的任何库声明,配置等,我可以轻松访问request.app。我不认为这也是一个问题,同样的逻辑,对象作为一个指针返回到相同的内存空间,所以我不会加倍内存使用或任何东西。
是否有更好/更简单的方法来构建它?
答案 0 :(得分:6)
您传递的引用是正确的,而不是被复制的对象。从这个角度来看,在传递对app
的引用时,您不会浪费额外的空间。
但是,我建议你不要这样做:如果你在任何地方传递app
的引用,它告诉我的是你真的不知道你在这个或那个模块中需要什么。< / p>
您应该仔细规划您的依赖项并了解每个模块需要什么,以便您可以为应用程序中的每个模块传递正确的依赖项。
关于underscore
或mongodb
这样的事情,你不应该做你正在做的事情。您应该只传递需要初始化的模块。对于underscore
或mongodb
之类的内容,node.js会在您第一次require()
时缓存该定义,因此您可以在需要的每个模块的顶部调用require
它
这不会导致任何性能损失,并且会使每个模块所需的库更清晰。