To nie jest problem związany z pakietami sieci Web, ale właściwość modułów CommonJS.
Gdy najpierw wymagany jest moduł CommonJS, jego właściwość exports
jest inicjowana za pustym obiektem za kulisami.
module.exports = {};
Moduł może zdecydować o przedłużeniu tego exports
własności, ani zastąpić.
exports.namedExport = function() { /* ... */ }; // extends
module.exports = { namedExport: function() { /* ... */ } }; // overrides
Więc kiedy A
wymaga B
i B
wymaga A
tuż po, A
nie jest jeszcze stracony (która będzie produkować nieskończoną pętlę), ale jego obecny exports
nieruchomość jest zwracana. Ponieważ A
wymagało B
na samej górze pliku, przed wyeksportowaniem czegokolwiek, wywołanie require('A')
w module B
przyniesie pusty obiekt.
Typową poprawką dla zależności cyklicznych jest umieszczenie importu na końcu pliku, po eksportujesz zmienne wymagane przez inne moduły.
A
:
module.exports = { foo: 'bar' };
require('B'); // at this point A.exports is not empty anymore
B
:
var A = require('A');
A.foo === 'bar';
napisałem narzędzie, aby sprawdzić swój projekt WebPACK okrągłych zależności: https://github.com/DelvarWorld/webpack-cyclic-dependency- checker –