【发布时间】:2016-01-02 14:24:04
【问题描述】:
在 Rails 4 应用程序中,我们的主页上有一些大图像(尺寸大约为 2400 像素宽度),它们的加载速度自然很慢。
有哪些选项可以加快加载速度?一种方法是降低它们的质量 => 它们的大小 => 更快的加载。
但是有一种 Rails 方法可以预缓存/压缩它们吗?
谢谢。
【问题讨论】:
标签: ruby-on-rails ruby image caching assets
在 Rails 4 应用程序中,我们的主页上有一些大图像(尺寸大约为 2400 像素宽度),它们的加载速度自然很慢。
有哪些选项可以加快加载速度?一种方法是降低它们的质量 => 它们的大小 => 更快的加载。
但是有一种 Rails 方法可以预缓存/压缩它们吗?
谢谢。
【问题讨论】:
标签: ruby-on-rails ruby image caching assets
一个好的做法是在最终提交到您的代码库之前通过ImageOptim 运行所有图像。此工具进行无损压缩,这意味着像素不会改变,它仍然会减小文件大小。
这不是“Rails”解决方案,但它是我所知道的在不牺牲任何质量的情况下减小文件大小(通常约为 10%)的最佳方法。
【讨论】:
没有“Rails 方式”可以做到这一点。无论您使用什么框架/语言,这都是一个问题,最好使用 content delivery network (aka CDN)
解决【讨论】:
为了让 googler 对此有所了解,以下是事实:
您遇到的问题是,由于资产是手动添加到 Rails 中的,因此您无法做到 pre-processing。如果您想针对不同的环境优化图像,则必须创建不同分辨率的图像,然后使用一些逻辑来定义它们:
- assets
-- images
--- backgrounds
---- original.jpg
---- medium.jpg
---- small.jpg
然后您就可以使用辅助方法来定义您想要的图像:
#app/helpers/application_helper.rb
class ApplicationHelper
def size size, image
assets_path("#{File.basename(image)}/#{size.to_s}#{File.extname(image)}")
end
end
参考:Get file name and extension in Ruby
这将允许您调用:
<%= image_tag size(:original, "backgrounds.jpg") %>
如果您想使这个动态化,您必须使用 CSS 并设置背景图片,相应的 @media 查询会根据需要分配不同的图片。
如果您谈论的是上传图像,您最好了解Paperclip 是如何做到的:
ImageMagick 必须已安装且 Paperclip 必须有权访问它。为确保它确实如此,请在您的命令行上运行 which convert(ImageMagick 实用程序之一)。
Paperclip 使用 ImageMagick 将图像分割成不同的大小。然后将它们存储在/public/system 文件夹中,这就是您在使用它时调用@model.image.url(:original) 的原因。
我上面描述的基本上是 Paperclip 的工作原理,除了自动使用 ImageMagick 制作不同的图像尺寸
【讨论】: