Nodejs app结构

pil*_*guy 5 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')
};
Run Code Online (Sandbox Code Playgroud)

在我的导出中,我传递了整个app对象.现在,鉴于我对JavaScript的了解(如果我错了,你可以纠正我),这不会创建对象的新实例,它只是将对象作为指针传入并在内存中引用相同的对象.

现在我发现自己除此之外(为了方便)在我的restify库中(可以用Express完成),我将app值附加到服务器请求对象,如下所示:

app.server.pre(function (request, response, next) {
    request.app = app;
    return next();
});
Run Code Online (Sandbox Code Playgroud)

因此,对于每一个请求,如果我需要快速访问我的任何库声明,配置等,我可以轻松访问request.app.我也不认为这是一个问题,同样的逻辑,对象作为一个指针返回到相同的内存空间,所以我不会加倍内存使用或任何东西.

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

zia*_*aab 6

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

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

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

关于underscore或者mongodb,你不应该做你正在做的事情.您应该只传递需要初始化的模块.对于类似underscoreor的东西mongodb,node.js会在第一次缓存定义时require(),因此您可以真正调用require需要它的每个模块的顶部.

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