module.exports = <ClassName>을 수행 할 때 순환 종속성에 문제가 있습니다.클래스가있는 NodeJS 4의 순환 종속성 처리
다음은 예입니다. ClassC에는 ClassB가 필요하고 ClassB에는 ClassA가 필요하고 ClassA에는 ClassC이 필요합니다. 내가 ClassC는 명백한 오류가 얻을 노드 main.js를 호출 할 때 그래서
/* classA.js */
'use strict';
const ClassC = require('./classC.js');
class ClassA {
foo() {
console.log('ClassA.foo');
var classC = new ClassC();
classC.bar();
}
}
module.exports = ClassA;
/* classB.js */
'use strict';
const ClassA = require('./classA.js');
class ClassB {
foo() {
console.log('ClassB.foo');
var classA = new ClassA();
classA.foo();
}
}
module.exports = ClassB;
/* classC.js */
'use strict';
const ClassB = require('./classB.js');
class ClassC {
foo() {
console.log('ClassC.foo');
var classB = new ClassB();
classB.foo();
}
bar() {
console.log('ClassC.bar');
}
}
module.exports = ClassC;
/* main.js */
'use strict';
const ClassC = require('./classC.js');
var classC = new ClassC();
classC.foo();
: 그리고 main.js에서 우리가 ClassC의 새로운 인스턴스를 생성하고 메소드를 호출, 그 통화의 사슬을 할 것입니다 해결되지 않았습니다. ClassC이를 ClassA에서 요구 한 때, 여전히 빈 객체가 반환 된 이후 classC.js의 말에 module.exports가 그 동안 ClassC로 덮어 쓸 ClassC로드의 과정 이었기 때문에
D:\Projects\test-circular-reference-es6\classA.js:8
var classC = new ClassC();
^
TypeError: ClassC is not a function
at ClassA.foo (D:\Projects\test-circular-reference-es6\classA.js:8:22)
at ClassB.foo (D:\Projects\test-circular-reference-es6\classB.js:9:16)
at ClassC.foo (D:\Projects\test-circular-reference-es6\classC.js:9:16)
at Object.<anonymous> (D:\Projects\test-circular-reference-es6\main.js:7:8)
at Module._compile (module.js:409:26)
at Object.Module._extensions..js (module.js:416:10)
at Module.load (module.js:343:32)
at Function.Module._load (module.js:300:12)
at Function.Module.runMain (module.js:441:10)
at startup (node.js:139:18)
이
발생 classA.js의 빈 객체에 대한 참조는 그대로 남아있었습니다.이 문제를 어떻게 처리해야합니까? NodeJS 4.x (ES6)에서 순환 참조와 내보내기 클래스를 모두 포함하는 것이 가장 좋은 방법은 무엇입니까?
- module.exports을 덮어 쓰기
module.exports.class = ClassC;
처럼 뭔가를하고new ClassC.class();
처럼 인스턴스화 그러나 이것은 또한 일반적으로 상속과 서투른 코드에 더 어려움을 도입하지 마십시오 내 옆에서나는 다음과 같은 가능한 방법을 참조하십시오.
- 대신이 유형의 문자를 처리 할 수 있으므로 TypeScript를 사용하십시오.
모든 의견을 환영합니다.
* 대신 TypeScript를 사용하십시오. *이 항목을 처리 할 것이기 때문에. * 정말요? – nils
@nils 및 새로운 문제를 만날 때마다 언어를 변경하십시오! –
ClassC의 생성자 안에 ClassB의'require'를 수행하는 변형 된 # 3이 있다고 생각합니다. 생성자 호출시 ClassB를 사용하는 객체는 이미 캐시에 있으므로 사용 준비가 완료됩니다. 문제는 코드가 정말 지저분 해집니다. – dazewell