Nodejs app结构

时间:2012-05-29 01:22:06

标签: javascript node.js express restify

我想知道我是否正在构建我的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。我不认为这也是一个问题,同样的逻辑,对象作为一个指针返回到相同的内存空间,所以我不会加倍内存使用或任何东西。

是否有更好/更简单的方法来构建它?

1 个答案:

答案 0 :(得分:6)

您传递的引用是正确的,而不是被复制的对象。从这个角度来看,在传递对app的引用时,您不会浪费额外的空间。

但是,我建议你不要这样做:如果你在任何地方传递app的引用,它告诉我的是你真的不知道你在这个或那个模块中需要什么。< / p>

您应该仔细规划您的依赖项并了解每个模块需要什么,以便您可以为应用程序中的每个模块传递正确的依赖项。

关于underscoremongodb这样的事情,你不应该做你正在做的事情。您应该只传递需要初始化的模块。对于underscoremongodb之类的内容,node.js会在您第一次require()时缓存该定义,因此您可以在需要的每个模块的顶部调用require

这不会导致任何性能损失,并且会使每个模块所需的库更清晰。

相关问题