Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Nodejs应用程序结构_Javascript_Node.js_Express_Restify - Fatal编程技术网

Javascript Nodejs应用程序结构

Javascript Nodejs应用程序结构,javascript,node.js,express,restify,Javascript,Node.js,Express,Restify,我想知道我是否在根据最佳性能构建我的nodejs应用程序。我主要关心的是如何在模块周围移动我的应用程序引用 基本上,在我的app.js文件中,我声明了我的所有需求、库等: var app = { config : require('../../config.json'), restify : require('restify'), path : require('path'), mongo : require('mongodb'

我想知道我是否在根据最佳性能构建我的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')
};
在我的导出中,我传入了整个应用程序对象。现在,考虑到我对JavaScript的了解(如果我错了,你可以纠正我),这不会创建对象的新实例,它只是将对象作为指针传入,并在内存中引用相同的对象

现在,我发现自己除了在我的restify库(Express也可以这样做)中做之外(为了方便起见),还将应用程序值附加到服务器请求对象,如下所示:

app.server.pre(function (request, response, next) {
    request.app = app;
    return next();
});
因此,在每次请求中,如果我需要快速访问我的库声明、配置等,我可以轻松访问request.app。我也不认为这是一个问题,相同的逻辑对象充当指向相同内存空间的指针,所以我不会将内存使用率翻一番


是否有更好/更简单的方法来构造此结构?

关于传递引用而不是复制对象,您是正确的。从这个角度来看,在传递对
应用程序的引用时,您并没有浪费额外的空间

但是,我建议您不要这样做:如果您到处传递对
app
的引用,它告诉我的是,您并不真正知道在这个或那个模块中需要什么

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

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


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

Hmmmm,这也有助于使我的案例干涸,并使维护变得更加容易。好吧,我明白你的意思了。在这方面,如果我确实从应用程序中删除了我的库,您认为我是否仍然应该使用诸如server.pre()之类的东西来传递我的应用程序,或者再次使用require方法?我认为您应该尽可能使用
require
。这不仅可以明确每个模块需要什么,而且还可以使您的模块解耦,便于将来在其他地方使用。当有太多的东西相互依赖时,不仅很难调试,而且很难重用代码。另外,请记住,
require()
缓存加载的模块,如果需要在不同的文件中重用相同的
下划线
。因此,只要您需要,随时使用都是安全的。