Rails 4.2 中的资产指纹是否发生了变化?

Has asset fingerprinting changed in Rails 4.2?

我最近将一个 Rails 4.1 应用程序升级到了 4.2。当我在开发模式下查看页面源代码时,所有资产现在都有一个与之关联的指纹:

/assets/application-7d90cdd9d3a3cc2a3445c0e8b748db14.js?body=1

Pre 4.2 我认为它曾经是

/assets/application.js?body=1

有什么改变或者我错过了配置设置吗?

是的,Rails 4.2 现在默认在开发中启用资产摘要 ("fingerprints")。

这是提交:

https://github.com/rails/rails/commit/f369bcf9a0dba0a945ca6fe53343c042f54c1fcf

为什么要改变?说来话长,但我的理解是 Rails 团队希望开发和生产行为更加相似,以防止部署时出现意外错误。

Rails 4 中的另一个相关变化是它不再在生产中生成 没有 摘要的资产。为了及早发现错误(即在部署到生产环境之前),已更改开发设置以匹配生产摘要行为。

要了解为什么这有帮助,请看下面的示例:

假设您的代码(或者您正在使用的 jQuery 插件)直接通过其路径引用资产,如下所示:/assets/logo.png。在 Rails 4.2 之前,这在开发中工作得很好。但是当你部署时,惊喜! /assets/logo.png 不存在。为了使其在生产中工作,您需要使用 asset_path 帮助程序生成带有指纹的正确路径。

通过强制您在开发中使用 digests/fingerprints,Rails 4.2 帮助您在开发中发现此错误。部署时不再有不愉快的意外。

也就是说,这些变化是……controversial,至少可以这么说。

我发现了这个 gem:https://github.com/alexspeller/non-stupid-digest-assets

它禁用摘要。

来自自述文件:

把它放在你的 Gemfile 里就可以了

gem "non-stupid-digest-assets"

如果您只想将某些文件的非摘要资产列入白名单,您可以像这样配置白名单:

# config/initializers/non_digest_assets.rb

NonStupidDigestAssets.whitelist += [/tinymce\/.*/, "image.png"]

请务必提供匹配正确资产的正则表达式或相关资产的逻辑路径。

请注意,逻辑路径是您要提供给 asset_url 的路径,因此对于位于 RAILS_ROOT/assets/images/foo.png 的图像,逻辑路径是 foo.png