Symfony6调用assets资源提示manifest.json缺失的解决方法
Symfony 6 静态资源引入报错及目录使用解答
报错根因
Symfony 6 默认启用了 Webpack Encore 配套的资产映射规则,Twig 中的assets()函数默认会读取public/build/manifest.json文件做静态资源路径版本化映射,如果你没有运行前端构建命令生成该文件,就会抛出对应异常。
1. manifest.json 缺失报错修复
根据你是否使用 Webpack Encore 管理前端资源,二选一操作即可:
- 不使用 Encore、手动管理静态资源
打开配置文件config/packages/assets.yaml,删除或注释掉默认的 manifest 路径配置:
执行命令清除项目缓存:framework: assets: # 注释掉下方默认配置即可关闭manifest文件校验 # json_manifest_path: '%kernel.project_dir%/public/build/manifest.json'php bin/console cache:clear,刷新页面后assets()函数会直接拼接相对于public目录的资源路径,不再查找manifest文件。 - 计划使用 Encore 管理编译类前端资源(如Sass、自定义JS、前端依赖构建)
直接执行以下命令安装依赖并完成首次构建:
构建完成后composer require symfony/webpack-encore-bundle npm install npm run buildpublic/build/manifest.json会自动生成,报错自动消除。
2. 根目录assets文件夹的使用规则
Symfony 6 根目录下自带的assets文件夹是 Webpack Encore 的前端源文件目录,不是公开可访问的静态资源目录,使用规则如下:
- 该目录存放需要编译处理的原始前端文件:比如未压缩的自定义JS、SCSS文件、需要合并压缩的前端素材等,执行
npm run build时,Encore 会自动将编译、压缩后的生产版本文件输出到public/build/目录下,前端模板中通过{{ assets('build/文件名') }}的方式引用即可。 - 如果你手动管理静态资源、不经过 Encore 编译(比如你当前使用的已经是压缩好的bootstrap.min.css、现成的图片/字体文件等生产可用资源),直接放在
public/目录下的自定义子目录即可,你之前创建的public/assets/目录完全可以正常使用,只要assets()函数内填写的路径相对于public目录正确就能正常加载。 - 不要将不需要编译的公开静态资源放到根目录的
assets文件夹中,该目录不在Web服务器的公开访问路径下,用户无法直接请求到该目录下的文件。
内容的提问来源于stack exchange,提问作者Johan
相关产品推荐
相关产品推荐

