在我的开发沙盒中
RAILS_ENV=production rake assets:precompile
需要4分钟才能完成。这是正常的吗?在heroku上花费超过10分钟来完成这项工作,有时会超时。有没有办法解决这个问题和/或加快速度?
更新
我描述了编译的CSS vs JS阶段
3.7 s js
175 s css
这些数字来自于此处
----------------------
/Users/bradphelan/.rvm/gems/ruby-1.9.2-p180@gobbq/gems/sprockets-2.1.2/lib/sprockets/processing.rb
----------------------
266 # Assign a compressor to run on `application/javascript` assets.
267 #
268 # The compressor object must respond to `compress` or `compile`.
269 def js_compressor=(compressor)
270 expire_index!
271
272 unregister_bundle_processor 'application/javascript', :js_compressor
273 return unless compressor
274
275 register_bundle_processor 'application/javascript', :js_compressor do |context, data|
276
277 timeit "js" do
278 compressor.compress(data)
279 end
280
281 end
282 end
和
----------------------
/Users/bradphelan/.rvm/gems/ruby-1.9.2-p180@gobbq/gems/sprockets-2.1.2/lib/sprockets/processing.rb
----------------------
241
242 # Assign a compressor to run on `text/css` assets.
243 #
244 # The compressor object must respond to `compress` or `compile`.
245 def css_compressor=(compressor)
246 expire_index!
247
248 unregister_bundle_processor 'text/css', :css_compressor
249 return unless compressor
250
251 register_bundle_processor 'text/css', :css_compressor do |context, data|
252 timeit "css" do
253 compressor.compress(data)
254 end
255 end
256 end
timeit 调用是执行时间的附加位
def timeit context
s = Time.now
yield.tap do
e = Time.now
d = e - s
puts "#{d*1000}\t #{context}"
end
end
答案 0 :(得分:5)
我在Rails 3.2.13上 - 我遇到了与css压缩相同的问题需要很长时间。修复:
在Gemfile中添加:
gem 'yui-compressor'
在config / environments / production.rb中:
config.assets.css_compressor = :yui
config.assets.js_compressor = :yui
rake assets:没有这些更改的预编译: 325秒
rake assets:使用这些更改进行预编译: 79秒
rake assets:没有压缩的预编译:45秒
答案 1 :(得分:3)
hackety hack解决方案似乎是将标准sass压缩引擎排除在外。我把它添加到我的application.rb
的顶部module Sass
module Rails
class CssCompressor
def compress(css)
css
end
end
end
end
文件大小的差异在猴子补丁之前是124k,之后是125k,并且速度提高了一个数量级。
答案 2 :(得分:1)
最好的选择是在本地编译,正常提交和部署,禁用生产的预编译任务。我现在正在为我的所有制作应用做这个。
要绕过在开发模式下提供的已编译资产(覆盖您需要的动态管道编译),请执行以下操作。
在development.rb中放置以下行:
config.assets.prefix = "/dev-assets"
这会覆盖application.rb中设置的任何内容(通常为“/ assets”)。
您还需要在application.rb中使用它:
config.assets.initialize_on_precompile = false
停止尝试连接数据库的任务。 (请注意,如果您在资产中引用ActiveRecord模型,因为这不起作用)。
这些更改允许您在本地编译资产并将其提交到存储库,并在工作开发树中包含这些文件,但仍将发送请求发送到Sprockets。此外,您只需在实际发生变化时进行预编译和提交。
答案 3 :(得分:1)
我们使用这个答案获得了数量级的加速:
EXECJS_RUNTIME='Node' JRUBY_OPTS="-J-d32 -X-C" RAILS_ENV=development bundle exec rake war
http://avinmathew.com/improving-rails-asset-precompile-times-on-jruby/