NodeJS

2017-03-10 2 views
1
의 수출 문

내가 이해하지 못하는거야 무엇 하는 index.jsNodeJS

var server = require('./server'); 
server.start(); 

에서 다음 server.js

var http = require('http'); 

function start() { 
    function onRequest(request, response) { 
     console.log('onrequest called'); 
     response.writeHead(200, { 'Content-type': 'text/plain' }); 
     response.write("Hello world!"); 
     response.end(); 
    } 

    http.createServer(onRequest).listen(8888); 
    console.log("Server started!"); 
} 

exports.start = start; 

코드 그리고 그 다음은 어떻게 한 라인 exports.start = start;가 작동 중입니다. exports은 어디에서 오는가? 왜 index.js가 exports.start()이 아닌 server.start();의 시작 메소드를 호출합니까? exports은 전역 변수 exports에 대한 속성으로 다른 모듈에 액세스 할 수있는 로컬 변수를 만들기 위해 글로벌 네임 스페이스에 넣는 변수가 아닌가?

도움말!

+0

'exports'된다 module.exports' '와 같은 객체를 의미한다. 그냥'start' 속성에 함수'start'를 내보내므로 다른 모듈에서 호출 할 수 있습니다. – Li357

+0

@AndrewLi, 네 말이 맞아. https://nodejs.org/docs/latest/api/globals.html#globals_exports –

+0

'exports'는 명령문이 아닙니다. 규칙적인 JS 객체 일뿐입니다 – Li357

답변

0

노드가 인수를 제공하는 IIFE 그 자체에 각 모듈을 래핑 등 module, exports, __dirname, 그래서

대로 쓸 때 :

var http = require('http'); 

function start() { 
    function onRequest(request, response) { 
     console.log('onrequest called'); 
     response.writeHead(200, { 'Content-type': 'text/plain' }); 
     response.write("Hello world!"); 
     response.end(); 
    } 

    http.createServer(onRequest).listen(8888); 
    console.log("Server started!"); 
} 

exports.start = start; 

그것은 실제로 뭔가에 싸여되는 것 :

(function(module, exports, __dirname, ...) { 
    var http = require('http'); 

    function start() { 
     function onRequest(request, response) { 
      console.log('onrequest called'); 
      response.writeHead(200, { 'Content-type': 'text/plain' }); 
      response.write("Hello world!"); 
      response.end(); 
     } 

     http.createServer(onRequest).listen(8888); 
     console.log("Server started!"); 
    } 

    exports.start = start; 
})(module, exports, __dirname, ...) 

내가 싫어 이해는 어떻게 exports.start = start; 입니다. 수출은 어디서 오는가?

은 다른 JS 개체와 마찬가지로 개체입니다. 에 대한 참조를 exports.start에 첨부하고 있습니다.

index.js가 server.start()에 의해 start 메소드를 호출하는 이유는 무엇입니까? exports.start()가 아닌?

좋은 질문입니다. exports은 객체 일 뿐이므로 exports.start은 모듈을 요구하여 해당 참조를 제공하지 않는 한 아무 것도 참조하지 않습니다.

그러나 로컬 변수가없는 것이 목표라면이 작업을 수행 할 수 있습니다.

require('./server').start()

+0

__dirname은 전역에서 노출되지 않습니다. – Vikramaditya

+0

@Vikramaditya,'__dirname'은 모듈에 대해 전역 적이며'IIFE'에서 제공됩니다. https://nodejs.org/docs/latest/api/globals.html#globals_dirname –

+0

훌륭한 답을 보내 주셔서 감사합니다. @ raphael-rafatpanah 제 원래 질문의 두 번째 부분에서 제가 의미하는 바는 ... 왜 ' 우리는 단순히'require ('./ server'); exports.start();'in _index.js_? NodeJS가 내 보낸 속성의'exports' 배열로 시작한 다음, 각 모듈 IIFE에 차례대로 '내보내기'를 차례로 전달합니다.그들의 IIFE에 param으로서'exports '를받은 이들 모듈은'exports' 변수에 속성을 추가합니다. 따라서 index.js의'exports.start();'에 도달 할 때 server.js의'start()'를 알아야합니다. 맞습니까? – coffeeeee