Laravel 的 @vite 指令在生产环境默认不读取 manifest.json,需手动启用:配置 vite.config.js 的 build.manifest 为 true、outDir 为 'public/build',并在 @vite() 中指定子目录 'build',确保源路径(如 resources/js/app.js)与 manifest 中 key 严格一致。

为什么 vite build 生成的 manifest.json 在 Laravel 中默认不生效
Laravel 的 @vite 指令默认只处理开发时的 HMR,生产环境不会自动读取 public/build/manifest.json 去重写资源路径。它仍会按原始路径(如 /resources/js/app.js)输出,导致 404 —— 因为实际文件已被哈希重命名(如 /build/assets/app.a1b2c3d4.js)。
如何让 Laravel 正确使用 Vite 的 manifest.json
必须手动启用 manifest 支持,并确保 Vite 构建输出符合 Laravel 期望的结构:
- 在
vite.config.js中显式配置build.manifest为true,并确认build.outDir是'public/build' - 在
config/vite.php(或直接在 Blade 中)调用@vite(['resources/js/app.js'], 'build'),第二个参数指定子目录,使 Laravel 知道去public/build/manifest.json查找映射 - 确保
APP_URL设置正确(如https://yoursite.test),否则 manifest 中的路径可能被错误拼接为绝对 URL
export default defineConfig({
build: {
outDir: 'public/build',
manifest: true,
},
})
@vite 在生产环境如何解析 manifest.json 中的哈希路径
Laravel 内部通过 ViteManifestEntry 类读取 public/build/manifest.json,将原始路径(如 resources/js/app.js)映射为带 hash 的文件名(如 assets/app.8f2a3b4c.js),再拼上 APP_URL 和 build/ 前缀。关键点:
- manifest 文件必须存在且 JSON 格式合法;缺失或语法错误会导致整个
@vite指令回退到原始路径 - manifest 中的 key 是源文件相对路径(
resources/js/app.js),不是入口 HTML 路径;若你传入@vite(['/js/app.js']),Laravel 找不到对应 key - CSS 文件也需显式声明(如
@vite(['resources/js/app.js', 'resources/css/app.css'])),否则即使 CSS 被 JS 引入,也不会出现在 manifest 输出中
常见路径错误及修复方式
典型现象:页面加载 JS/CSS 404,Network 面板显示请求了 /build/assets/app.xxxx.js 但返回 404,或仍请求未哈希的原始路径。
- 检查
public/build/manifest.json是否生成:运行vite build后该文件必须存在,且内容类似{"resources/js/app.js": {"file": "assets/app.xxxx.js"}} - 确认
APP_URL不以/结尾(如APP_URL=https://test.com✅,APP_URL=https://test.com/❌,后者会导致双斜杠//build/...) - 避免在
@vite中混用绝对路径和相对路径:全部用resources/xxx开头,不要写./resources/xxx或/resources/xxx - 如果使用自定义
base(如base: '/static/'),需同步调整vite.config.js和 Laravel 的@vite(..., 'static')第二个参数










