不知不觉 Rails 已经有 14 年的历史了。这次 Rails 5.2 更新说大不大,但也说小不小。论坛里对此讨论不是很多,我这里正好有一些时间,把 Rails5.2 试着讲的更明白一些。一方面确认自己团队的项目升级顺利,另一方面也期许对论坛的朋友们有所帮助。
文件上传这个功能一直是 web 开发的一个痛。它既可以十分简单,又可以复杂的让 Rails 高手都觉得有些棘手。这一切取决于用户对文件上传的体验要求。例如以下需求:
随着世界的发展,传统的一个 file_field
已经不能满足我们对产品的要求了。于是 ActiveStorage 来了。
整个 ActiveStorage 是非常易用和强大的,可以作为 Rails 5.2 的杀手级特性发布。
不过作为老鸟对于以下两个问题有所担扰:
carrierwave
改为 ActiveStorage即便如此,ActiveStorage 对于新项目来说,是一个必用特性,推荐大家好好掌握。
Bootsnap 与 Spring 属于相似技术目标:节省 Rails 开发阶段的启动速度。随着 Rails 的变大变强,需要加载的 gem 越来越多,其中大量的 Ruby 文件需要解释器现编译现启动。所以 Rails 服务(现在缺省是 puma)重启一次就越来越慢了,严重影响了我们开发的速度。
Bootsnap 可以让 Rails 服务首次启动速度降低 50%,并与 Spring 完美协同工作,第二次重启将会更快。其技术核心是:
路径预扫描
通过改进 Kernel#require
和 Kernel#load
的实现借以提高加载文件的速度
编译过程缓存技术
借助 Ruby 编译器的接口 RubyVM::InstructionSequence.load_iseq
可以达到缓存 Ruby 编译过程的二进制代码,避免重复编译。同时改进了 YAML.load_file
缓存 yml 对象。
以上都是非常针对性的改进 Rails 加载代码中最消耗时间的地方。这些本在普通 Ruby 项目不是什么大的问题,但却能由 Shopify
团队以精细打磨的心态帮助 Rails 生态改进它的加载速度,让每一个 Railser 更幸福一点,谢谢他们。
加密配置文件支持
通过设定一个 master.key 和 一个 credentials.yml.enc 加密配置,就可以将某些关键的配置直接签入版本控制中,解决一些配置文件的问题。与之前的备份方案先进一些。
Redis Cache Store 内建支持
应该说这个改进是与 dalli
之类的产生了竞争,是不是“官进民退”由使用者决定:)
webpacker 升级支持
Rails 5.1 增加的 webpacker 支持非常方便了 Rails 内安装前端的库,这次升级应该说是情所应当。
增加 HTTP/2 的 early hints 特性
零成本开启这个功能,让我们的 Rails 页面在 HTTP/2 支持的浏览器中加载的更快。
内容安全策略 ( Content Security Policy )
Rails 现在可以通过 DSL 语法定义内容安全策略,确保避免注入型漏洞,使得 Rails 应用更加安全。详见 PR 和内容安全策略解释
其他细节 API 调整,不再细说
Rails5.2 发布的核心主题是进一步以用户需求驱动,完善文件上传功能的内建支持,以及继续就速度一项进行改进,加载更快,启动更快。
这就是整个 Rails5.2 的改进内容。如果准备升级至 Rails5.2,请执行:
rails app:update
开始你的升级之旅。
如果打算全新开一个 Rails5.2 项目,中国的玩家们可以试试 80percent/rails-template,更快更好地调整好默认配置。