2023 年 12 月 29 日星期五

今年在 Rails 中,2023 年总结

作者 Greg

我是 Emmanuel、Greg、Vipul、Wojciech 和 Zzak,在这里向你展示过去一年 Rails 发生了哪些摘要。这一年很繁忙,超过 4300 次提交 来自 520 位贡献者,发布了 23 个版本,包括 Rails 7.1!

对于今年末发布的版本,我们团队中的每个人都会亲自挑选一些我们去年最喜欢的 Pull Request。

回顾 2023 年:Rails 基金会成立元年
Amanda 写了一份总结,总结了今年 Rails 基金会有哪些进展以及她对明年的规划。

允许使用不设置标头的 SSL 终止备用代理
添加可以通过 config.assume_ssl 启用的 ActionDispatch::AssumeSSL 中间件。它让应用程序相信所有请求都是通过 SSL 访问的。当通过终止 SSL 的负载均衡器进行代理时,此功能非常有用,因为转发的请求对于应用程序似乎是 HTTP 而不是 HTTPS。这会导致重定向和 Cookie 安全性将 HTTP 作为目标,而不是 HTTPS。

添加 ActiveJob.perform_all_later 以一次排队多个作业
此功能添加了批量排队作业的功能,而无需运行回调。这极大地减少了往返于队列数据存储的次数。对于未实现新 enqueue_all 方法的队列适配器,我们回退为单独排队作业。

实现 Object#with
此 Pull Request 添加了 Object#with,以便在一个块周围设置和恢复公共属性

client.timeout # => 5
client.with(timeout: 1) do
  client.timeout # => 1
end
client.timeout # => 5

可以在 Pull Request 中找到有关此更改的更多示例和详细信息。

推出 Trilogy 适配器
Trilogy 是面向 MySQL 兼容数据库服务器的客户端库,它专为性能、灵活性和易于嵌入而设计。 GitHub 在去年开源了 Trilogy 数据库客户端和相应的 Active Record 适配器。

添加 ActiveSupport::MessagePack
ActiveSupport::MessagePack 是一个序列化器,它与 msgpack gem 集成,用于序列化各种 Ruby 对象。与 JSON 和 Marshal 相比,ActiveSupport::MessagePack 可以在性能和消息大小方面提供一定的改进。

引入 config.autoload_lib
新的方法 config.autoload_lib(ignore:) 提供了一种简单的方法,可以从 lib 文件夹中自动加载

 # config/application.rb
 config.autoload_lib(ignore: %w(assets tasks))

通常,lib 目录具有不应自动加载或急切加载的子目录。此新方法允许你指定要根据需要自动加载哪些子目录。

阅读 自动加载指南 以进一步了解此新功能。

Active Job 详细日志记录
Active Job 新增了 verbose_enqueue_logs 配置选项,以在日志中显示后台作业入队的调用者,以帮助调试。它仅在开发环境中为新应用程序和升级的应用程序启用。不建议在生产环境中使用,因为它依赖于 Ruby 的 Kernel#caller,而 Kernel#caller 相当慢。

添加 Bun 支持
Bun 是 node.js 运行时、yarn 软件包管理器和 esbuild 捆绑器的全新且可行的替代品。Bun 的主要区别特征是速度。它通常比 node.js 及同类产品快数倍。
由于大多数简单的 Rails 项目只是想在此处和彼处散布一点点 JavaScript(但有时比导入映射提供的 JavaScript 生态系统想要更多内容),因此 Bun 非常合适,并且可以轻松地被新的 Rails 项目所采用。

支持按行范围筛选测试 此更改允许使用新语法按行范围筛选测试。例如,以下命令运行第 10 到 20 行的测试。

$ rails test test/models/user_test.rb:10-20

优化 SQLite3 适配器连接配置的性能
对于 Rails 应用程序,正常同步模式下的预写式日志,加上有上限的日志大小,健康的共享内存缓冲区和共享缓存,平均性能会提高 2 倍。

默认情况下启用 YJIT(如果运行 Ruby 3.3+)
对于启用了 Ruby 3.2 YJIT 的 Rails 应用程序,有许多公开报告指出延迟改善了 15-25%,而在 3.3 中,它甚至更好。继 更改 之后,在 Ruby 3.3 中,默认情况下 YJIT 会暂停而不是禁用,这让我们能够通过初始化程序启用它。

使 Active Record 的检查结果可配置。
可以使用 attributes_for_inspect 方法

Post.attributes_for_inspect = [:id, :title]
Post.first.inspect #=> "#<Post id: 1, title: "Hello, World!">"

attributes_for_inspect 设置为 :all 后,将列出所有记录的属性(开发和测试环境的默认设置)。还可以调用 full_inspect 以获取带有所有属性的检查结果。

Rails 8 里程碑
这篇讨论未来规划。DHH 使用一些非常有趣的问题为 Rails 8 创建了里程碑。在我看来,Rails 8 将会令人惊叹。

就这样了!有一个愉快的跨年夜,明年见!

订阅 以收到邮件更新。