【问题标题】:Node module export节点模块导出
【发布时间】:2014-11-04 03:16:58
【问题描述】:

https://github.com/jaredhanson/passport-local/blob/master/lib/index.js 中有如下构造:

 /**
    * Module dependencies.
   */

  var Strategy = require('./strategy');



/**
 * Expose `Strategy` directly from package.
 */
exports = module.exports = Strategy;

/**
 * Export constructors.
 */
exports.Strategy = Strategy;

看起来 Strategy 被导出了两次 - 直接和通过属性 Strategy - 即 require('passport-local') 和 require('passport-local').Strategy 都指向相同的类型。这种结构的目的是什么?

【问题讨论】:

  • Ben,我知道 export 最初是一个指向 module.exports 的变量,如果我们改变 module.exports,我们也应该重新分配 export。但我的问题特别针对“exports.Strategy = Strategy;”这一行。这里分配给 Strategy 属性的不是新对象,而是 Startegy 类型本身,它已经被导出。
  • 不是 100% 肯定,但这可能是由于遗留原因?
  • @leepowell,我也这么认为。我查看了 passport-http 模块。该模块公开了 BasicStrategy 和 DigestStrategy。请看我的回答。

标签: node.js module node-modules passport-local


【解决方案1】:

它创建一个指向主对象的循环引用。它不会使用额外的内存或导致内存泄漏。它是同一个对象,只是对 top 的引用。它在 node.js 中非常常用(只是日志流对象)。这里显然图书馆没有使用它。

【讨论】:

【解决方案2】:

进一步观察,看起来这样做是为了在各种策略中保持一致性。一个模块可以导出多个策略。因此,模块将为每个策略具有单独的属性。但是,在这种情况下,该模块包含一个策略。因此,它似乎已作为模块和模块中的属性公开,这样 module.Strategy 将返回策略。

【讨论】:

    猜你喜欢
    • 2021-08-15
    • 1970-01-01
    • 2016-12-18
    • 2016-03-06
    • 2014-05-18
    • 2018-07-25
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多