【问题标题】:Nodejs app structureNodejs 应用结构
【发布时间】:2012-06-03 06:14:57
【问题描述】:

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

有没有更好/更简单的结构方式?

【问题讨论】:

    标签: javascript node.js express restify


    【解决方案1】:

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

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

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

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

    这不会导致任何性能损失,并且会更清楚每个模块需要什么库。

    【讨论】:

    • 嗯,这也有助于我的机箱干燥并使维护变得更加容易。好的,我明白你的意思了。顺便说一句,如果我确实从应用程序中删除我的库,你认为我仍然应该使用 server.pre() 之类的东西来传递我的应用程序还是再次依赖于 require 方法?
    • 我认为您应该尽可能使用require。这不仅可以清楚地说明您对每个模块的需求,而且可以解耦您的模块并促进它们将来在其他地方的使用。当太多东西相互依赖时,不仅难以调试,而且难以重用代码。
    • 另外,请记住 require() 缓存加载的模块,如果您在不同的文件中需要它,将重用相同的 underscore。因此,您可以根据需要随时使用它。
    猜你喜欢
    • 2012-01-15
    • 2019-07-04
    • 1970-01-01
    • 1970-01-01
    • 2017-05-21
    • 2019-03-24
    • 2013-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多