在node.js应用程序的每个模块中需要一些相同的包的影响和替代方法?

假设我有一个应用程序如下:

  • server.js (main)需要不同的外部节点包,比如underscore.js

    var Underscore = require("underscore");

  • server.js也需要在我的应用程序中定义一些模块。 例如,它可能需要一个路由器模块来处理Express路由。

    var Router = require("./sources/router.js");

  • 我有我的router.js文件如下:

     var Router; Router = (function() { function Router(app, oauth) { app.get('/', function(request, response) { // ... }); } return Router; })(); module.exports = Router; 

问题:

  • 如果我想在我的Router模块中使用underscore ,我应该再次需要吗? 我应该为每个模块做到这一点吗? 有什么影响? 我会最终得到像这样的东西:

     var Router; Router = (function() { Router.prototype.underscore = require("underscore"); function Router(app, oauth) { app.get('/', function(request, response) { // this.underscore. ... // using underscore ... }); } return Router; })(); module.exports = Router; 

     var Underscore = require("underscore"); var Router = require("./sources/router.js"); router = new Router(); 
  • 我显然也可以在初始化Router时候注入一个参数,但是在我看来可能会使用几十个软件包的应用程序中,这看起来并不是一个可行的选项,特别是对于这个非常通用的软件包。

     var underscore = require("underscore"); var Router = require("./sources/router.js"); var router = new Router(underscore); 
  • 或者,我可以将underscore var设置为全局variables,但我不太喜欢这个选项。

  • 还有其他的select吗?

  • 系统地在每个模块中导入包的影响是什么 – 在执行时间,内存方面呢? 我想了解这种情况下节点引擎的行为。

是的,你应该再次require它。 节点caching所需的模块,所以第二次你require东西它并不真正运行该文件; 它只是返回caching的对象。 所以内存的影响基本上是0(或多或less的指向同一对象的额外指针),执行时间也可以忽略不计(模块名称在对象中查找的代价)。

这意味着这两个返回的对象不仅仅是相同的; 他们实际上是相同的对象。 任何一个改变都会影响另一个。 正因为如此,您可以将模块扩展到一个地方,并到处获得这些扩展。