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

标签 javascript node.js require node-modules

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

  • 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/

相关文章:

javascript - Node.js 需要函数父对象吗?

Node.js require 与 React.js import

javascript - 2018 年在 Typescript 中导入/需要没有 @types 的 nodejs 模块

javascript - 需要帮助定位翻转卡

javascript - 如何在我的 React 类中的接口(interface)中包含接口(interface)?

javascript - 如何改变一个对象的各级键的值?

c++ - Node.js 的原生 C++ 扩展 : "cloning" a Local< Value > in the constructor

javascript - jQuery PHP Mysql jSon 循环显示数据

javascript - Angular js $范围未定义

javascript - 如何将范围传递给 node-mysql 中的回调?