LiveView分配审计Skill lv:assigns

这个技能用于审计 Elixir/Phoenix LiveView 中的套接字分配,以检测和解决内存问题、提高代码清晰度和性能优化。适用于开发者在审查 LiveView 性能或调试内存问题时使用。关键词:LiveView 审计、内存优化、性能调试、Elixir 开发、Phoenix 框架、套接字分配。

后端开发 0 次安装 0 次浏览 更新于 3/11/2026

name: lv:assigns description: 审计 LiveView 套接字分配以检测内存问题和清晰度。在审查 LiveView 性能或调试内存问题时使用。 argument-hint: path/to/live_view.ex

LiveView 分配审计

分析 LiveView 套接字分配以提高内存效率、清晰度和最佳实践。

铁律 - 切勿违反这些

  1. 对于超过 100 项列表使用流 - 永远不要直接在分配中存储大列表
  2. 对临时数据使用临时分配 - 闪存消息、临时错误、通知
  3. 仅预加载所需字段 - 当只需要子集时不要存储完整的 Ecto 模式
  4. 在 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 以生成分配清单,包括内存估算和优化建议。