假设我有一个应用程序如下:
server.js
(main) 需要不同的外部 Node 包,例如underscore.js
。var Underscore = require("underscore");
server.js
也需要我自己的应用程序中定义的一些模块;例如,它可能需要一个 Router 模块来处理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
时将其作为参数注入(inject),但在我看来,这在我最终可能会使用数十个包的应用程序中并不是一个可行的选择,尤其是像这样的非常通用的包。var underscore = require("underscore"); var Router = require("./sources/router.js"); var router = new Router(underscore);
或者,我可以将
underscore
var 设置为全局变量,但我不太喜欢这个选项。还有其他选择吗?
在每个模块中系统地导入包对执行时间、内存有何影响? 我想了解 Node 引擎在这种情况下的行为。
最佳答案
是的,你应该再次require
它。 Node 缓存所需的模块,因此当您第二次require
时,它实际上并没有运行该文件;它只是返回缓存的对象。因此,内存影响基本上为 0(指向同一对象的额外指针,或多或少)并且执行时间同样可以忽略不计(通过模块名称在对象中查找的成本)。
这意味着两个 require
返回的对象不仅相同;它们实际上是同一个对象。对一个的任何更改都会影响另一个。正因为如此,您可以在一个地方扩展模块并在任何地方获得这些扩展。
关于javascript - 在我的 node.js 应用程序的每个模块中需要一些相同的包的影响和替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31679106/