NodeJS

2017-03-10 7 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();で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

ノードは、あなたが書くときになどmoduleexports__dirname、などの引数

を提供し、それ自身のIIFE内の各モジュールをラップ:

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; です。輸出はどこから来ていますか?

exportsは、他のすべての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 私の元の質問の第2部では、私たちは単純に 'require( './ server'); exports.start(); '_index.js_?私は、NodeJSがエクスポートされたプロパティの 'exports'配列で始まり、次にそれらのモジュールIIFEに遭遇したときにその' exports'を順番に渡すと仮定しています。IIFEへのパラメータとして 'exports'を受け取ったこれらのモジュールは、' exports'変数にプロパティを追加しています。したがって、index.jsの 'exports.start();'に達すると、それはserver.jsの 'start()'であることが分かります。 – coffeeeee