Aplikasi Rails default yang diinstal oleh rails new
telah config.assets.compile = false
dalam produksi.
Dan cara biasa untuk melakukan sesuatu adalah dengan menjalankan rake assets:precompile
sebelum menggunakan aplikasi Anda, untuk memastikan semua aset pipa aset dikompilasi.
Jadi apa yang terjadi jika saya mengatur config.assets.compile = true
produksi?
Saya tidak perlu lari precompile
lagi. Apa yang saya percaya akan terjadi adalah pertama kali suatu aset diminta, itu akan dikompilasi. Ini akan menjadi hit kinerja yang pertama kali (dan itu berarti Anda umumnya memerlukan js runtime dalam produksi untuk melakukannya). Tapi selain kerugian ini, setelah aset itu disusun dengan malas, saya pikir semua akses selanjutnya ke aset itu tidak akan ada memukul kinerja, kinerja aplikasi akan persis sama seperti dengan aset dikompilasi setelah kompilasi ini awal pertama-hit malas. Apakah ini benar?
Apakah ada sesuatu yang saya lewatkan? Adakah alasan lain untuk tidak menetapkan config.assets.compile = true
produksi? Jika saya memiliki runtime JS dalam produksi, dan saya bersedia mengambil tradeoff kinerja terdegradasi untuk akses pertama suatu aset, sebagai imbalan karena tidak harus menjalankanprecompile
, apakah ini masuk akal?
Jawaban:
Saya menulis sedikit panduan itu.
Anda pasti tidak ingin tinggal kompilasi dalam produksi.
Ketika Anda telah mengkompilasi, inilah yang terjadi:
Setiap permintaan untuk file di / aset diteruskan ke Sprockets. Yang pertama permintaan untuk masing-masing dan setiap aset itu dikompilasi dan di-cache dalam apa pun Rails gunakan untuk cache (biasanya sistem file).
Pada permintaan berikutnya Sprockets menerima permintaan tersebut dan harus mencari nama file sidik jari, periksa apakah file (gambar) atau file (css dan js) yang membentuk aset tidak diubah, dan kemudian jika ada versi cache melayani itu.
Itu adalah segalanya di folder aset dan di folder vendor / aset apa pun yang digunakan oleh plugin.
Itu banyak overhead seperti, jujur, kode tidak dioptimalkan untuk kecepatan.
Ini akan berdampak pada seberapa cepat aset beralih ke klien, dan akan berdampak negatif terhadap waktu pemuatan halaman situs Anda.
Bandingkan dengan yang standar:
Ketika aset dikompilasi dan dikompilasi dimatikan, aset dikompilasi dan sidik jari ke
public/assets
. Sprockets mengembalikan tabel pemetaan dari dataran ke nama file sidik jari ke Rails, dan Rails menulis ini ke sistem file. File manifes (YML di Rails 3 atau JSON dengan nama acak di Rails 4) dimuat ke dalam Memory by Rails saat startup dan di-cache untuk digunakan oleh metode pembantu aset.Ini membuat pembuatan halaman dengan aset sidik jari yang benar menjadi sangat cepat, dan penyajian file itu sendiri adalah web-server-dari-filesystem yang cepat. Keduanya secara dramatis lebih cepat daripada kompilasi langsung.
Untuk mendapatkan keuntungan maksimal dari pipeline dan sidik jari, Anda perlu mengatur header masa depan jauh di server web Anda, dan mengaktifkan kompresi gzip untuk file js dan css. Sprockets menulis versi aset yang di-gzip yang dapat Anda atur untuk digunakan server Anda, menghilangkan keharusan untuk melakukannya untuk setiap permintaan.
Ini memberikan aset kepada klien secepat mungkin, dan dalam ukuran sekecil mungkin, mempercepat tampilan sisi-klien dari halaman, dan mengurangi permintaan (dengan header yang jauh di masa depan).
Jadi jika Anda tinggal mengompilasinya adalah:
Melawan
Edit: (Jawaban untuk menindaklanjuti komentar)
Pipa dapat diubah untuk dikompilasi pada permintaan pertama tetapi ada beberapa penghalang utama untuk melakukannya. Yang pertama adalah harus ada tabel pencarian untuk nama sidik jari atau metode pembantu terlalu lambat. Di bawah senario kompilasi berdasarkan permintaan akan perlu ada cara untuk menambahkan ke tabel pencarian karena setiap aset baru dikompilasi atau diminta.
Juga, seseorang harus membayar harga pengiriman aset lambat untuk periode waktu yang tidak diketahui sampai semua aset dikompilasi dan di tempat.
Defaultnya, di mana harga kompilasi semuanya dibayar secara off-line pada satu waktu, tidak memengaruhi pengunjung publik dan memastikan bahwa semuanya berfungsi sebelum semuanya ditayangkan.
Pemecah masalah adalah bahwa hal itu menambah banyak kerumitan pada sistem produksi.
[Sunting, Juni 2015] Jika Anda membaca ini karena Anda mencari solusi untuk waktu kompilasi yang lambat selama penerapan, maka Anda dapat mempertimbangkan untuk mengkompilasi ulang aset secara lokal. Informasi tentang ini ada di panduan jalur pipa aset . Ini memungkinkan Anda mengkompilasi secara lokal hanya ketika ada perubahan, komit itu, dan kemudian memiliki penyebaran cepat tanpa tahap precompile.
sumber
Untuk memiliki lebih sedikit overhead dengan hal Pra-kompilasi.
Anda kemudian dapat menggunakan gambar dan stylesheet sebagai "/assets/stylesheet.css" di * .html.erb atau "/assets/web.png"
sumber
Bagi siapa pun yang menggunakan Heroku:
Jika Anda menerapkan ke Herkou, itu akan melakukan precompile untuk Anda secara otomatis selama penyebaran jika aset yang dikompilasi tidak termasuk (yaitu
public/assets
tidak berkomitmen) sehingga tidak perluconfig.assets.compile = true
, atau untuk melakukan aset yang dikompilasi.Dokumen Heroku ada di sini . Sebuah CDN dianjurkan untuk menghapus beban pada sumber daya dyno.
sumber
Itu tidak akan sama dengan mengkompilasi, bahkan setelah hit pertama: karena file tidak ditulis ke sistem file, mereka tidak dapat dilayani secara langsung oleh server web. Beberapa kode ruby akan selalu terlibat, meskipun hanya membaca entri cache.
sumber
precompile=true
, aset yang dikompilasi AKAN ditulis ke sistem file. Apakah kamu yakin Biarkan saya periksa ...tmp/cache
bukanpublic/assets
, jadi bukan tempat yang bisa dilihat server web, mereka masih akan dilayani oleh aplikasi rel tidak server web. bla. apakah itu benar, menurut Anda?Set
config.asset.compile = false
Tambahkan ke Gemfile Anda
group :assets do gem 'turbo-sprockets-rails3' end
Instal bundel
Lari
rake assets:precompile
Kemudian Mulai server Anda
sumber
config.asset.compile = true in production.rb
file, karena tidak ada mekanisme pre-comple ditambahkan. Karena itu setiap kali kita memulai server, dibutuhkan terlalu banyak waktu untuk memuat halaman (Ketika permintaan mengenai memproses permintaan dan mengkompilasi aset). Sekarang saya termasukturbo-sprockets-rails3
dalam Gemfile dan menjalankan perintahnyarake assets:precompile
mengkompilasi aset sebelumnya. Sekarang saya mengaturconfig.asset.compile = false in production.rb
dan memulai server, pemuatan halaman tanpa penundaan. (Hanya memproses permintaan tanpa kompilasi aset)turbo-sprockets-rails3
hanya diperlukan di Ruby 3Dari panduan resmi :
Juga, langkah precompile sama sekali tidak masalah jika Anda menggunakan Capistrano untuk penyebaran Anda. Itu mengurusnya untukmu. Kamu baru saja lari
atau (tergantung pada pengaturan Anda)
dan Anda sudah siap. Jika Anda masih tidak menggunakannya, saya sangat merekomendasikan untuk memeriksanya.
sumber
Karena membuka kerentanan traversal direktori - https://blog.heroku.com/rails-asset-pipeline-vulnerability
sumber