在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的指向同一对象的额外指针),执行时间也可以忽略不计(模块名称在对象中查找的代价)。
这意味着这两个返回的对象不仅仅是相同的; 他们实际上是相同的对象。 任何一个改变都会影响另一个。 正因为如此,您可以将模块扩展到一个地方,并到处获得这些扩展。