2018 年 1 月 31 日 星期三

Rails 5.2.0 RC1:Active Storage、Redis Cache Store、HTTP/2 Early Hints、CSP、Credentials

由 dhh 发布

Rails 5.2 首个 beta 版本发布以来已过去两个月,我们在这段时间内一直在改进、打磨并调整这个版本,对这个第一个候选版本进行了各种各样美好的改进。

我们的头条功能,新的Active Storage 框架,已通过内容类型更深层次识别以及大量的其他改进进行了扩展。它还在 Basecamp 和其他地方的生产环境中经过了几个月的额外实战测试。它开箱即用就已是一个非常坚实的框架。

在 beta 测试期间,我们还设法进行了一些额外的改进。如超快的 fixture 加载Active Job 放弃时的自定义错误处理,以及开发中 Active Record 查询的呼叫站点日志。我们从未停止前进!

所以,我们越来越接近了。Basecamp 和许多其他商店已经在生产环境中运行 Rails 5.2 beta 版好几个月了。我们对下一个候选版本或最终版本(这取决于可能出现的错误的严重性)的目标是 2 月份末之前。但是由于这是一个候选版本,所以我们现在会将rails/master 移至rails/5-2-stable,从而使得rails/master 可以不受限制地针对 Rails 6.0 进行开发。

再次感谢所有人,正是他们源源不断地向 Ruby on Rails 灌输着自己的爱与支持!

beta 版发布时的 Rails 5.2 亮点回顾

长期以来,在 Rails 中处理文件上传一直都很困难。当然,已经有了很多不错的插件可用,但我们已迫不及待地要在框架中直接纳入某些功能。因此,现在我们已经做到了!

借助 Rails 5.2 中新的Active Storage 框架,我们解决了将文件直接上传到云端的现代化方法的问题。开箱即用即可获得对 Amazon S3、Google Cloud Storage 和 Microsoft Azure Cloud File Storage 的支持。

如果您正在处理图像,则可以在运行中创建其变体。如果您正在处理视频或 PDF,则可以在运行中创建它们的预览。并且,无论文件类型如何,您都可以在运行中异步分析上传文件以提取元数据。

Active Storage 由 George Claghorn 和本人从 Basecamp 3 中提取。因此,该框架不仅已经用于生产环境中,而且它还诞生于生产环境中,毫无例外。

说到提取,Jeremy Daer 已经拆解了 Basecamp 用于将 Redis 用于常规部分、片段和其他 Rails 缓存任务的长而复杂的解决方法。有一个全新的 Redis 缓存存储,将所有这些年的经验丰富的解决方法集成到一个连贯的单元中,任何人都可以使用该单元。

这个新的 Redis 缓存存储支持 Redis::Distributed,以便像 Memcached 一样对 Redis 进行分区。它具有容错能力,因此将把故障视为丢失,而不是用异常终止请求。它甚至还支持分布式 MGET,以提供完备的部分集合缓存能力。

它与缓存效率的重大飞跃同时出现,默认情况下可以 回收密钥压缩。对于 Basecamp,这意味着将缓存寿命延长了两个数量级!我们的缓存寿命已从短至一天延长为几个月。如果您使用部分缓存和套娃策略,这两项更改将极大提高您的缓存寿命。

我们还采纳了 HTTP/2 的精华,其中通过 Aaron Patterson 和 Eileen Uchitelle 的工作引入了 早期提示。这意味着我们可以自动指示 Web 服务器尽早发送所需的样式表和 JavaScript 资产。这意味着可以更快地交付完整页面,谁会不想要呢?

在性能主题方面,Rails 现在在默认的 Gemfile 中提供了 Bootsnap,由我们 Shopify 的朋友创建。它通常会将应用程序启动时间缩短 50% 以上。

Rails 始终走在让您的 Web 应用程序更安全的道路的前列,它通过内置 CSRF 和 XSS 保护来引领道路,而在 Rails 5.2 中,我们通过 添加一个新的 DSL 来进一步增强了这一点。该 DSL 允许您配置一个 内容安全策略 以用于您的应用程序。您可以配置一个全局默认策略,然后逐个资源覆盖它,甚至可以使用 lambda 将每个请求的值注入到标头中(比如一个多租户应用程序中的帐户子域)。

但是,它并不仅仅局限于所有那些引人注目的新奇事物。在 Rails 5.1 中,我们添加了 加密密钥。这些密钥就像旧密钥,但是呃,更秘密,因为,您知道,是加密的!令人困惑吗?是的。为什么您想要的密钥并不是真正保密的?好吧,您不需要这种密钥。

在 Rails 5.2 中,我们通过弃用两种不同的密钥并引入一个新的共享概念(称为 凭据),从而纠正了这个混乱。凭据(如 AWS 访问密钥以及其他登录人和密码形式)是密钥的主要用例,所以为什么不给它们一个恰当的名称呢。所以就是凭据!

凭证会始终加密。这意味着若密钥不在其中,该密钥将安全地被检入版本控制。这意味着原子化部署、无需使用大量环境变量,以及将应用程序所需所有凭证存储在一个安全位置的其它好处。

另外,我们已开放了 Credentials 的基础层 API,您可以轻松处理其它经过加密的配置、密钥和文件。

从 Rails 5.1 开始,我们在 Webpacker 方面取得了重大进展。所以,Rails 5.2 旨在与新的 Webpacker 3.0 版本完美搭配。Rails 已全面采用带有经 Webpack 运行的预配置构建管道的现代 JavaScript。我们持续巩固这种关系。