NodeJS中的exports语句

时间:2017-03-10 12:37:38

标签: javascript node.js

我在 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;

index.js

中的以下内容
var server = require('./server');
server.start();

我不理解的是exports.start = start;行是如何工作的。 exports来自哪里?为什么index.js会调用server.start();而不是exports.start()的start方法?不是exports只是我们放在全局命名空间中的变量,通过将其作为全局变量exports的属性来使其可以访问其他模块的本地变量吗?

帮助!

1 个答案:

答案 0 :(得分:0)

Node将每个模块包装在它自己的IIFE中,该module提供exports__dirnamevar 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
  

我不理解的是exports.start = start行;是   工作。出口来自哪里?

start就像任何其他JS对象一样是一个对象。您在exports.start上附加了对exports的引用。

  

为什么index.js通过server.start()调用start方法;而不是exports.start()?

好问题。由于exports.start只是一个对象,require('./server').start()不会引用任何内容,除非您通过要求模块提供该引用。

但是,如果您的目标是没有本地变量,则可以这样做。

{{1}}