Экспорт модуля узла

В 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'). Обе стратегии указывают на один и тот же тип. Каково назначение такой конструкции?


person Krishna    schedule 10.09.2014    source источник
comment
возможный дубликат module.exports vs exports в nodeJS   -  person Ben Fortune    schedule 10.09.2014
comment
Бен, я понимаю, что exports — это переменная, изначально указывающая на module.exports, и если мы изменим module.exports, мы также должны переназначить экспорты. Но мои вопросы конкретно по линии экспорта. Стратегия = Стратегия; Здесь свойству Стратегии присваивается не новый объект, а сам тип Стратегии, который уже экспортирован.   -  person Krishna    schedule 10.09.2014
comment
Не уверен на 100%, но, может быть, это может быть из-за устаревших причин?   -  person leepowell    schedule 10.09.2014
comment
@leepowell, я тоже так думаю. Я посмотрел на модуль паспорт-http. Этот модуль предоставляет BasicStrategy и DigestStrategy. Пожалуйста, смотрите мой ответ.   -  person Krishna    schedule 17.09.2014


Ответы (2)


Он создает циклическую ссылку, которая указывает на основной объект. Он не использует дополнительную память и не вызывает утечки памяти. Это тот же объект, просто ссылка на top. Он очень часто используется в node.js (просто объекты потока журнала). Здесь, видимо, библиотека не использует его.

person user568109    schedule 10.09.2014
comment
Не могли бы вы указать какой-либо другой источник с аналогичной конструкцией, где используется это свойство? - person Krishna; 11.09.2014
comment
@Krishna См. https://github.com/joyent/node/blob/master/lib/_http_client.js#L457. Если вы зарегистрируете его, вы получите что-то вроде этого: 17251553/ - person user568109; 12.09.2014

Глядя на это дальше, похоже, что это сделано для обеспечения согласованности между различными стратегиями. Модуль может экспортировать несколько стратегий. Таким образом, модули будут иметь отдельное свойство для каждой стратегии. Но в данном случае модуль содержит единую стратегию. Таким образом, кажется, что он был представлен как модуль, так и свойство в модуле, так что module.Strategy вернет стратегию.

person Krishna    schedule 17.09.2014