node.js中的节点模块是如何实现的,socket.io中的函数实现和创建实例是如何相同的


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

我对以下语法感到困惑

1( 什么是socket.io(它是一个类还是接口我在node.js中查看了文档,它显示为接口(

2( 如果它是接口,我认为我们必须使用类来使用它(我没有看到任何用javascript实现接口的文档(

3( 为了理解,我尝试了以下(创建了2个文件(

example.js

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

使用.js

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

从以下链接中,我了解到需要[https://nodejs.org/en/knowledge/getting-started/what-is-require/][1]

现在我很困惑socket是如何实现的,以及下面两个语法是如何相等的

如果套接字是我们可以通过调用的函数

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

如果它是一个类,我们通常会做以下操作(创建一个实例并使用它(

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

但在文件中,他们说两种语法是相等的,怎么回事?

一个用于计算模块导出,另一个用于实例化一个类,说明两者如何相等

执行此操作时:

let x = require('someModule');

x的值是模块在模块中将module.exports的值设置为的值。它可以是任何东西。这完全取决于模块分配给它的内容。它通常是一个对象(具有属性(,但也可以是一个函数,有时甚至是一个具有属性的函数。

要查看socket.io为module.exports分配了什么,我们可以直接转到我们看到的源:

module.exports = Server;

那么,我们来看看什么是Server,并找到这个:

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')();

它首先获取导出的构造函数,然后调用它并将新创建的对象分配给CCD_ 7变量。

1(什么是socket.io(它是一个类还是接口我在node.js中查看了文档,它应该是接口(

服务器上的

socket.io导出一个用于创建服务器对象的构造函数。它既可以作为正则函数调用,也可以用new调用。

2(如果它是接口,我认为我们必须使用类来使用它(我没有看到任何用javascript实现接口的文档(

这是一个函数。Javascript没有称为接口的特定类型。socket.io代码以老式的方式(在class关键字存在之前(定义构造函数,尽管结果基本相同。它定义了一个构造函数,当被调用时,它将创建所需类型的对象。

3(现在我很困惑套接字是如何实现的,以及以下两种语法是如何相等的

在Javascript中,这两段不同的代码创建了相同的server对象:

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

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

第二种方法只是一种快捷方式,它不将require('socket.io')的中间结果分配给变量,而是直接调用它。只有当第一个函数调用返回一个函数时,它才会像这样工作。因此,第一个语法获得一个函数,将其分配给io变量,然后调用它。第二个语法获得该函数,并立即调用它,而不将其分配到变量。在这两种情况下,获取函数并调用它的结果都会出现在server变量中。

最新更新