Rails üretiminde config.assets.compile = true, neden olmasın?


185

Varsayılan uygulaması yüklü Raylar rails newvardır config.assets.compile = falseüretimde.

Ve her şeyi yapmanın normal yolu rake assets:precompile, uygulamanızın dağıtımını yapmadan önce, tüm varlık hattı varlıklarının derlendiğinden emin olmaktır.

Peki, ben ayarlarsam ne olur? config.assets.compile = trueÜretime ?

precompileArtık koşmaya ihtiyacım olmayacak. Ne iman olur bir varlık istendiği ilk defa, bu derlenmiş olacaktır. Bu ilk kez bir performans isabeti olacaktır (ve bunu yapmak için genellikle üretimde bir js çalışma zamanına ihtiyacınız olduğu anlamına gelir). Varlık lazily derlendi sonra Ama diğer bu olumsuzlukları daha ben düşünüyorum bu öğeye sonraki tüm erişim sahip olacak hiçbir performans isabet, uygulamanın performansı olacak tam olarak aynı bu ilk ilk hit tembel derleme sonra önceden derlenmiş varlıklar olduğu gibi. bu doğru mu?

Eksik olduğum bir şey var mı? config.assets.compile = trueÜretime geçmemek için başka nedenler var mı? Üretimde bir JS çalışma zamanım varsa ve bir varlığın ilk erişimi için düşük performans dengesini almaya istekliysem , bunun yerine çalışmamaya gerek precompileyok, bu mantıklı mı?


1
Uyarı, zincir dişlilerinin eski sürümlerinde bir hata vardır ve config.assets.compile öğesi doğru yapılandırılırsa, dizin geçişi güvenlik açığı riski vardır ( blog.heroku.com/rails-asset-pipeline-vulnerability )
Mauro

Stackoverflow'un tam olarak bu şekilde çalışması gerekiyordu. İyi yazılmış bir soru ve iyi yazılmış bir cevap. Seni hem op hem de @ richard-hulse seviyorum.
schmijos

Yanıtlar:


259

Kılavuzun o kısmını yazdım.

Kesinlikle üretimde derleme yaşamak istemezsiniz.

Derleme yaptığınızda, olan budur:

/ Asset içindeki bir dosya için her istek Sprockets'e iletilir. On birinci Her varlık için istek derlenir ve önbellek (genellikle dosya sistemi) için kullandığı olursa olsun Rails önbelleğe.

Sonraki isteklerde Sprockets isteği alır ve parmak izi dosya adını aramak, öğeyi oluşturan dosyanın (görüntü) veya dosyaların (css ve js) değiştirilmediğini ve önbelleğe alınmış bir sürüm olup olmadığını kontrol edin.

Varlıklar klasöründeki ve eklentiler tarafından kullanılan satıcı / varlık klasörlerindeki her şey budur .

Dürüst olmak gerekirse, kod hız için optimize edilmediğinden bu çok fazla ek yüktür.

Bunun, varlığın kablodan istemciye ne kadar hızlı geçtiğini etkileyecek ve sitenizin sayfa yükleme sürelerini olumsuz etkileyecektir.

Varsayılan ile karşılaştır:

Varlıklar önceden derlendiğinde ve derleme kapalıyken, varlıklar derlenir ve public/assets. Sprockets, ovanın eşleme tablosunu parmak izleri ile dosya adlarını Rails'e döndürür ve Rails bunu dosya sistemine yazar. Manifest dosyası (Rails 3'te YML veya Rails 4'te rasgele bir ada sahip JSON) başlangıçta Rails tarafından Belleğe yüklenir ve varlık yardımcı yöntemleri tarafından kullanılmak üzere önbelleğe alınır.

Bu, doğru parmak izi varlıkları olan sayfaların oluşturulmasını çok hızlı hale getirir ve dosyaların kendilerinin sunulması dosya sisteminden web sunucusundan hızlıdır. Her ikisi de canlı derlemeden çok daha hızlı.

Boru hattının ve parmak izinin maksimum avantajını elde etmek için, web sunucunuzda uzak gelecekteki başlıkları ayarlamanız ve js ve css dosyaları için gzip sıkıştırmasını etkinleştirmeniz gerekir. Sprockets, sunucunuzu kullanacak şekilde ayarlayabileceğiniz varlıkların gzip edilmiş sürümlerini yazar ve her istek için gerekli olanları kaldırır.

