在我的 node.js 应用程序的每个模块中需要一些相同的包的影响和替代方案?
Impact and alternatives on requiring some of the same packages in every modules of my node.js application?
假设我有一个应用程序如下:
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
变量设置为全局变量,但我不太喜欢这个选项。
还有其他选择吗?
在每个模块中系统地导入包有什么影响 - 在执行时间、内存方面?
我想了解节点引擎在这种情况下的行为。
是的,你应该再 require
一次。节点缓存所需的模块,所以你第二次 require
它实际上并不 运行 那个文件;它只是 returns 缓存的对象。因此内存影响基本上为 0(指向同一对象的额外指针,或多或少)并且执行时间同样可以忽略不计(通过模块名称在对象中查找的成本)。
这意味着两个 require
返回的对象不仅仅是相同的;它们实际上是同一个对象。对一个的任何更改都会影响另一个。正因为如此,您可以在一个地方扩展模块并在任何地方获得这些扩展。
假设我有一个应用程序如下:
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
变量设置为全局变量,但我不太喜欢这个选项。还有其他选择吗?
在每个模块中系统地导入包有什么影响 - 在执行时间、内存方面? 我想了解节点引擎在这种情况下的行为。
是的,你应该再 require
一次。节点缓存所需的模块,所以你第二次 require
它实际上并不 运行 那个文件;它只是 returns 缓存的对象。因此内存影响基本上为 0(指向同一对象的额外指针,或多或少)并且执行时间同样可以忽略不计(通过模块名称在对象中查找的成本)。
这意味着两个 require
返回的对象不仅仅是相同的;它们实际上是同一个对象。对一个的任何更改都会影响另一个。正因为如此,您可以在一个地方扩展模块并在任何地方获得这些扩展。