我应该将包依赖项传递给模块函数还是仅在模块文件中需要它们?

时间:2014-06-12 03:49:55

标签: javascript node.js express dependency-injection dependency-management

据我所知,可以通过将模块导出为具有您希望传递的每个变量的参数的函数,将变量传递给模块。 E.g。

module.exports = module.exports = function (injectedVariable) {
  app.get('/whatever', function (req, res, next) {
     // Do something with injectedVariable
  });
};

我知道这对于传递" app"等变量非常有用。围绕不同的模块。但是,处理外部包依赖关系的首选模式是什么。我见过这样的代码。

App.js

var jquery = require('jquery');
var _ = require('underscore');
var backbone = require('backbone');
var express = require('express');
// Pretty much every other external library

var app = express();

// Code here might config some of the 3rd party modules

require('routes/main.js')(app, _, jquery, backbone, someOtherModule, someOtherModule2);
require('routes/main.js')(app, _, jquery, backbone, someOtherModule, someOtherModule2);
// Etc

// Init server etc

然后每个路由模块将导出一个函数,其中包含所有可用的参数,以支持传递给它们的包。

有没有理由这样做?在每个文件的顶部要求('无论什么')会不会更清晰?据推测,在不同文件中为相同模块设置许多require()不是一个问题,因为节点将从运行时遇到的第一个require()实例中提取存储的缓存版本。首选哪种管理包依赖关系的方法?

1 个答案:

答案 0 :(得分:1)

  

有没有理由这样做?

将此模式用于常规模块(如下划线,jquery,backbone),明显违反构建节点的基本CommonJS模式。不要这样做。只需要使用CommonJS语法直接使用您的模块。对于测试和依赖注入,有与CommonJS兼容的方法,例如rewireinjectr

然而,它与快速app实例不同,因为它是具有特定配置的特定对象,因此可以将其传入。但是,快速4消除了最多通常需要使用此模式,因为您可以在外部主应用程序中安装子应用程序。