ES6导入绑定语法咨询:socket.io绑定HTTP服务器的正确写法
解决ES6风格导入socket.io并绑定到HTTP服务器的问题
嘿,我明白你卡在ES6导入socket.io的语法上了!先给你直接上正确的写法,再解释为啥你之前的尝试出错了。
首先,ES5里的var io = require('socket-io')(server)其实是两步操作:
- 加载
socket.io模块,它默认导出一个函数 - 立刻用
server作为参数调用这个函数,得到socket.io的实例io
在ES6的import语法里,你不能像你试的那样把调用和导入写在一行,得拆成两步(或者用更简洁的写法,但核心逻辑不变):
正确写法一:常规分步写法
import express from 'express'; import http from 'http'; // 导入socket.io的默认导出(那个用来创建实例的函数) import socketIo from 'socket.io'; const app = express(); const server = http.createServer(app); // 调用导入的函数,传入server得到io实例 const io = socketIo(server);
正确写法二:动态导入紧凑写法(可选)
如果你想稍微紧凑一点,也可以用动态导入的方式,但需要你的环境支持顶级await或者放在async函数里:
import express from 'express'; import http from 'http'; const app = express(); const server = http.createServer(app); // 动态导入并调用函数 const io = (await import('socket.io'))(server);
不过一般推荐第一种常规写法,可读性更强且兼容性更好。
为啥你的尝试会报错?
import io from 'socket-io'(server):ES6的import语句有严格的语法规则,模块路径必须是字符串字面量,不能在后面直接加调用表达式,这行代码本身语法就不合法。import io(server) from 'socket-io':import后面只能跟绑定名称(比如变量名、解构语法),不能是函数调用,这也不符合import的语法规范。
这样写之后,你就能和ES5代码实现完全一样的功能,把socket.io绑定到你的HTTP服务器上啦!
内容的提问来源于stack exchange,提问作者Jake Miller
相关产品推荐
相关产品推荐

