Как узлы-модули реализованы в node.js, как реализация функций и создание экземпляров одинаковы в socket.io - PullRequest
0 голосов
/ 12 апреля 2020
const io = require('socket.io')();
// or
const Server = require('socket.io');
const io = new Server();

Меня смущает следующий синтаксис

1) что такое socket.io (это класс или интерфейс, я проверил документацию в node.js, показанную как интерфейс)

2) Если это интерфейс, я думаю, что мы должны использовать класс для его использования (я не видел никакой документации для реализации интерфейса в javascript)

3) для понимания, я попробовал следующее (создано 2 файлы)

пример. js

module.exports =  function () {
  console.log("welcome to javascript");
}

использование. js

let imp = require('./example')()

Из следующих Ссылка, которую я узнал о require [https://nodejs.org/en/knowledge/getting-started/what-is-require/] [1]

Теперь я запутался, как реализован сокет и как следующие 2 синтаксиса равны

Если сокет это функция, которую мы можем вызвать с помощью

const io = require('socket.io')();

Если это класс, мы обычно делаем следующее (создаем экземпляр и используем его)

const Server = require('socket.io');
const io = new Server();

Но в документации они сказали оба Синтаксис равен как?

Один для исключения module.exports, а другой используется для создания экземпляра класса, как оба равны аль

1 Ответ

1 голос
/ 12 апреля 2020

Когда вы делаете это:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...