【问题标题】:How to use socket.io together with webpack-hot-middleware?如何将 socket.io 与 webpack-hot-middleware 一起使用?
【发布时间】:2016-02-08 15:48:20
【问题描述】:

我有一个使用 webpack-dev-middleware 和 webpack-hot-middleware 进行热模块替换 (HMR) 的 Koa 服务器,因此中间件使用 websocket 将更改推送到客户端。

但我的应用程序代码还需要在客户端和 Koa 服务器之间建立自己的 websocket 连接。我不知道如何实现这一目标?好像两者是矛盾的。我可以让它们并排吗?

我的服务器代码看起来像这样

const compiler = webpack(webpackConfig)
const app = new Koa()

app.use(webpackDevMiddleware(compiler, {
  quiet: true,
  noInfo: true
  stats: {
    colors: true,
    reasons: true
  }
})))

app.use(webpackHotMiddleware(compiler))

const server = require('http').createServer(app.callback())
const io = require('socket.io')(server)
io.on('connection', function() { console.log('socket connection!!') })

和我的客户类似

import Client from 'socket.io-client'
const io = Client()
io.on('connection', (socket) => {
  console.log('+++ io connected! ++++')
  io.on('disconnect', () => { console.log('disconnected', socket) })
})

HMR 套接字工作正常,但另一个正在尝试与 GET /socket.io/?EIO=3&transport=polling&t=1446911862461-0 并且这些请求都失败了。

如何创建不与 HMR 套接字冲突的 websocket?

【问题讨论】:

  • 你是如何解决这个问题的?我遇到了类似的问题,Express 代码可以工作,但 Koa 总是产生 404

标签: node.js express socket.io webpack koa


【解决方案1】:

这就是worked for me in an app I'm working on 我在同一个快递服务器上使用 webpack 热重载 + socket.io 的地方。

添加到您的package.json

"webpack-dev-middleware": "^1.4.0",
"webpack-hot-middleware": "^2.6.0"

在 webpack 配置的 plugins 部分:

plugins: [
   new webpack.optimize.OccurenceOrderPlugin(),
   new webpack.HotModuleReplacementPlugin(),
   new webpack.NoErrorsPlugin(),
],

快速应用的设置:

const http = require('http');
const express = require('express');

const webpack = require('webpack');
const webpackConfig = require('./webpack.config');
const compiler = webpack(webpackConfig);

// Create the app, setup the webpack middleware
const app = express();
app.use(require('webpack-dev-middleware')(compiler, {
  noInfo: true,
  publicPath: webpackConfig.output.publicPath,
}));
app.use(require('webpack-hot-middleware')(compiler));

// You probably have other paths here
app.use(express.static('dist'));

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

const PORT = process.env.PORT || 8090;

server.listen(PORT);

io.on('connection', (socket) => {
  // <insert relevant code here>
  socket.emit('mappy:playerbatch', playerbatch);
});

我为这个问题发布了一个赏金来帮助这个问题得到回答,尽管我已经让它适用于我自己的应用程序。

【讨论】:

  • 所以你不需要做任何特别的事情吗?对我来说,它看起来像普通的 express + socket.io 代码。我最终使用了 engine.io(socket.io 中的底层库),因为我意识到我只需要一个 websocket 而不是回退机制。这没有问题。
  • 中间件的放置顺序确实影响了我。
  • 我不知道这有什么不同。谢谢!
猜你喜欢
  • 2017-11-28
  • 2020-06-07
  • 2016-05-25
  • 2018-11-26
  • 2017-07-06
  • 2018-02-26
  • 2020-05-15
  • 2019-09-26
  • 1970-01-01
相关资源
最近更新 更多