модуль.экспорт не может быть установлен при передаче в качестве аргумента


Я строю свой пакет, используяBrowserify .

У меня есть следующее service.js:

(function (exports, require) {

     // ...
     var Service = function (name, region) {
         this.name = name;
         this.region = region;
         // ...
     }

     exports = Service;

})(module.exports, require);

Всякий раз, когда я пытаюсь require('./service') на другом модуле, я получаю пустой объект, как если бы объект exports никогда не был установлен.

Если я использую module.exports без инкапсуляции аргумента, все работает нормально:

(function (require) {

   // ...
     var Service = function (name, region) {
         this.name = name;
         this.region = region;
         // ...
     }

     module.exports = Service;

})(require);
Почему это происходит и почему это необходимо?
1 4

1 ответ:

В вашем первом примере example - это переменная, ограниченная областью действия вашей анонимной функции, и она указывает на module.exports. Когда вы говорите exports = Service, вы меняете то, что exports указывает на то, а не на что module.exports указывает на него.

Когда вы говорите module.exports = Service, вы изменяете свойство module, которое глобально ограничено.

Дополнительная иллюстрация:

(function (m, require) {

    // ...
    var Service = function (name, region) {
        this.name = name;
        this.region = region;
        // ...
    }

    m.exports = Service;

})(module, require);

m указывает на module, и когда мы устанавливаем m.exports, мы устанавливаем module.exports, так как m и module указывают на тот же объект.