用途:分析 Phoenix LiveView 的 socket assigns,从内存效率、清晰度和最佳实践角度做只读诊断,仅报告发现,绝不在审计中修改 assigns 或代码。
主要能力:
- 内存问题识别:列表直接存入 assigns(如 assign(:items, Repo.all(...))) 属无界列表,应改用 stream/3;存储完整 Ecto schema(如 Repo.get!)应只选所需字段;大二进制(如文件数据)应存引用而非数据;嵌套 preload 应只加载渲染所需。
- 缺少 temporary_assigns:Flash 消息、提交后表单错误、一次性通知、上传进度等瞬态数据应使用 temporary_assigns,示例挂载写法为 def mount(_params, _session, socket) do {:ok, socket, temporary_assigns: [flash_message: nil]} end。
- 未使用 assigns:提取 LiveView 中所有 assign 名称(assign(:(\w+)),再在对应 .heex 模板中查找 @\w+ 引用并比对,找出未被使用的 assigns。
- 缺少初始化:避免直接访问可能不存在的 assigns,应在 mount 中初始化,如 assign(socket, items: [])。
- 内存估算:整数约 8 字节;100 字符串约 200 字节;100 个 map 列表约 10-50 KB;1000 项列表约 100-500 KB;二进制(图片)大小不定,属关键级别;完整 Ecto schema 每个约 1-5 KB。
使用方式:运行 /lv:assigns path/to/live_view.ex 生成 assigns 清单、内存估算与优化建议。也可用 Grep 查找目标 LiveView 文件中的 assign( 与 assign_new( 调用,以及 assign.*[]、assign.*Repo.all、assign.*Repo.get 等大数据模式。
适用场景:审查 LiveView 内存膨胀、assigns 冗余或未初始化问题。
限制:技能本身为只读诊断,不自动修改代码;资料未提供安装命令、收费方式、支持平台或效果保证,这些信息暂未提供。