2012-10-24 7 views
1

Javascript와 jQuery를 사용하여 합리적인 크기의 클라이언트 측 웹 앱을 작성하려고합니다. 코드를 체계화하기 위해 Javascript 모듈 시스템을 읽고 AMD 모듈을 사용하기로 결정했습니다. 현재 curl.js를 제 모듈 로더로 사용하고 있지만, 특별히 그것에 매료 된 것은 아닙니다.상호 재귀 적 AMD 모듈

이제 불행히도 내 모듈 중 두 개가 상호 의존해야하는 문제에 맞서 있습니다. 나는 그냥 일하기를 기대하고 있었다. --- 그러나 실제로 일어나는 일은 앱을 로딩하는 것이 중간에 멈추고 모든 것이 멈추고 오류 메시지없이 멈추는 것입니다.

빠른 Google은 사실상 AMD와 상호 재귀 모듈에 대해서는 언급하지 않습니다. 제가 실제로 이것을 할 수 있습니까, 그렇다면 어떻게 할 수 있습니까? (다른 모듈 로더로 변경해야합니까?)

그렇지 않으면 상호 재귀 모듈을 지원하는 대체 모듈 시스템에 대한 제안이 있습니까?

+0

그들 만이 함께 갈 수 있다면, 같은 것들에 넣을 수 없습니까? 파일? – Bergi

+0

글쎄, 네, 그렇지만 모듈 사용의 모든 요점은 그 일을 피하는 것입니다 ... –

+0

예, 코드가 모듈화 된 경우에만 ... 그런 것들이 서로에 의존하면 모듈 로더가 어떤 모듈을 알아야합니까? 먼저 정의 (실행) 하시겠습니까? 너는 무엇을 기대 하느냐? – Bergi

답변

1

그래서 '상호 재귀'의 대체 이름이 '순환 종속성'이라는 것을 알게 된 후 온라인에서 일부 참조 (특히 require.js manual page)를 발견했습니다.

간략한 요약 : 아니오,이 작동하지 않습니다. 여러 가지 방법으로 라운드 할 수 있지만 근본적으로 그냥 작동하지 않습니다. 당신이 정말로 당신이 메소드를 호출 시간에 의해로드 된 그 NotLoadedYet을 보장 할 수있는 경우

define(
    ["require", "NotLoadedYet"], 
    function (require, NLY) 
    { 
     // NLY is undefined here 
     return { 
      doSomething: function() 
      { 
       var realNLY = require("NotLoadedYet"); // fetch the real NLY on demand 
       realNLY.doSomething(); // actuall call the method 
      } 
     }; 
    } 
); 
분명히

이 유일한 작품 :

가장 간단한 해결 방법은 명시 적 동기 require() 호출을 사용 종속성 체인을 파괴하는 것입니다.

이미 동적 지연 바인딩을 수행하는 언어로 동적 런타임 바인딩을 사용한다는 아이디어는 꽤 있지만 작동합니다. 한숨. 대신에 requirejs의 CommonJS 지원을 사용하도록 변경하는 약간의 기술이있는 것처럼 보이지만, 어떻게 작동하는지 모르겠다. 그래서 나는 이것을 고수하고있다.

실제로 수행 할 작업은 구현을 포함하는 NotLoadedYetImpl 모듈과 위의 메커니즘을 통해 프록시하는 NotLoadedYet 모듈을 구현하는 것입니다. 그것은 부끄러운 일입니다. 자바 스크립트는 객체의 모든 속성에 getters와 setter를 사용하지 않습니다. 아니면 자동으로 모두 수행 할 수도 있습니다 ...

+0

답변을 게시 해 주셔서 감사합니다 - 저를 미치게했던 비슷한 문제가있었습니다. – streetlight