Phoenix框架:修改资产后未自动更新,需执行mix phx.digest才生效求助
我之前也踩过这个一模一样的坑——明明日志显示检测到变更、编译完成,浏览器也自动重载了,但priv/static目录里的资产就是没实际更新,非得跑mix phx.digest再加强制刷新才能看到变化。折腾了好一阵,整理出几个靠谱的排查方向:
1. 先检查开发环境的Endpoint配置
打开config/dev.exs,确认静态资源服务的配置没搞错:
- 别在开发环境里配置
cache_static_manifest: "priv/static/cache_manifest.json",这是生产环境用的,开了会优先读digest后的缓存文件。 - 确认
live_reload的patterns覆盖了你修改的文件路径,比如js/css文件的匹配规则有没有写错。 - 检查
Plug.Static的缓存设置,开发环境应该把缓存时间拉到最短,比如:
plug Plug.Static, at: "/", from: :your_app, gzip: false, cache_control_for_etags: "public, max-age=0"
2. 确认构建工具的输出路径
不管你用esbuild、webpack还是Tailwind,一定要确保它们的输出目录是priv/static。比如esbuild的配置文件里,outdir是不是指向正确的位置?
// esbuild.config.js 示例 require('esbuild').build({ entryPoints: ['js/app.js'], bundle: true, outdir: '../priv/static/js', // 这里要对应到你的priv/static目录 sourcemap: true, watch: true, }).catch(() => process.exit(1))
要是输出路径错了,构建工具确实会报编译完成,但文件根本没写到priv/static里,自然看不到变化。
3. 排查文件权限问题
有时候系统权限会坑人——构建工具可能没权限写入priv/static目录。你可以手动在priv/static/js里创建个测试文件试试,要是创建不了,就给目录加读写权限:
chmod -R 755 priv/static
另外,确认你运行mix phx.server的用户对这个目录有写入权限。
4. 检查浏览器缓存的“隐形干扰”
虽然你说强制刷新后有用,但有时候live reload的重载可能没绕过浏览器缓存。试试打开浏览器开发者工具,在「网络」选项卡勾选「禁用缓存」,再修改文件看看能不能实时生效。同时也看看控制台里有没有live reload的正常日志,比如“Live reload enabled”之类的,确认websocket连接没断。
5. 排查是否有多余的缓存中间件
要是你在开发环境不小心启用了第三方缓存工具(比如Cachex),或者自己加了缓存中间件,可能会把静态资源缓存起来。检查一下代码里有没有在开发环境不该开的缓存配置,把它们关掉试试。
6. 重启所有相关进程
有时候构建工具的watch进程会卡住,虽然日志显示编译完成,但实际没写入文件。试试彻底关掉mix服务器和构建工具的进程,然后重新运行mix phx.server,说不定就能正常更新了。
最后,要是以上都没用,可以试试删除priv/static下的所有文件,然后重新构建一次——说不定是旧的digest文件和新文件冲突了。
内容的提问来源于stack exchange,提问作者jmosesman

