修改Vite outDir为public后Laravel 9.41出现manifest未找到错误
Laravel 9.41 Vite输出目录配置问题解决
问题
修改vite.config.js将Vite输出目录设为public后,执行npm run build报错:
Vite manifest not found at:
E:\oblia\obilia_site\public\build/manifest.json
npm run dev可正常运行,但build时Laravel仍在public/build下查找manifest文件,需求是让所有资源直接存放在public根目录而非子文件夹。
当前配置文件如下:
import { defineConfig } from "vite"; import { viteStaticCopy } from "vite-plugin-static-copy"; import laravel from "laravel-vite-plugin"; export default defineConfig({ base: "/", build: { outDir: "public", emptyOutDir: false, }, plugins: [ laravel({ input: [ "resources/css/bootstrap.min.css", "resources/css/font-awesome.min.css", "resources/css/feather.css", "resources/css/owl.carousel.min.css", "resources/css/magnific-popup.min.css", "resources/css/lc_lightbox.css", "resources/css/bootstrap-select.min.css", "resources/css/dataTables.bootstrap5.min.css", "resources/css/select.bootstrap5.min.css", "resources/css/dropzone.css", "resources/css/scrollbar.css", "resources/css/datepicker.css", "resources/css/flaticon.css", "resources/css/notiflix.min.css", "resources/css/style.scss", "resources/css/override.scss", //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ "resources/js/jquery-3.6.0.min.js", "resources/js/popper.min.js", "resources/js/bootstrap.min.js", "resources/js/magnific-popup.min.js", "resources/js/waypoints.min.js", "resources/js/counterup.min.js", "resources/js/waypoints-sticky.min.js", "resources/js/isotope.pkgd.min.js", "resources/js/imagesloaded.pkgd.min.js", "resources/js/owl.carousel.min.js", "resources/js/theia-sticky-sidebar.js", "resources/js/lc_lightbox.lite.js", "resources/js/bootstrap-select.min.js", "resources/js/dropzone.js", "resources/js/jquery.scrollbar.js", "resources/js/bootstrap-datepicker.js", "resources/js/jquery.dataTables.min.js", "resources/js/dataTables.bootstrap5.min.js", "resources/js/anm.js", "resources/js/notiflix.min.js", "resources/js/bootstrap-slider.min.js", "resources/js/chart.js", "resources/js/custom.js", "resources/js/app.js", "resources/js/init.js", ], refresh: true, }), viteStaticCopy({ targets: [ { src: "resources/images", dest: "" }, { src: "resources/fonts", dest: "" }, { src: "resources/files", dest: "" }, ], }), ], });
原因
Laravel Vite插件默认将资源打包到public/build目录,并且默认从该路径读取manifest文件。你仅修改了Vite核心的outDir参数,但未同步配置Laravel插件的manifest查找路径,也没调整Vite的资源输出子目录设置。
开发环境(npm run dev)下Vite通过开发服务器加载资源,不依赖manifest文件,所以不会报错;生产构建时生成manifest后,Laravel仍按默认路径查找,导致找不到文件。
解决方案
修改vite.config.js,补充Laravel插件的buildDirectory配置,调整Vite的assetsDir参数,并优化静态资源复制路径:
import { defineConfig } from "vite"; import { viteStaticCopy } from "vite-plugin-static-copy"; import laravel from "laravel-vite-plugin"; export default defineConfig({ base: "/", build: { outDir: "public", emptyOutDir: false, assetsDir: ".", // 让编译后的资源直接输出到public根目录 }, plugins: [ laravel({ input: [ // 保持原输入文件不变 "resources/css/bootstrap.min.css", "resources/css/font-awesome.min.css", // ... 省略其他输入文件 "resources/js/init.js", ], refresh: true, buildDirectory: "", // 告诉插件到public根目录查找manifest.json }), viteStaticCopy({ targets: [ { src: "resources/images/**/*", dest: "images" }, { src: "resources/fonts/**/*", dest: "fonts" }, { src: "resources/files/**/*", dest: "files" }, ], }), ], });
关键配置说明
build.assetsDir: ".":Vite默认会把编译后的js、css等资源放到assets子目录,设置为.后资源直接输出到outDir(即public)的根目录。buildDirectory: "":Laravel Vite插件默认的构建目录是build,设为空字符串后,插件会到public根目录读取manifest.json。viteStaticCopy路径优化:原配置将静态文件直接复制到public根目录,容易和编译后的资源冲突,改为指定子目录(images、fonts、files)更安全,也符合常规目录结构。- 注意:若设置
emptyOutDir: true会清空public目录,执行前请确认目录下的.htaccess、favicon.ico等重要文件已备份或无需保留。
内容的提问来源于stack exchange,提问作者rootShiv
相关产品推荐
相关产品推荐

