Зависимость модулей

239
03 марта 2017, 01:12

Есть три куска кода:

index.js

const module1 = require('./1');
const module2 = require('./2');

1.js

const methods = require('./2');
console.log('hello from 1');
console.log('1', methods);
module.exports = {
    foo() {console.log('one')},
    test() {console.log(module)},
};

2.js

const methods = require('./1');
console.log('hello from 2');
console.log('2', methods);
setTimeout(() => {
    console.log(methods);
}, 1000);
module.exports = {
    foo() {console.log('two')},
    test() {console.log(module)},
};

Подскажите пожалуйста, почему в консоли после выполнения таймаута, выведет пустой объект ? И если поменять в 1.js строки с экспортом модуля на

module.exports.foo = function() {console.log('foo')};
module.exports.test = function() {console.log(module)};

, то в консоли выведет заполненный объект функцией foo и содержимым модуля? В спецификации написано, что module не является глобальным объектом. Тогда почему происходит перезаписывание ?

Answer 1

https://nodejs.org/api/modules.html#modules_cycles

Потому что когда вы из модуля 2 вызвали модуль 1, он вернул дефолтный объект module.exports, который создаётся нодов при инициализации модуля.

Позже вы заменили его на другой объект (module.exports = {...}), но модуль 2 уже закешировал неактуальную копию.

Поэтому надо избегать таких циклов, а если по каким-то причинам так сделать не получается, то не заменять module.exports, а добавлять методы в него.

Например можно сделать так:

// 1.js
const methods = require('./2');
console.log('hello from 1');
console.log('1', methods);
Object.assign(module.exports, {
    foo() {console.log('one')},
    test() {console.log(module)},
});
READ ALSO
Почему не получается запустить hot module replacement (React,Webpack)?

Почему не получается запустить hot module replacement (React,Webpack)?

Не получается запустить hmrПерехожу по ссылке http://localhost:3000/webpack-dev-server/bundle

271
Сжатие в javascript разжатие в django/python

Сжатие в javascript разжатие в django/python

Необходимо передать большую строку с клиента на серверХочу чтобы она сжималась на клиенте с помощью javascript и разжималась на сервере с помощью...

297
Замер времени выполнения в mvc

Замер времени выполнения в mvc

В представлении "создать" есть есть форма в которой два поля: дата и номер документа

278