【问题标题】:Impact and alternatives on requiring some of the same packages in every modules of my node.js application?在我的 node.js 应用程序的每个模块中需要一些相同的包的影响和替代方案?
【发布时间】:2015-10-19 04:10:48
【问题描述】:

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

  • 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 设置为全局变量,但我不太喜欢这个选项。

  • 还有其他选择吗?

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

【问题讨论】:

    标签: javascript node.js require node-modules


    【解决方案1】:

    是的,您应该再次require。节点缓存了所需的模块,所以第二次你require 时它实际上并没有运行那个文件;它只是返回缓存的对象。因此内存影响基本上为 0(或多或少是指向同一个对象的额外指针),而执行时间同样可以忽略不计(通过模块名称查找对象的成本)。

    这意味着两个requires 返回的对象不只是相同的;它们实际上是同一个对象。对其中一个的任何更改都会影响另一个。因此,您可以在一个地方扩展模块并在任何地方获取这些扩展。

    【讨论】:

      猜你喜欢
      • 2016-04-29
      • 1970-01-01
      • 2021-07-29
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 2021-07-06
      相关资源
      最近更新 更多