Bu, varlıkların istemciye olabildiğince hızlı ve mümkün olan en küçük boyutta çıkarılmasını sağlar, sayfaların istemci tarafında görüntülenmesini hızlandırır ve (çok ilerideki başlıklarla) istekleri azaltır.

Eğer canlı derleme iseniz:

  1. Çok yavaş
  2. Sıkıştırma eksikliği
  3. Sayfaların oluşturma süresini etkiler

Karşı

  1. Mümkün olduğunca hızlı
  2. Sıkıştırılmış
  3. Aşırı duyulan sıkıştırmayı sunucudan kaldırın (isteğe bağlı).
  4. Sayfaların oluşturma süresini en aza indirin.

Düzenleme: (Yorumu takip etmek için cevap)

boru hattı olabilir ilk talep üzerine precompile değiştirilebilir ama bunu yaparken bazı önemli roadblock'lar vardır. Birincisi, parmak izi isimleri için bir arama tablosu olması veya yardımcı yöntemlerin çok yavaş olmasıdır. Talep üzerine derleme senaryosu altında, her yeni varlık derlendiğinden veya istendiğinden arama tablosuna eklemenin bir yolu olmalıdır.

Ayrıca, birisi tüm varlıklar derlenip yerinde olana kadar bilinmeyen bir süre için yavaş varlık teslimatının bedelini ödemek zorundadır.

Her şeyi derleme fiyatının bir kerede çevrimdışı ödenmesi durumunda, halka açık ziyaretçileri etkilemez ve her şey canlı olmadan önce her şeyin çalışmasını sağlar.

Anlaşma kırıcı, üretim sistemlerine çok fazla karmaşıklık katmasıdır.

[Düzenle, Haziran 2015] Bir dağıtım sırasında yavaş derleme süreleri için bir çözüm aradığınız için bunu okuyorsanız, varlıkları yerel olarak önceden derlemeyi düşünebilirsiniz. Bununla ilgili bilgiler varlık boru hattı kılavuzundadır . Bu, yalnızca bir değişiklik olduğunda yerel olarak ön derleme yapmanıza, bunu taahhüt etmenize ve daha sonra derleme aşaması olmadan hızlı bir dağıtım yapmanıza olanak tanır.


1
Teşekkür ederim, cevabınızı kabul ettim. Ama şimdi sorum şu, tamam, şimdi bunu yapmıyor, ama aklınıza gelince, Varlık Boru Hattı'nın ilk istekte tembel olarak derlediği, tam olarak derleme gibi bir özelliği olabileceğini düşünüyoruz. parmak izi tezahürü?
jrochkind

Yukarıyı görmek. Bu bir sorun mu var çünkü Capistrano sizin için çalışmıyor mu?
Richard Hulse

Ben Capistrano kullanmıyorum. Daha önce ihtiyaç duymadım, eklenen karmaşıklık buna değmezdi. Belki de varlık boru hattı, develeri parçalayan ve gerektiren samandır. Sizce Rails , capistrano veya benzeri olmayan varlık boru hattı ile dağıtımları yönetmek mümkün değil mi? Bu utanç verici, basit kurulumlar için elle yapmak büyük bir sorun değildi.
jrochkind

Raylar için Capistrano'ya gerçekten ihtiyacınız var 3.1. Varlıklar, eski uygulamanız hala çalışırken yeni bir genel dizinde derlenir. Derleme tamamlandığında yeni sürüm simgesine bağlanır ve sunucu otomatik olarak yeniden başlatılır.
Richard Hulse

"Boru hattının ve parmak izinin maksimum avantajını elde etmek için, web sunucunuzda uzak gelecekteki başlıkları ayarlamanız ve js ve css dosyaları için gzip sıkıştırmasını etkinleştirmeniz gerekir." - Lütfen nasıl yapılacağına ilişkin bazı talimatlar veya bağlantılar sağlayabilir misiniz? bu?
Isaac Betesh

7

Ön derleme ile daha az ek yüke sahip olmak.

Precompile everything initially with these settings in production.rb
# Precompile *all* assets, except those that start with underscore
config.assets.precompile << /(^[^_\/]|\/[^_])[^\/]*$/

daha sonra resimleri ve stil sayfalarını * .html.erb veya "/assets/web.png" dizininde "/assets/stylesheet.css" gibi kullanabilirsiniz.


