我在 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
的属性来使其可以访问其他模块的本地变量吗?
帮助!
答案 0 :(得分:0)
Node将每个模块包装在它自己的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
我不理解的是exports.start = start行;是 工作。出口来自哪里?
start
就像任何其他JS对象一样是一个对象。您在exports.start
上附加了对exports
的引用。
为什么index.js通过server.start()调用start方法;而不是exports.start()?
好问题。由于exports.start
只是一个对象,require('./server').start()
不会引用任何内容,除非您通过要求模块提供该引用。
但是,如果您的目标是没有本地变量,则可以这样做。
{{1}}