Action 路由机制 ⭐ Nex 核心创新
Nex 提供了一套极其智能且简约的 Action 路由方案,旨在彻底消除传统 Web 开发中繁琐的路由配置。
1. 核心理念:行为局部性 (LoB)
在 Nex 中,处理交互的函数(Action)与其对应的 UI(HEEx)紧密耦合在同一个 Elixir 模块中。这种设计不仅提高了代码的可维护性,还让 AI 辅助编程变得更加高效。
2. 单路径 Action (Referer-based)
这是 Nex 的默认行为,也是最强大的特性。
工作原理
当你发送一个 POST/PUT/DELETE 请求到特定的 Action 路径(如 hx-post="/increment")时:
-
识别来源:Nex 查看 HTTP 请求头中的
Referer(例如http://localhost:4000/todos)。 -
定位模块:根据
Referer路径/todos找到对应的页面模块MyApp.Pages.Todos.Index。 -
执行函数:在找到的模块中执行与路径名同名的函数
increment/1。
优势
-
极致简化:你不需要在
hx-post中写出完整的页面路径。 -
逻辑复用:如果你在不同的页面调用同名的
/add,它们会自动路由到各自页面定义的add函数。
3. 多路径 Action (Path-based)
当你需要操作特定的资源(如删除、编辑)或者构建符合 REST 风格的 API 时,可以使用多路径 Action。
示例
路径:POST /users/123/delete
解析规则
-
路径前缀解析:Nex 将
/users/123解析为MyApp.Pages.Users.Id模块(假设对应文件是src/pages/users/[id].ex)。 -
提取参数:自动提取
id: "123"。 -
执行动作:解析路径最后一段
delete,并调用该模块中的delete(%{"id" => "123"})函数。
4. 原子级安全性 (Atom Safety)
传统的路由系统往往容易受到“原子溢出”攻击(恶意构造大量请求导致 Erlang 原子表耗尽)。Nex 的路由机制天然防御此类攻击:
- 编译时绑定:路由解析仅会尝试寻找已经编译存在的模块和函数。
- 拒绝动态生成:Nex 不会在运行时根据未知的字符串动态创建原子。
5. 自动 CSRF 与状态追踪
所有通过 Nex 路由的 Action 请求都会自动享受以下保护:
-
CSRF 验证:脚本自动注入
X-CSRF-Token,服务端强制验证。 -
Page ID 自动携带:脚本自动注入
X-Nex-Page-Id,确保Nex.Store状态隔离生效。
6. 常见返回模式
| 返回值 | 说明 |
|---|---|
~H"""...""" |
返回 HTML 片段,用于局部更新。 |
:empty |
执行逻辑成功,但不返回内容(通常配合 hx-swap="none" 使用)。 |
{:redirect, "/path"} |
让 HTMX 进行客户端跳转(HX-Redirect)。 |
{:refresh} |
强制浏览器刷新当前页面(HX-Refresh)。 |
Nex.stream(fn -> ... end} |
启动 SSE 实时流。 |