根本原因是开发与生产环境路径解析逻辑不同:开发服务器自动处理相对路径,而生产环境按页面URL解析;推荐将CSS和资源放入public目录并用绝对路径引用,或正确配置Webpack的publicPath以匹配部署路径。
link 样式在开发和生产环境表现不一致根本原因通常是路径解析逻辑不同:开发时 Webpack/Vite 的 dev server 会自动处理 /static/ 或 ./assets/ 这类相对路径,而构建后 HTML 中的 link href 被当作相对于当前页面 URL 解析。比如生产环境部署在子路径(如 /app/)但 CSS 里用了 url(./images/icon.png),浏览器就会去请求 /app/./images/icon.png,而非预期的 /app/static/images/icon.png。
public 目录统一托管静态资源路径Vite 和 Create React App 都把 public 目录下的文件原样复制到构建输出根目录,且可通过绝对路径直接引用。这是最稳妥的解法。
public/css/main.css
url() 都用以 / 开头的绝对路径,例如 background: url(/images/logo.svg)
public/images/ 下publicPath 影响 CSS 里的资源路径如果没用 public 目录,而是靠 Webpack 处理 CSS 中的 url(),必须匹配 output.publicPath 和实际部署路径:
publicPath: '/'(dev server 默认)https://example.com/my-app/,则需设 publicPath: '/my-app/'
url(logo.png) 会被打包成 /logo.png,但实际应为 /my-app/logo.png
src、字体等所有通过模块系统引入的资源有人尝试在构建后用脚本替换 HTML 中的 href,这不可靠:
url() 引用https://cdn.example.com/v1.2.3/)url() 或拼错路径,样式就断链,且控制台只报 404,不易定位真正要盯住的只有两处:HTML 中 link href 的路径是否与部署结构一致,以及 CSS 文件自身对资源的引用是否全部走绝对路径或由构建工具可控地重写。