2012-07-18 2 views
4

나는이 이런 식으로 뭔가 보이는 내 응용 프로그램이 사용하는 Socket.io 기능을 래핑 하나 개의 모듈 :node.js 모듈을 사용하면 어떤 경우 모듈이 두 번 실행됩니까?

// realtime.js 
var io = require('socket.io'), 
    sio; 

exports.init = function(expressServer) { 
    sio = io.listen(expressServer); 
} 

... 

주요 app.js 파일이 다른 모듈도 사용

// app.js 
var rt = require('./realtime.js'), 
    other = require('./other.js'); 
... 
rt.init(expressServer); 

모양을 rt.js

// other.js 
var rt = require('./realtime.js'); 
... 

내 질문 other.js과 app.js 모두 rt.js의 동일한 인스턴스를 것입니까?

answer on SO relating to redis

나를 위의 문장이 참 믿고 이어질하지만 the documentation here 년에는

다중 호출이 모듈 코드가 실행 여러 번 원인이 될 수 없습니다 ('foo는')를 필요로했다. 이것은 중요한 특징입니다. 그것으로, "부분적으로 완료된"객체가 반환 될 수 있으므로, 주기적으로 의존성을로드 할 수 있습니다.

이는 보장 할 수없는 것 같습니다.

마지막으로 this question은 파일 이름에 따라 다르며 rt.js 인스턴스가 하나뿐이므로 두 번 이상 실행하면 안됩니다. 이 경우 rt.js가 동일한 파일에만 종속되거나 require에 의해 지정된 경로에 의존합니다. 기본적으로 rt.js 및 other.js가 lib /에 있고 app.js가 other.js의 요구 사항을 한 단계 낮추고 app.js가 다른 파일의 rt.js를 가리키는 경우이 문제가 발생합니까?

누구든지 나를 혼란에 빠뜨리면 감사하게 생각합니다.

+0

왜 두 js 파일 모두에서 require를 호출합니까? app.js에서 모듈에 대한 참조를 전달하지 못하게하는 이유는 무엇입니까? –

+0

코드를 많이 변경하지 않고도 깨끗한 방법을 생각할 수 없었습니다. (app.js가 필요로하는 두 모듈이 서로 요구한다면, 설정을 변경하는 데 시간이 걸릴 것입니다). 그것이 필요한 것이면 나는 그것을 위해 모든 것이지만, 나는 또한 이것이 어떻게 작동하는지 궁금해합니다. :) 귀하의 의견을 보내 주셔서 감사합니다! –

+0

ok - 일반적으로 뭔가 (예 : redis)에 대한 참조가있는 경우 해당 호출을 모듈에 전달합니다.도움이 되었으면 좋겠다. –

답변

4

모듈은 현재 한 번만 평가되지만,이 모듈에 의존해서는 안됩니다. 모듈에 상태가 있으면 나쁜 습관으로 간주됩니다. 무엇이 sio에 대한 참조를 other.js로 전달하지 못하게합니까?

//realtime 
var io = require('socket.io'), 

exports.init = function(expressServer) { 
    return io.listen(expressServer); 
} 

// app.js 
var rt = require('./realtime.js'), 
    other = require('./other.js'); 
... 
var sio = rt.init(expressServer); 
// now ask other.js to use same sio instance 
other.use_sio(sio); 
+0

답변을 주셔서 감사합니다. 의존성을 다루는 명확한 방법입니다! –

0

두 개 이상의 장소에 socket.io를 설치하지 마십시오. 각 모듈이 다른 경로에서 패키지를 검색하는 다른 모듈에서 socket.io가 필요한 경우 각 모듈은 패키지의 별도 인스턴스를로드합니다.

응용 프로그램 디렉토리 레이아웃 :이 도움이

-module1 
--/npm_modules //has socket.io 
---/socket.io 
--/module1.js //requires socket.io from module1/npm_modules 

-module2 
--/npm_modules //has another socket.io installation 
---/socket.io 
--/module2.js //requires socket.io from module2/npm_modules (Does not create a reference to what was required in module1.) 

희망.

관련 문제