Когда вы делаете это:
let x = require('someModule');
Значение x
- это то, что модуль устанавливает в модуле значение module.exports
. Это может быть буквально что угодно. Это полностью зависит от модуля, что они назначают на это. Это часто объект (со свойствами), но он также может быть функцией, а иногда даже функцией со свойствами.
Чтобы увидеть, что socket.io назначает module.exports
, мы можем go вправо источник , где мы видим:
module.exports = Server;
Итак, мы go посмотрите, что такое Server
и найдите this :
function Server(srv, opts){
if (!(this instanceof Server)) return new Server(srv, opts);
if ('object' == typeof srv && srv instanceof Object && !srv.listen) {
opts = srv;
srv = null;
}
opts = opts || {};
this.nsps = {};
this.parentNsps = new Map();
this.path(opts.path || '/socket.io');
this.serveClient(false !== opts.serveClient);
this.parser = opts.parser || parser;
this.encoder = new this.parser.Encoder();
this.adapter(opts.adapter || Adapter);
this.origins(opts.origins || '*:*');
this.sockets = this.of('/');
if (srv) this.attach(srv, opts);
}
Из этого видно, что это функция конструктора, которая может быть вызвана как:
const x = new Server(...);
или как:
const x = Server(...);
Итак, ответ таков:
require('socket.io')
дает вам функцию конструктора.
Этот конструктор Функция может быть вызвана либо с помощью new
, либо просто как обычная функция, и она может возвращать то же самое, новый объект сервера.
Итак, когда вы делаете это:
const server = require('socket.io')();
сначала получает экспортированную функцию конструктора, а затем вызывает ее и присваивает вновь созданный объект переменной server
.
1) что такое socket.io (это класс или интерфейс, который я проверил документация в node.js это должен быть интерфейс)
socket.io на сервере экспортирует функцию конструктора для создания сервера Вер объект. Его можно вызывать как обычную функцию или с помощью new
.
2) Если это интерфейс, я думаю, что мы должны использовать класс для его использования (я не видел никакой документации для реализации интерфейс в javascript)
Это функция. Javascript не имеет определенного типа c, называемого интерфейсом. Код socket.io определяет конструктор старомодным способом (до того, как существовало ключевое слово class
), хотя результат во многом совпадает. Он определяет функцию конструктора, которая при вызове создаст объект нужного типа.
3) Теперь я запутался, как реализован сокет и как следующие 2 синтаксиса равны
В Javascript эти два разных куска кода создают один и тот же server
объект:
const io = require('socket.io');
const server = io();
и
const server = require('socket.io')();
Второй - это просто ярлык, который не Не присваивать промежуточный результат из require('socket.io')
переменной, а просто вызывать его напрямую. Так будет работать, только когда первый вызов функции вернет функцию. Итак, первый синтаксис получает функцию, назначает ее переменной io
и затем вызывает ее. Второй синтаксис получает функцию и немедленно вызывает ее, не назначая ее переменной. В обоих случаях результат получения функции и ее вызова заканчивается в переменной server
.