You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用setupProxy后Webpack热更新WebSocket报Invalid frame header错误

解决Webpack热更新"Invalid frame header"错误提示

原因

你的自定义WebSocket代理规则范围太宽,误拦截了Webpack热更新的WebSocket请求,代理服务器处理了不属于自身业务的WS请求,导致帧头解析出错。

具体解决办法

1. 精准匹配业务WebSocket路径

把代理规则限定在你业务专属的WS路径上,比如你的业务WS用/api/ws,就别用/*这种宽泛匹配:

const { createProxyMiddleware } = require('http-proxy-middleware');

module.exports = function(app) {
  // 只代理业务WS路径
  app.use('/api/ws', createProxyMiddleware({
    target: 'http://你的后端地址',
    ws: true,
    changeOrigin: true
  }));
};

2. 排除Webpack热更新的WS路径

如果必须用宽泛匹配,就明确排除Webpack热更新的路径(通常是/sockjs-node/,如果你的Webpack热更新用/ws也加上):

const { createProxyMiddleware } = require('http-proxy-middleware');

module.exports = function(app) {
  app.use(createProxyMiddleware('/*', {
    target: 'http://你的后端地址',
    ws: true,
    changeOrigin: true,
    pathRewrite: (path, req) => {
      // 遇到Webpack热更新的WS请求,跳过代理
      if (path.startsWith('/sockjs-node/') || path === '/ws') {
        return false;
      }
      return path;
    }
  }));
};

3. 修改Webpack热更新的WS路径(可选)

要是上面的方法没用,直接改Webpack热更新的WS路径,避免和业务代理冲突:
在webpack.config.js或craco.config.js(用Create React App的话)里加:

module.exports = {
  devServer: {
    hot: true,
    client: {
      webSocketURL: 'ws://localhost:3000/webpack-hot-ws'
    }
  }
};

这样热更新的WS请求会用/webpack-hot-ws,不会被你的业务代理拦截。

4. 屏蔽错误日志(兜底方案)

如果只是不想看到错误提示,不想改代理或配置,可以关闭Webpack客户端的错误日志:

module.exports = {
  devServer: {
    client: {
      logging: 'warn' // 只显示警告及以上,也可以设为'none'完全关闭
    }
  }
};

不过不推荐这个,会屏蔽其他有用的调试信息。

内容的提问来源于stack exchange,提问作者Hei Yui Wong

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 04:57:03