【问题标题】:Should I pass package dependencies to a module function or just require them in the module file?我应该将包依赖项传递给模块函数还是只在模块文件中需要它们?
【发布时间】:2014-08-02 07:00:54
【问题描述】:

我知道可以通过将模块导出为函数并为您希望传递的每个变量提供参数来将变量传递给模块。例如

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

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

这样做有什么理由吗?在每个文件的顶部只需要('whatever')会不会更干净?据推测,跨不同文件的同一模块有许多 require() 不是问题,因为 node 会从它在运行时遇到的第一个 require() 实例中提取其缓存版本。首选哪种管理包依赖项的方法?

【问题讨论】:

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


    【解决方案1】:

    这样做有什么理由吗?

    将这种模式用于下划线、jquery、主干等常规模块是公然违反构建节点的基本 CommonJS 模式。不要这样做。只需使用 CommonJS 语法直接要求您的模块。对于测试和依赖注入,有一些与 CommonJS 兼容的方法,例如 rewireinjectr

    但是,与 express app 实例不同,因为它是具有特定配置的特定对象,因此可以将其传入。但是,express 4 消除了使用此模式的最常见需求,因为您可以挂载外部主应用程序中的子应用程序。

    【讨论】:

    • 关于 express 4 mount...你的意思是 app.use('/prefix', module) 吗?尽管在这种情况下,我肯定需要在模块中使用 express() 创建一个新的应用程序实例,这与传递旧的应用程序实例不同。 express 4 是如何解决这个问题的?
    • 在 express 4 中,每个子应用都可以独立执行var app = express(),定义自己的路由,然后“挂载”在外部应用实例中。这意味着您可以为您的 api 创建、配置和导出自己的 app 实例的应用程序,而主应用程序可以执行 mainApp.use('/api', api.app),与传递单个全局 app 相比,它具有更好的封装性和模块化使用路由围绕所有模块进行实例化。
    猜你喜欢
    • 1970-01-01
    • 2016-10-08
    • 1970-01-01
    • 2023-03-21
    • 2021-11-17
    • 2016-04-22
    • 2021-05-19
    • 2018-04-25
    • 1970-01-01
    相关资源
    最近更新 更多