Golpeando este problema exacto actualmente:
FileA: var b = require file B var c = require file C FileB: var a = require file A FileC: var a = require file ACuando ejecuto el código, aparece un error en el archivo C:
A.doSomething is not a functionLancé un depurador allí y vi que A es un objeto vacío. Lo que es realmente extraño es que solo obtengo un error en el Archivo C, pero no en el Archivo B. Muy confundido aquí.
Este no es un problema del paquete web sino una propiedad de los módulos CommonJS.
Cuando se requiere por primera vez un módulo CommonJS, su propiedad de exports se inicializa en un objeto vacío en segundo plano.
module.exports = {}; Luego, el módulo puede decidir extender esta propiedad de exports o anularla.
exports.namedExport = function() { /* ... */ }; // extends module.exports = { namedExport: function() { /* ... */ } }; // overrides Entonces, cuando A requiere B y B requiere A inmediatamente después, A no se vuelve a ejecutar (lo que produciría un ciclo infinito), pero se devuelve su propiedad de exports actual. Dado que A requería B en la parte superior del archivo, antes de exportar cualquier cosa, la llamada require('A') en el módulo B producirá un objeto vacío.
Una solución común para las dependencias circulares es colocar las importaciones al final del archivo, después de haber exportado las variables que necesitan otros módulos.
A :
module.exports = { foo: 'bar' }; require('B'); // at this point A.exports is not empty anymore B :
var A = require('A'); A.foo === 'bar';