R

Rails 开发的新时代

2025-06-07

Rails 开发的新时代

这个标题是点击诱饵吗?是的。
我相信吗?也是。

长话短说:你觉得 Rails 老旧、缓慢,而且已经过了它的黄金时代吗
你觉得 SPA 是唯一的出路吗?再想想吧。StimulusReflex引入了一种简单、极速的全新方式,可以构建令人惊叹的 Rails 应用。快来体验吧!点击它!我等着……

首先,我在 Rails 或 Ruby 社区里算不上什么大人物。我也不是核心贡献者。我认识一些人,但我只是个默默无闻的人。我不会熬夜开发新的框架或库,试图推动整个行业的发展。我内心深处很想成为那样的开发者,但我做不到。

我是一名修炼者。

我开发过帮助人们提升职业生涯的软件让游戏玩家更深入地融入他们最喜欢的游戏社区的软件;开发过销售活动门票的软件;向 CTO 呈现网络安全仪表板的软件;配置 SAN 设备的软件;以及培训陆军战斗队长的软件。

我列出这些资质并非为了让自己显得高大上,而是为了表明我组建和管理的团队能够开发大型复杂应用程序,这些应用程序的功能远超普通的博客网站或 Twitter 克隆版。我构建的这些应用大多使用 Rails、Rails API + JavaScript SPA,或者以上所有技术加上一系列互联系统、命令行工具和基于机器学习的微服务。

我喜欢 Rails,也热爱 Ruby。我不认同 Ruby 应用速度慢的说法,因为我参与开发过 Ruby 应用,它们在一款 3A 游戏的午夜发布时,就轻松满足了大批玩家的需求;此外,我还参与开发了后端 Rails API,支持从热门移动应用到单页应用 (SPA) 的各种应用。但在过去几年里,我不得不勉强承认,开箱即用的 Rails 在与 React、Angular、Ember 等现代 JavaScript 框架提供的快速、响应式体验竞争时,表现并不出色。

但这种情况即将改变。

我目前的桌游RPG小组由一群爸爸组成,分布在美国各地,他们已经通过Zoom在线上玩D&D好几年了。但突然之间,由于封锁措施和孩子们永久居家隔离,我们发现自己(这看起来似乎有些矛盾)玩游戏的时间更少了。我之前一直在考虑开发一款网页应用来简化游戏流程,但疫情让我更加忙碌。由于在家教育孩子和日常工作之间(非常)有限的空闲时间,我开始认真寻找一个技术栈来构建这款应用。我有三个要求:

  1. 该应用程序需要非常快速、流畅,并具有现代、反应灵敏的用户体验。
  2. 我需要能够自己快速地构建它。
  3. 我想学习一些新东西。

我可以使用“经典” Rails 来构建它吗?当然。我在这方面非常擅长...... 15 年了,我可以用 spaghetti JS 将它拼凑起来并接近我的目标。但我想要一些更有野心、更有条理的东西,以及我可以磨练一些技能的东西。我研究了像 React、Angular 和 Ember 这样的 SPA 框架。它们很棒,而且我在日常工作中也积累了这方面的经验。我认为我可以增强我现有的 SPA 技能,并开始沿着这条路走下去,但每次我看到必须同时构建两个git 存储库,以及一个基于 JSON 的接口来桥接它们时,我总是退缩……或者也许是 GraphQL,但现在我将在后端与性能查询作斗争,或者......呃。有了开发团队,当然,我可以将所有这些复杂性推给多个人,这是一个完全可行的策略。但目标 2 是看看我可以用 1 个人构建什么;能够与整个团队(比如我管理的团队)构建的反应式应用相媲美。这可能吗?

进入StimulusStimulusReflexCableReadyViewComponentReflexOptimism及其伙伴。进入基于 WebSocket 的精准 HTML。进入不会造成状态同步噩梦的超响应用户交互。

在四天之内(实际上,我们说的是每天晚上孩子们睡觉后的几个小时),我制作并运行了一个ChaosMage原型,它具有以下特点:

  • 初始加载后无需重新加载整个页面
  • 控制器操作和反射的解析速度与任何 JSON API 端点一样快
  • 几乎每个面向用户的页面上都有实时 JS 驱动的花哨功能,可以从中受益
  • 由于客户端没有状态管理库,浏览器需要加载的 JS 更少
  • 一个干净、有组织、基于组件的代码架构,可与所有标准 Rails 内容以及 sidecars .rb、.js 和 html 模板无缝协作
  • 每个按钮的 CSS 转换、用户和角色头像(带有 JS 裁剪工具!)、弹出模式、弹出抽屉、具有实时验证的远程表单,等等......
  • 基于 Three.js 的骰子滚轮,具有物理和碰撞功能,由 Rails 和 Stimulus 控制器提供服务和控制
  • 一个完整的、类似 Discord 的聊天频道,配有表情符号、掷骰子命令、Markdown 支持、解析和重新渲染,以及在 50 毫秒内向频道中的每个人近乎即时广播消息

