【发布时间】:2015-03-31 16:11:40
【问题描述】:
我目前从 CDN 为我的应用程序中的所有图像提供服务。图片位于我的 rails 应用程序中的 app/assets/images 文件夹中。
并且应用程序预编译后,所有资产都上传到CDN,效果很好。
但是,有十几个大图像文件几乎从不改变,主要是在用户未登录时提供给用户,作为轮播或其他东西的一部分。
所以万一新的应用程序版本出来了,那些静态图像会重新上传,用户必须重新下载它们但它们永远不会改变,所以这有点多余,而且对于大尺寸来说并不是真的没有意义。
我的想法是把图片放在vendor/assets/images,直接加载到我的app中,不用app生成的后缀/hash。例如:如果您的应用中有名为 2.jpg 的图像,则在预编译资产后,它可能会以 2-49d87927b61510021a3cd0a895502625.jpg 或类似名称保存到 CDN。
所以我现在将上面的图片添加为:
= image_tag('2.jpg', alt: '')
但由于我的 assets.rb 初始化程序中有这一行:
Rails.application.config.assets.precompile += %w(*.png *.jpg *.jpeg *.gif)
图像2.jpg 将在生产环境中使用哈希进行预编译。
那么我怎样才能使用这个没有在 prod 上使用 hash 预编译但保持不变的图像呢?
如果我说:
= image_tag('2.jpg', alt: '')
它应该呈现为<image src='http://CDN_URL/assets/2.jpg' /> 而不是<image src='CND_URL/assets/2-23123dasdasdsadsasad21312.jpg' />,因为这个在vendor/assets/images 之下我仍然希望我的常规图像app/assets/images 带有哈希值。这可能吗?以及如何?
更新:
在我的开发环境中,我不提供静态资产。只是一个常规的开发配置。但我更喜欢适用于(DEV 和 PROD)环境的解决方案。
更新二:
看起来%img{src: 'assets/2.jpg'} 从vendor/assets/images 加载文件,这很好。
当我预编译资产并在 assets.rb 中使用 Rails.application.config.assets.precompile += %w(*.png *.jpg *.jpeg *.gif) 使用哈希初始化图像时,另一个问题仍然存在,即 2-32131dasdaeasee12eda.jpg
如果我从配置中删除 Rails.application.config.assets.precompile += %w(*.png *.jpg *.jpeg *.gif),则不会将图像 2.jpg 复制到 public/assets,因此不会复制到 CDN。
【问题讨论】:
-
为什么不使用
<img src="yourcdn.com/images/1.png">?为您的静态图像。 image_tag 将始终附加 md5 掩码(或您使用的任何内容) -
@Avdept
%img{src: 'images/2.png'}甚至不能在本地主机上工作。在我不提供静态资产的开发中 -
不应该像
'/images/2.png'吗? -
@Avdept 不,实际上
%img{src: 'assets/2.jpg'}在本地主机上工作。但问题的另一部分是,当我预编译时,没有将2.jpg的图像文件复制到公共资产文件夹。 -
来自 Rails 文档 当文件内容改变时,文件名也会改变。 所以如果你的图像没有改变,那么它不会在预编译时生成新的文件哈希
标签: ruby-on-rails ruby ruby-on-rails-4 cdn