qiankun微前端开发模式父应用频繁崩溃

428 阅读1分钟

qiankun微前端开发模式父应用频繁崩溃

背景

主应用是vue,使用vue-cli构建,子应用是react,使用create-react-app构建。子应用热更新时,主应用会频繁崩溃。

主应用端口号:8080

子应用端口号:3000

子应用热更新时,主应用会报这个错误

image-20220507151432305

原因分析

  1. 由于子工程html是主工程通过fetch请求拉取后,再处理塞入主工程html中。因此在当前服务看来,相当于只有一个8080端口在提供服务。

    image-20220507151604051

  2. 子工程入口文件被打入了热更新的逻辑,导致会发送 ws://localhost:8080/sockjs-node 请求 而不是正常情况下的 ws://localhost:3000/sockjs-node 请求。(有下图分析热更新源码知,默认情况下是根据location.port决定)

    // Connect to WebpackDevServer via a socket.
    var connection = new WebSocket(
      url.format({
        protocol: window.location.protocol === 'https:' ? 'wss' : 'ws',
        hostname: process.env.WDS_SOCKET_HOST || window.location.hostname,
        port: process.env.WDS_SOCKET_PORT || window.location.port,
        // Hardcoded in WebpackDevServer
        pathname: process.env.WDS_SOCKET_PATH || '/sockjs-node',
        slashes: true,
      })
    );
    

解决方法

通过自定义环境变量WDS_SOCKET_PORT为子工程webpack-dev-sercer提供的服务端口号,使子工程正常发送ws://localhost:3000/sockjs-node 请求

# /.env
WDS_SOCKET_PORT=3000

配置了自定义环境变量后,ws请求正常了

image-20220507152208559