不到一周,我就把这款应用放到了Hatchbox上,并在下次会议上和我的团队一起进行了 Alpha 测试。它运行得完美无瑕。骰子掷得准,聊天……也聊天了?头一个小时,他们还以为我在网上随便找了个新应用,没意识到我花了几天时间就自己开发出来了。

我突然重温了 2005 年摆弄 Rails 早期版本之一时的感受;那种感觉就像要告别 PHP 开发,我大部分时间都花在了构建项目架构上。现在,我几乎每个小时都在开发一些新的、令人愉悦的功能。

过去几年,我主要致力于构建高性能 API 端点,以支持那些完全用 JS 编写的精美、响应式、华丽的 SPA 应用。我亲眼目睹了前端团队与后端团队如何对抗竞争条件。我设计了各种奇葩的数据架构,让那些固执己见的 JS 框架能够轻松应对它们请求的海量 JSON 数据。我曾为 50 毫秒的页面加载时间而苦恼,结果却只看到一个充满旋转图标的空白页面,而这些旋转图标加起来总共需要 3 秒钟才能全部解析完成。这可不是我之前承诺的。

但有了这种思考和构建 Rails 应用的新方式,我突然发现自己又能独自一人发布新功能了。我的视图模板只是将智能、互联的组件整合在一起。Reflexes 让我只需几行代码就能让用户体验的状态与后端完全同步。应用中的页面渲染时,只需几个旋转按钮,所有内容都已呈现在页面上,通常耗时不到 100 毫秒

开发应用程序再次变得有趣。

我没有意识到过去几年我有多么怀念那种感觉。

别误会我的意思。开发者可以从各种技术栈中感受到这种感觉。React 开发者、Angular 和 Ember 开发者都深有体会。开发者们正在深入研究 Elixir、Phoenix、Vue、Alpine 以及其他各种技术。现在有太多令人惊叹的工作正在进行,而且有太多工具可以用来完成不可思议的事情。坦白说,如果你不以某种方式提升你的 JavaScript 技能,我认为你就会落后。当然,我的经验只是我自己的。

但我坚信,我们不应该为了完成一件重要的事情而建立两个代码库。(对很多公司来说,这意味着需要两个团队,或者一个团队分别负责“前端”和“后端”。)

我们不需要花费数天时间和多次团队会议来迭代我们的数据通信模式。

我们不应该构建一刀切的 API 端点,为了前端兼容性而牺牲性能。

我们不应该将数兆字节的客户端代码塞进用户的低端笔记本电脑上,否则会导致 Chrome 崩溃。

亚秒级的页面加载和长达数秒的旋转并不是令人愉快的用户体验。

我们真的可以发送比实际在前端要变异的 HTML 更多的 JSON 字节吗?

我敢肯定,有些人读到这里会说:“但是,伙计,你可能只是用错了 API+SPA 堆栈的构建方式。” 他们或许是对的。很多优秀的应用都是用 SPA 构建的,而且只要有一支专业的团队,我们几乎可以构建任何东西。我相信架构和流程还有很大的优化空间。

但有了 StimulusReflex、CableReady、ViewComponents 和 Optimism,我们无需再为此操心。我们现在正在寻找一种构建响应式现代应用的全新方式,同时仍然使用一个成熟的框架,该框架拥有庞大的优秀人才社区,并提供了应对常见挑战的现有库和解决方案。

试想一下:如果我可以自己完成所有这些工作,想象一下一支全职开发团队可以做什么!

到了 2020 年,随着形势的发展,我们需要一些感觉良好、能让我们快速应对重大挑战的工具,因为否则我们需要担心的事情太多了。

不相信 2020 年会标志着 Rails 开发的新纪元吗?没关系。做你自己的事,开心就好!用任何让快乐的技术,在这个不快乐的时代,创造一些能让人们快乐的好东西。

但是,如果您像我一样,一直觉得也许有一种更简单、更快捷的方式来实现雄心勃勃的软件,而无需牺牲现代用户体验……那么,我建议您看看我认为即将到来的巨变:

刺激
StimulusReflex
CableReady
ViewComponent
ViewComponentReflex
乐观主义
未来主义

快去看看这个蓬勃发展的新生态系统吧!当然,也别忘了去体验一下那些演示和展览。不过,请相信我:这些库可不是为了炫耀你能做什么稀奇古怪的事情而弄出来的。这是一个全新的范式,朋友们。这是一条新的前进之路,是超越“传统”服务器渲染应用和 API+SPA 垂直领域的第三种选择。

我完全同意,不会轻易跳上闪亮的新火车。我打算看看这些新轨道会通向哪里。

(嘿,如果你正在玩 D&D、13th Age 或 Starfinder,请关注chaosmage.app ...我打算在它完善之后向所有人开放它!)

文章来源:https://dev.to/mepatterson/a-new-era-in-rails-development-20k1
PREV
完成比完美更重要
NEXT
如何在 React 中维护大规模数据集