Vite copies files in public to the build untouched, but it runs files in src/assets through its build pipeline when your code imports them.
public: Vite serves these files at the root path, so you reference them with absolute paths such as /favicon.ico. Vite does not process them, and they keep their original names in production. Use it for favicons, robots.txt and manifest files.
src/assets: you import these files in JavaScript or CSS. Each gets a hashed file name, plugins can process it, and only the files your code references reach the build. Use it for images, fonts and component CSS.
// src/assets - processed and hashed
import logo from './assets/logo.png'
// public - served directly
// Reference as '/logo.png' in HTML
Rewriting in plainer words…
This answer doesn't lend itself to a diagram - it reads best . No credits were charged.