liveview 进程崩溃时 vscode 不报错,只触发 live_reload 刷新,实为异常被默认处理机制吞没;需启用 config/dev.exs 中 logger: [level: :debug] 和 --no-halt 启动,紧盯 [error] genserver 终止及 ** (exit) 异常日志定位问题。

LiveView 进程崩溃时 VSCode 不报错,只看到 live_reload 刷新?
这是最常见误判:你以为 LiveView 正常运行,其实 handle_event 或 mount 抛了异常,但被 Phoenix 的默认错误处理吞掉了,前端只触发一次重载,日志里连 GenServer.call/3 timeout 都不显示。
必须打开服务器端详细日志才能定位:
- 在
config/dev.exs中确认logger: [level: :debug]已启用 - 启动时加
--no-halt参数(mix phx.server --no-halt),避免终端输出被截断 - 重点盯住
[error] GenServer #PID<...> terminating</...>和** (exit) an exception was raised:开头的行
VSCode 调试器连不上 LiveView 进程,Debugger attached 后断点全灰?
LiveView 是动态生成的进程(Phoenix.LiveView.Process),不是传统模块函数调用,普通 IO.inspect/1 或断点打在 render/1 里根本不会触发——因为渲染由客户端事件驱动,且进程生命周期极短。
正确做法是把断点下在服务端事件入口处:
- 在
handle_event/3函数第一行设断点(不是render/1) - 确保
launch.json的mixEnv是"dev",且task设为"phx.server" - 别用
mix test启动调试器——LiveView 进程只存在于 HTTP 请求上下文中,测试环境不启动Phoenix.Endpoint
示例 launch.json 片段:
{
"type": "mix_task",
"name": "Phoenix Server",
"request": "launch",
"task": "phx.server",
"projectDir": "${workspaceFolder}",
"mixEnv": "dev"
}
修改 Elixir 文件后 LiveView 不热更新,必须手动刷新页面?
LiveView 的热重载(live_reload)默认只监听 lib/**/* 和 priv/**/*,但 LiveView 视图文件(lib/my_app_web/live/*.ex)属于运行时动态加载的模块,改动后需强制重新编译并通知客户端。
两个关键配置点:
- 检查
config/dev.exs中live_reload: [patterns: [...]]是否包含~r{lib/.+\.ex$}—— 必须有,否则改.ex文件不触发重载 - 确保
priv/static下有live_reload.js(由mix phx.digest生成),且 Layout 模板中已插入 - 如果用了自定义
root路径(如lib/my_app_web),需在live_reload的patterns中显式添加对应路径正则
Chrome DevTools 显示 phx-xxx 属性没生效,WebSocket 连接状态为 pending?
这不是前端问题,而是 LiveView 的服务端通道没建立成功。VSCode 里看不到这个错误,但终端会快速闪过 Could not check origin for Phoenix.LiveView.Socket 或 connect/2 not implemented。
高频原因和验证方式:
- 检查
endpoint.ex中socket "/live", Phoenix.LiveView.Socket是否拼写正确,路径必须是"/live"(不能是"/lv"或带版本号) - 确认
config/dev.exs中url: [host: "localhost"]和浏览器地址栏域名一致——若用127.0.0.1:4000访问,但host写的是"localhost",Origin 校验失败 - 在终端运行
mix compile --force后重启服务,避免旧缓存的.beam文件干扰连接逻辑
真正麻烦的是跨域场景:开发时用 Vite/HMR 代理到 Phoenix,必须在 endpoint.ex 的 socket 配置里显式加 check_origin: false(仅限 dev)。











