托马斯·坎农 - 修复 Rails 7+ 网络栈

主要观点:

  • 构建 Little CRM 需让其具备尽可能强的弹性,通过网络栈实现渐进增强,涵盖无 JS 加载、部分 JS 加载、JS 加载但 WebSockets 故障、WebSockets 正常提供实时更新等情况,网络栈需支持标准 HTTP 请求/响应、提供客户端 API 处理 fetch/AJAX 请求、使用轻量级 WebSockets 实时更新层。
  • 批判 Hotwire/Turbo,认为其重实现浏览器核心,引入大量问题,如依赖 DOM 变形、History API 导致失败点多,处理页面加载和历史方式复杂;Turbo Streams 协议不易理解和调整,而 CableReady 协议简单易懂、可扩展,使用同一协议可避免重复代码和认知负担。
  • 强调设计良好的 HTML 回退机制,以确保普通 HTTP 请求时应用仍能正常工作,如在复杂行为中也能设计好 HTTP 回退,Rails 可帮助解决此问题,且 HTML 回退无需完美,只需让用户能继续前进。
  • 肯定 UJS(现 Mrujs)的设计,它轻巧、利用浏览器优势,注重增强而非依赖 JS,大量使用事件派发,是 Evergreen 设计。
  • 进行不科学调查及与 Konnor Rogers 交流,认为多数应用最佳方式是从底层编写渐进增强的请求/响应,以智能控制器设计等实现 Websocket 更新,多数功能无需真正实时更新。
  • 指出抛弃 UJS 是浪费时间,CableReady 协议优于 Turbo Streams,Turbo 和 Hotwire 晚于 CableReady 出现且未解决其问题,应选择更好的工具,社区共识也是一种标准化。

关键信息:

  • 网络栈各部分的功能及实现方式,如使用 Mrujs 增强表单和链接、利用 Rails 的respond_to方法提供理想和回退响应、使用 CableReady 作为响应协议等。
  • Hotwire/Turbo 的问题,如重实现浏览器核心、Turbo Streams 协议的局限性等。
  • 设计 HTML 回退机制的方法和示例,包括控制器代码、视图代码等。
  • UJS(Mrujs)的优势和设计理念。
  • 关于应用是否需要真正实时更新的讨论及相关观点。

重要细节:

  • 各种代码示例,如 Microposts 控制器代码、表单代码、CableCar 相关代码等,详细展示了网络栈各部分的实现细节。
  • 与 Konnor Rogers 的交流内容,包括对 morphing 的看法、Turbo 的问题等。
  • 关于不同情况下应用的表现,如 JS 工作和不工作时的表单提交错误处理、实时更新的实现等。
阅读 17
0 条评论