'Vite Reload Loop

I am trying to finish a migration away from Parcel and into Vite. We use caddy to reverse proxy a custom domain locally through a Docker container. The issue I'm having is that when I load the client in browser it continuously refreshes, the console saying that vite is connecting, then "server connection lost, polling for restart" in a loop.

Here is the vite.config.json:

// @ts-ignore
import tailwindcss from "@tailwindcss/jit";
import react from "@vitejs/plugin-react";
// import reactRefresh from "@vitejs/plugin-react-refresh";
// @ts-ignore
import dotenv from "dotenv";
// import postcssImport from "postcss-import";
import presetEnv from "postcss-preset-env";
import { defineConfig } from "vite";

// export default (() => {
// Object.assign(process.env, loadEnv("", ".."));
// dotenv.config({ path: "../.env" });
// now you can access config with process.env.{configName}

export default defineConfig({
  server: {
    host: "0.0.0.0",
    // hmr: false,
    port: 1234,
  },
  plugins: [react()],
  css: {
    postcss: {
      plugins: [
        tailwindcss,
        presetEnv({ stage: 1 }),
      ],
    },
  },
});
// });

I've pull the container logs and don't see any crashes reported. I've tried toying with the config but to no real effect.



Solution 1:[1]

I had a similar issue and using the clientPort option in the the config solved it form me.

I'm also using Caddy inside Docker and here's my config:

:80 {
    reverse_proxy /api/* back:3000
    reverse_proxy /graphql back:3000
    reverse_proxy front:8080
}

I use it as a reverse proxy and here "front" makes reference to my Vue app served by Vite in development mode.

By adding this in my vite.config.ts it fixed the problem.

 server: {
    port: 8080,
    host: "0.0.0.0",
    hmr: {
      clientPort: 80,
    },
  },

Link to vite doc - server.hmr config

Not sure if that's the correct solution. Hope it helps.

Solution 2:[2]

I had a similar problem using nginx with ssl. It was trying on port 80 with ws instead of wss. Your details will be different, but I looked at the logs to see what nginx was doing, then looked in the browser to see what it was trying to do. This is my (partial) vite.config.js:

export default defineConfig({
  server: {
    // hot module reload for dev server
    hmr: {
      host: 'yourhost',
      protocol: 'wss',
      clientPort: 443
    }
  }
})

Solution 3:[3]

I am also in the process of migrating a Vue app to Vite. Therefore I changed the ports in docker-compose.yml from the standard-Vue 8080->8080 to Vite's 3000->8080 (to keep the outward-facing port the same).

version: "3.7"
services:
        ...
        ports:
        - 8080:3000

However, Vite would not know about this port remapping. Thus I needed to add clientPort: 8080 (my actually exposed port) to vite.config.js:

export default defineConfig({
  ...
  server: {
    hmr: {
      clientPort: 8080,
    },
  }
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 HamzStramGram
Solution 2
Solution 3 Stefan_EOX