我想知道我是否正在相应地构建我的 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 值附加到服务器请求对象,如下所示:
app.server.pre(function (request, response, next) {
request.app = app;
return next();
});
因此,如果我需要快速访问我的任何库声明、配置等,我可以根据每个请求轻松访问 request.app。我也不认为这是一个问题,相同的逻辑对象充当返回相同内存空间的指针,所以我不会加倍内存使用或任何事情。
有没有更好/更简单的方法来构建它?
请您参考如下方法:
关于传递引用而不是复制对象,你是正确的。从这个 Angular 来看,在将引用传递给您的 app
时,您并没有浪费额外的空间。
但是,我建议您不要这样做:如果您到处传递对 app
的引用,它告诉我的是您并不真正知道在这个或那个中需要什么模块。
您应该仔细规划您的依赖项并了解每个模块需要什么,以便您可以为应用中的每个模块传递正确的依赖项。
关于像 underscore
或 mongodb
这样的事情,你不应该做你正在做的事情。您应该只传递需要初始化的模块。对于 underscore
或 mongodb
之类的东西,node.js 会在您第一次 require()
时缓存定义,因此您可以真正调用 require
在每个需要它的模块的顶部。
这不会产生任何性能损失,并且会更清楚每个模块需要什么库。