2023年12月29日,星期五

今年的 Rails,2023 年总结

发布者:Greg

我是 Emmanuel、Greg、Vipul、Wojciech 和 Zzak,为您带来过去一年 Ruby on Rails 动态的总结。这是忙碌的一年,有来自 520 位贡献者超过 4300 次提交,以及包括 Rails 7.1 在内的 23 次发布!

在本期年终特刊中,我们团队每人都精选了去年最喜欢的一些拉取请求。

回顾 2023:Rails 基金会的成立之年
Amanda 撰写了关于 Rails 基金会今年工作和明年计划的总结。

允许使用不设置头的 SSL 终止的备用代理
添加了 ActionDispatch::AssumeSSL 中间件,可以通过 config.assume_ssl 启用。它会让应用程序认为所有请求都通过 SSL 接收。当通过会终止 SSL 的负载均衡器进行代理时,这非常有用,因为转发的请求对于应用程序来说会显示为 HTTP 而不是 HTTPS。这将导致重定向和 Cookie 安全针对 HTTP 而非 HTTPS

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

实现 Object#with
此拉取请求添加了 Object#with,用于在块周围设置和恢复公共属性。

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

有关此更改的更多示例和详细信息,请参阅拉取请求。

引入 Trilogy 适配器
Trilogy 是一个用于 MySQL 兼容数据库服务器的客户端库,旨在提高性能、灵活性和易于嵌入。GitHub 去年开源了 Trilogy 数据库客户端 和相应的 Active Record 适配器

添加 ActiveSupport::MessagePack
ActiveSupport::MessagePack 是一个与 msgpack gem 集成的序列化器,用于序列化各种 Ruby 对象。与 JSONMarshal 相比,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,后者相当慢。

添加 Bun 支持
Bun 是 Node.js 运行时、yarn 包管理器和 esbuild 打包器的新的可行替代方案。Bun 的主要区别在于速度。它通常比 Node.js 及其同类产品快几倍。
由于大多数原生 Rails 项目只是想零星地添加一些 JavaScript(但有时又希望比 import-maps 提供更好的 JavaScript 生态系统),Bun 是一个非常好的选择,并且可以轻松地被新的 Rails 项目采用。

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

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

对 SQLite3 适配器的连接配置进行性能调优
对于 Rails 应用程序,在使用上限日志大小的正常同步模式下,以及健康的共享内存缓冲区和共享缓存下,写入预日志(Write-Ahead-Log)的平均性能将提高 2 倍。

如果运行 Ruby 3.3+,则默认启用 YJIT
有许多公开报道称,启用 Ruby 3.2 YJIT 的 Rails 应用程序的延迟提高了 15-25%,而在 3.3 版本中则更好。遵循 更改,在 Ruby 3.3 中,YJIT 默认处于暂停状态而不是禁用状态,这允许我们从初始化程序中启用它。

使 Active Record inspect 的输出可配置。
可以使用 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 将会非常棒。

就这样!祝您新年夜快乐,明年再见!

订阅以通过邮件获取这些更新。