Laravel 8 不支持后端热更新,所谓“热更新失效”实为前端 HMR 与后端刷新流程未对齐或环境配置不当;应通过优化 Vite HMR、Sail 代理、OPcache 设置及清除视图/浏览器缓存,实现“保存即见效果”的高效开发闭环。

Laravel 8 本身不支持后端代码的热更新(Hot Reload),所谓“热更新失效”,本质是前端 HMR 和后端刷新流程没对齐,或者开发环境配置松散导致感知延迟。优化方向不是强行给 PHP 加热更,而是让「改完保存 → 看到效果」这个闭环尽可能快、无感、不打断上下文。
npm run dev 启动的 Vite HMR 是否真在工作
很多“热更新失效”其实卡在前端构建层。Laravel 8 默认用 Vite,但如果你手动替换成 Webpack 或残留旧配置,vite.config.js 里 server.hmr.overlay 被关掉、或 server.host 配错,都会导致 HMR 静默失败——页面不报错,但也不更新。
- 检查浏览器控制台是否有
[vite] hot updated日志;没有就说明 HMR 根本没触发 - 确认
vite.config.js中server.proxy正确指向 Laravel 后端(比如"/api": "http://localhost:8000"),否则 API 请求跨域失败,前端看似“更新了”,实际数据拉不到 - 避免在 Blade 模板中直接写
<script src="/build/...">——Vite 开发模式下应使用@viteBlade 指令,它会自动注入 HMR client 脚本
./vendor/bin/sail artisan serve 是否被正确代理
用 Laravel Sail 时,artisan serve 默认只监听 127.0.0.1:8000,而 Vite 的 proxy 通常发请求到 localhost:8000。在 Docker 环境下,这两个 localhost 不是同一个网络上下文,请求会超时或 502。
- 启动 Sail 时加
--no-cache参数确保容器用最新配置:./vendor/bin/sail up -d --no-cache - 修改
sail启动命令,在docker-compose.yml的laravel.test服务里加command: ["php", "artisan", "serve", "--host=0.0.0.0:8000"],让服务监听所有接口 - 前端 proxy 地址统一改成
http://laravel.test:8000(Docker 内网域名),而非localhost
Blade 模板修改后浏览器仍显示旧内容
这不是热更新问题,而是 Laravel 视图缓存或浏览器缓存干扰。开发环境下 APP_DEBUG=true 时,Blade 默认不缓存,但以下情况会绕过该机制:
-
php artisan view:cache手动执行过且未清除,导致storage/framework/views/下有编译文件;运行php artisan view:clear即可 - 浏览器强缓存了 HTML 响应(尤其用了
Cache-Control: max-age=3600的中间件);可在中间件中临时加response()->header('Cache-Control', 'no-cache, no-store, must-revalidate') - VSCode 的 “Live Server” 插件被误启用,它起了另一个静态服务器,和 Laravel 完全无关;关掉它,只用 Sail 或
artisan serve
PHP 代码改完要等几秒才生效?检查 OPcache
即使不用缓存,PHP 8.0+ 默认开启 OPcache,开发时它会缓存已编译的脚本字节码,导致改完 PHP 文件后首次访问仍是旧逻辑。
- 在
php.ini中确认以下配置(Sail 环境需改docker/php/php.ini):opcache.enable=1opcache.enable_cli=0opcache.revalidate_freq=0opcache.validate_timestamps=1 - 若用 XAMPP/PHPStudy,找到对应 php.ini,搜索
opcache并按上述设好,然后重启 Apache/Nginx - 验证是否生效:访问
http://your-app.test/opa.php(新建一个文件输出opcache_get_status()),看opcache_enabled是否为 true,revalidation_reason是否为 “timestamp”
真正影响体验的从来不是“能不能热更”,而是每次修改后是否需要手动刷新、清缓存、重启服务、切窗口、等转圈。把 Vite、Sail、OPcache 这三层的衔接点理清楚,90% 的“失效”感就消失了。剩下那 10%,通常是某个中间件偷偷写了响应缓存,或者你忘了关掉浏览器的“Disable cache”没勾上。


















