关于 rails-hotwire
这是一项使用 Hotwire 构建交互式 Rails 应用的参考技能,涵盖 Turbo 与 Stimulus 实践。规则按优先级整理导航、实时更新、架构选择、性能和测试建议。
主要功能
- 01涵盖九类的 53 条规则
- 02Turbo Drive、Frames 与 Streams 指引
- 03广播与页面形态更新实践
- 04Stimulus、架构和测试建议
适用场景
- 01配置 Turbo 导航与缓存
- 02添加局部更新和延迟加载的 Frame
- 03通过 ActionCable 推送实时更新
- 04测试 Hotwire 交互
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ pproenca/ dot-skills --skill rails-hotwire安装后在 Claude Code 中输入/rails-hotwire确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
metadata.jsonassets/templates/_template.mdreferences/_sections.mdarch-avoid-client-state.mdarch-frame-vs-stream-decision.mdarch-importmap-management.mdarch-progressive-enhancement.mdarch-stimulus-boundaries.mdbcast-avoid-view-logic-in-models.mdbcast-debounce-n1.mdbcast-model-broadcasts.mdbcast-reconnect-handling.mdbcast-refresh-over-replace.mdbcast-scope-streams.mdbcast-signed-stream-names.mddrive-cache-control.mddrive-confirm-dialog.mddrive-error-recovery.mddrive-form-submissions.mddrive-prefetch-links.mddrive-progress-bar.mddrive-selective-disable.mddrive-visit-actions.mdframe-break-out.mdframe-dom-id.mdframe-empty-state.mdframe-lazy-loading.mdframe-promote-visits.mdframe-scope-navigation.mdframe-src-navigation.md详细介绍
社区 Rails Hotwire 最佳实践
全面介绍如何使用 Hotwire(Turbo + Stimulus)构建交互式 Rails 应用,由社区维护。包含 9 个类别、53 条规则,并按影响程度排序,以指导自动重构和代码生成。遵循 DHH 的“单人框架”理念:服务器渲染 HTML,Turbo 让应用体验起来像 SPA,Stimulus 则在需要时添加少量 JS。
适用场景
在以下情况下参考这些指南:
- 配置 Turbo Drive 导航、预取和缓存行为
- 添加 Turbo Frames 以实现局部页面更新和延迟加载
- 使用 Turbo Streams 对 DOM 进行精准修改
- 通过 ActionCable 广播实时更新
- 启用 Turbo 8 morphing 以刷新页面
- 编写用于客户端行为的 Stimulus 控制器
- 处理 Turbo 导航、frames 和 WebSocket 连接中的错误
- 在 Drive、Frames、Streams、Morphing 和 Stimulus 之间进行选择
- 在系统测试和集成测试中测试 Hotwire 交互
按优先级划分的规则类别
| 优先级 | 类别 | 影响 | 前缀 |
|---|---|---|---|
| 1 | 导航与 Drive | 严重 | drive- |
| 2 | Turbo Frames | 严重 | frame- |
| 3 | Turbo Streams | 高 | stream- |
| 4 | 广播与实时更新 | 高 | bcast- |
| 5 | Morphing 与页面刷新 | 高 | morph- |
| 6 | 性能优化 | 中高 | perf- |
| 7 | Stimulus 模式 | 中高 | stim- |
| 8 | 架构决策 | 中 | arch- |
| 9 | Hotwire 测试 | 中 | test- |
快速参考
1. 导航与 Drive(严重)
drive-prefetch-links- 启用链接预取,实现即时导航drive-form-submissions- 使用 Turbo Drive 提交表单drive-visit-actions- 使用访问操作控制历史记录drive-cache-control- 配置 Turbo 缓存,用于预览页面drive-selective-disable- 在不兼容的页面上禁用 Turbo Drivedrive-progress-bar- 自定义 Turbo 进度条drive-confirm-dialog- 对破坏性操作使用 data-turbo-confirmdrive-error-recovery- 妥善处理 Turbo 导航和 fetch 错误
2. Turbo Frames(严重)
frame-lazy-loading- 等待 frame 进入视口后再加载frame-scope-navigation- 将导航限制在 frames 内frame-src-navigation- 使用 src 加载动态 frame 内容frame-break-out- 处理重定向时跳出 frameframe-promote-visits- 将 frame 导航提升为页面访问frame-dom-id- 使用 dom_id 标识 frameframe-empty-state- 提供有意义的 frame 加载状态
3. Turbo Streams(高)
stream-progressive-enhance- 始终为 streams 提供 HTML 回退方案stream-action-selection- 为 DOM 修改选择合适的 stream 操作stream-multi-target- 使用 targets 更新多个元素stream-http-delivery- 通过 HTTP 发送表单响应的 streamsstream-websocket-source- 在 body 中连接 WebSocket 来源stream-custom-actions- 注册自定义 stream 操作,以执行复杂的 DOM 更新
4. 广播与实时功能(HIGH)
bcast-model-broadcasts- 使用 broadcasts_refreshes 实现简单的模型更新bcast-debounce-n1- 对广播进行防抖,避免 N+1 广播风暴bcast-scope-streams- 将广播流限定到账号或用户bcast-refresh-over-replace- 优先使用广播刷新,而不是细粒度的流更新bcast-avoid-view-logic-in-models- 不要在模型中编写广播逻辑bcast-signed-stream-names- 使用签名流名称确保安全bcast-reconnect-handling- 处理 WebSocket 断开和重新连接
5. DOM 变形与页面刷新(HIGH)
morph-enable-page-refresh- 启用页面刷新时的 DOM 变形morph-permanent-elements- 将有状态元素标记为永久元素morph-scroll-preservation- DOM 变形期间保留滚动位置morph-stimulus-reconnect- 处理 DOM 变形后 Stimulus 控制器的重新连接morph-frame-refresh- 在 frame 上使用 refresh='morph' 添加内容morph-vs-streams- 复杂的流编排场景优先选择 DOM 变形
6. 性能优化(MEDIUM-HIGH)
perf-optimistic-ui- 在服务器确认前实现乐观 UI 更新perf-batch-streams- 将多个流更新批量合并到单个响应中perf-frame-caching- 使用片段缓存缓存 Turbo Frame 响应perf-prefetch-strategic- 在开销较大的端点上禁用预取perf-memory-leak-prevention- 清理订阅和事件侦听器
7. Stimulus 模式(MEDIUM-HIGH)
stim-outlets-communication- 使用 outlets 实现跨控制器通信stim-values-reactive-state- 使用 Values API 管理控制器的响应式状态stim-action-descriptors- 使用声明式操作描述符,而不是 addEventListenerstim-small-reusable-controllers- 保持 Stimulus 控制器小巧且可复用
8. 架构决策(MEDIUM)
arch-progressive-enhancement- 遵循渐进增强层级arch-frame-vs-stream-decision- 使用 frame 实现限定范围的导航,使用 stream 实现多目标更新arch-importmap-management- 使用 import maps 固定 JavaScript 依赖arch-avoid-client-state- 将状态保留在服务器上,而不是客户端arch-stimulus-boundaries- 仅使用 Stimulus 实现客户端行为
9. 测试 Hotwire(中等)
test-system-test-async- 在系统测试中等待 Turbo 更新test-stream-assertions- 在集成测试中使用 Turbo Stream 测试辅助工具test-broadcast-assertions- 使用 Turbo 测试辅助工具断言广播test-frame-navigation- 使用限定范围的断言测试框架导航test-websocket-timing- 处理系统测试中的 WebSocket 连接时序
使用方法
阅读各个参考文件,了解详细说明和代码示例:
参考文件
| 文件 | 描述 |
|---|---|
| references/_sections.md | 类别定义和排序 |
| assets/templates/_template.md | 新规则模板 |
| metadata.json | 版本和参考信息 |
评论
支持 Markdown