我从socket.io docs获得了以下代码:
var server = require('http').createServer();
var io = require('socket.io')(server);
io.on('connection', function(socket){
socket.on('event', function(data){});
socket.on('disconnect', function(){});
});
server.listen(3000);
第二行的语法对我来说似乎很奇怪:
var io = require('socket.io')(server);
我理解的是require
是一个以socket.io
为参数的函数。但为什么server
最终会出现?
答案 0 :(得分:0)
require()
函数调用从模块返回module.exports
对象。该对象可以是“构造函数”(函数是对象),其被设计为被调用以初始化模块。这就是这种情况,并且这样做的原因是因为模块需要一个参数(服务器对象)来初始化自己。
您的代码:
var io = require('socket.io')(server);
可以被认为更简单:
// get the socket.io module
var io_module = require('socket.io');
// call the socket.io constructor to initialize a socket.io instance that
// is hooked up to a particular server
var io_instance = io_module(server);
因此,您的单行代码实际上只是这个两步流程的快捷方式,它不会保留模块本身的句柄。
在socket.io模块内部,它看起来像这样:
module.exports = function(server) {
// called to initialize the module
// create a socket.io instance and return it
// ...
return instance;
}