Saltar al contenido

Cómo lidiar con las dependencias cíclicas en Node.js

Te recomendamos que revises esta solución en un entorno controlado antes de enviarlo a producción, un saludo.

Solución:

Intente establecer propiedades en module.exports, en lugar de reemplazarlo por completo. P.ej, module.exports.instance = new ClassA() en a.js, module.exports.ClassB = ClassB en b.js. Cuando crea dependencias de módulos circulares, el módulo requerido obtendrá una referencia a un módulo incompleto module.exports desde el módulo requerido, al que puede agregar otras propiedades más tarde, pero cuando configura todo module.exportsen realidad crea un nuevo objeto al que el módulo requerido no tiene forma de acceder.

Mientras que node.js permite circular require dependencias, ya que ha descubierto que puede ser bastante desordenado y probablemente sea mejor reestructurar su código para no necesitarlo. Tal vez cree una tercera clase que use las otras dos para lograr lo que necesita.

[EDIT] no es 2015 y la mayoría de las bibliotecas (es decir, Express) han realizado actualizaciones con mejores patrones, por lo que las dependencias circulares ya no son necesarias. recomiendo simplemente no usarlos.


Sé que estoy desenterrando una respuesta anterior aquí … El problema aquí es que module.exports está definido después necesita ClaseB. (que muestra el enlace de JohnnyHK) Las dependencias circulares funcionan muy bien en Node, simplemente se definen sincrónicamente. Cuando se usan correctamente, en realidad resuelven muchos problemas comunes de los nodos (como acceder a express.js app de otros archivos)

Solo asegúrese de que sus exportaciones necesarias estén definidas antes de necesita un archivo con una dependencia circular.

Esto se romperá:

var ClassA = function();
var ClassB = require('classB'); //will require ClassA, which has no exports yet

module.exports = ClassA;

Esto funcionará:

var ClassA = module.exports = function();
var ClassB = require('classB');

Uso este patrón todo el tiempo para acceder a express.js app en otros archivos:

var express = require('express');
var app = module.exports = express();
// load in other dependencies, which can now require this file and use app

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *