browserify circular-dependency commonjs

¿Cómo gestiona browserify las dependencias circulares?



circular-dependency commonjs (1)

Estoy considerando mover una base de código grande basada en navegador a CommonJS (es una aplicación AngularJS 1.x escrita en TypeScript). La aplicación tiene dependencias circulares, por lo que creo que RequireJS está fuera de discusión.

¿Cómo gestiona Browserify las dependencias circulares? ¿Existen diferentes categorías de dependencias circulares que son / no son compatibles? ¿O algún consejo para trabajar con dependencias circulares con CommonJS / Browserify?


Browserify no agrega un tratamiento especial a las dependencias cíclicas y el comportamiento se hereda de Node.

Funciona como se muestra en la documentación de los módulos de nodo, que cito de manera integral a continuación:

Cuando hay llamadas requeridas () circulares, es posible que un módulo no haya terminado de ejecutarse cuando se devuelve.

Considera esta situación:

a.js:

console.log(''a starting''); exports.done = false; const b = require(''./b.js''); console.log(''in a, b.done = %j'', b.done); exports.done = true; console.log(''a done'');

b.js:

console.log(''b starting''); exports.done = false; const a = require(''./a.js''); console.log(''in b, a.done = %j'', a.done); exports.done = true; console.log(''b done'');

main.js:

console.log(''main starting''); const a = require(''./a.js''); const b = require(''./b.js''); console.log(''in main, a.done = %j, b.done = %j'', a.done, b.done);

Cuando main.js carga a.js, entonces a.js a su vez carga b.js. En ese punto, b.js intenta cargar a.js. Para evitar un bucle infinito, una copia inacabada del objeto de exportaciones a.js se devuelve al módulo b.js. b.js luego termina de cargarse, y su objeto de exportación se proporciona al módulo a.js.

Cuando main.js ha cargado ambos módulos, ambos están terminados. La salida de este programa sería así:

$ node main.js main starting a starting b starting in b, a.done = false b done in a, b.done = true a done in main, a.done = true, b.done = true

Se requiere una planificación cuidadosa para permitir que las dependencias de los módulos cíclicos funcionen correctamente dentro de una aplicación.