name: lv:assigns description: 审计 LiveView 套接字分配以检测内存问题和清晰度。在审查 LiveView 性能或调试内存问题时使用。 argument-hint: path/to/live_view.ex
LiveView 分配审计
分析 LiveView 套接字分配以提高内存效率、清晰度和最佳实践。
铁律 - 切勿违反这些
- 对于超过 100 项列表使用流 - 永远不要直接在分配中存储大列表
- 对临时数据使用临时分配 - 闪存消息、临时错误、通知
- 仅预加载所需字段 - 当只需要子集时不要存储完整的 Ecto 模式
- 在 mount 中初始化所有分配 - 永远不要访问可能不存在的分配
快速审计命令
提取所有分配
grep -E "assign\(|assign_new\(" path/to/live_view.ex
查找大数据模式
# 存储在分配中的列表
grep -E "assign.*\[\]|assign.*Repo\.all" path/to/live_view.ex
# 完整模式存储
grep -E "assign.*Repo\.get|assign.*%.*\{\}" path/to/live_view.ex
审计清单
1. 内存问题
| 模式 | 问题 | 解决方案 |
|---|---|---|
assign(:items, Repo.all(...)) |
无界列表 | 使用 stream/3 |
assign(:user, Repo.get!(...)) |
完整模式 | 仅选择所需字段 |
assign(:file_data, binary) |
大二进制数据 | 存储引用,而不是数据 |
| 嵌套预加载 | 过多数据 | 仅预加载需要渲染的内容 |
2. 缺少临时分配
应使用 temporary_assigns:
- 闪存消息
- 提交后的表单错误
- 一次性通知
- 上传进度
def mount(_params, _session, socket) do
{:ok, socket, temporary_assigns: [flash_message: nil]}
end
3. 未使用的分配
搜索定义但从未在模板中使用的分配:
# 查找分配
grep -oE "assign\(:(\w+)" live_view.ex | sort -u
# 与模板使用比较
grep -oE "@\w+" template.html.heex | sort -u
4. 缺少初始化
# 坏例子:@items 可能不存在
def render(assigns) do
~H"<%= for item <- @items do %>"
end
# 好例子:在 mount 中初始化
def mount(_params, _session, socket) do
{:ok, assign(socket, items: [])}
end
内存估算
对于每个分配,估算内存占用:
| 数据类型 | 近似大小 | 关注级别 |
|---|---|---|
| 整数 | 8 字节 | 低 |
| 字符串(100 字符) | ~200 字节 | 低 |
| 100 个映射列表 | ~10-50 KB | 中 |
| 1000 项列表 | ~100-500 KB | 高 |
| 二进制数据(图像) | 可变 | 关键 |
| 完整 Ecto 模式 | 每个 ~1-5 KB | 中 |
用法
运行 /lv:assigns path/to/live_view.ex 以生成分配清单,包括内存估算和优化建议。