6

Heroku kullanan herkes için:

Herkou'ya konuşlandırırsanız, derlenmiş varlıklar dahil edilmezse (yani public/assetstaahhüt edilmezse), önceden derlenmiş varlıklara gerek kalmazsa veya yüklenmezse, dağıtım sırasında sizin için otomatik olarak ön derleme yapılır config.assets.compile = true.

Heroku'nun belgeleri burada . Dinamo kaynağındaki yükü kaldırmak için bir CDN önerilir.


1

İlk isabetten sonra bile ön derleme ile aynı olmayacaktır: dosyalar dosya sistemine yazılmadığından doğrudan web sunucusu tarafından sunulamazlar. Bir önbellek girdisi okuyor olsa bile, bazı yakut kodlar her zaman dahil olacaktır.


Hmm, precompile=truederlenmiş varlıkların dosya sistemine yazılması gerektiğini düşündüm . Emin misiniz? Kontrol edeyim ...
jrochkind

1
Onlar dosya sistemine yazılır ARE ama benziyor - Bah, ben haklısın düşünüyorum tmp/cacheziyade public/assets, web sunucusu, hala raylar tarafından hizmet için gidiyoruz değil uygulamasını, görebileceği şekilde değil bir yer web sunucusu. filan. doğru mu?
jrochkind

Doğru. Web sunucusunun onları almasını sağlamak kadar hızlı olmayacak. Uygulamanızın önüne bulut gibi bir cdn koyarsanız önemli olmayabilir
Frederick Cheung

1

Ayarlamak config.asset.compile = false

Gemfile'nize ekleyin

group :assets do gem 'turbo-sprockets-rails3' end

Paketi kurun

Çalıştırmak rake assets:precompile

Sonra sunucunuzu başlatın


Bildiğim kadarıyla config.asset.compile = true in production.rbdosya ayarladığım için , önceden tamamlama mekanizması eklenmedi. Bu nedenle sunucuyu her başlattığımızda, sayfanın yüklenmesi çok fazla zaman alıyor (İstek hem isteği işleme hem de varlıkları derlemeye başladığında). Şimdi turbo-sprockets-rails3Gemfile dahil ve önceden rake assets:precompilevarlıkları derler komutu çalıştırın . Şimdi config.asset.compile = false in production.rbsunucuyu ayarlayıp başlatıyorum, herhangi bir gecikme olmadan sayfa yükleniyor. (Yalnızca varlık derlemesi olmadan isteği işleme)
Mohammed Saleem

2
söylemeye değer turbo-sprockets-rails3sadece Ruby 3
Andre Figueiredo

0

Resmi rehberden :

İlk istek üzerine, varlıklar yukarıdaki gelişimde belirtildiği gibi derlenir ve önbelleğe alınır ve yardımcılarda kullanılan manifest adları MD5 karmasını içerecek şekilde değiştirilir.

Sprockets ayrıca Cache-Control HTTP üst bilgisini max-age = 31536000 olarak ayarlar. Bu, sunucunuz ile istemci tarayıcısı arasındaki tüm önbelleklerin, bu içeriğin (sunulan dosya) 1 yıl boyunca önbelleğe alınabileceğini gösterir. Bunun etkisi, sunucunuzdan bu varlık için istek sayısını azaltmaktır; öğenin yerel tarayıcı önbelleğinde veya bazı ara önbellekte olma olasılığı yüksektir.

Bu mod daha fazla bellek kullanır, varsayılandan daha zayıf performans gösterir ve önerilmez.

Ayrıca, dağıtımlarınız için Capistrano kullanırsanız, derleme öncesi adım hiç sorun olmaz . Sizin için halleder. Sadece koş

cap deploy

veya (kurulumunuza bağlı olarak)

cap production deploy

ve hazırsınız. Hala kullanmıyorsanız, kontrol etmenizi tavsiye ederim.


Resmi rehberdeki dilin benimle aynı fikirde olduğunu düşünüyor musunuz? Bu kılavuzu gördüm, yukarıda önerdiğim şey anlamına gelip gelmediğinden emin değilim, ne düşünüyorsun? Benim sorum bu.
jrochkind

Evet, temelde aynı şeyi söylüyorsunuz. Canlı derlemeyi açmamanızı öneririm.
Sergio Tulentsev

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.