Saya membaca posting tentang rel load_paths, berikut adalah link.
Tapi, saya masih bingung tentang perbedaan antara autoload_paths
dan eager_load_paths
:
Saya telah menguji mereka dalam baru dibuat Rel 4 proyek. Tampaknya bahwa mereka menjalankan cara yang sama, bahwa auto-reload dalam pengembangan mode tapi dalam mode produksi.
Penulis dari artikel terkait di sini. Berikut ini's merupakan upaya untuk menjernihkan kebingungan, pergi dari @fkreusch's jawaban.
Di Ruby anda harus memerlukan setiap .rb
file dalam rangka untuk memiliki kode dijalankan. Namun, perhatikan bagaimana dalam Rails anda tidak pernah secara khusus memerlukan dari model, controller, atau file lainnya di aplikasi /
dir. Mengapa demikian? Yang's karena di Rel aplikasi /*
adalah autoload_paths
. Ini berarti bahwa ketika anda menjalankan aplikasi rails anda dalam pengembangan (misalnya melalui rel konsol
) — tak satu pun dari model dan controller adalah benar-benar diperlukan oleh ruby belum. Rails menggunakan magis khusus fitur dari ruby untuk benar-benar menunggu sampai kode menyebutkan konstan, katakanlah Buku
, dan hanya kemudian akan menjalankan memerlukan 'pesan'
yang ditemukan di salah satu autoload_paths
. Ini memberi anda lebih cepat konsol dan server startup dalam pembangunan, karena tidak ada yang akan diperlukan ketika anda mulai, hanya jika kode benar-benar membutuhkannya.
Sekarang, perilaku ini lebih baik untuk pembangunan daerah, tetapi apa yang tentang produksi? Bayangkan bahwa di produksi server anda melakukan hal yang sama jenis magis pembebanan konstan (autoloading). It's bukan akhir dari dunia benar-benar, anda mulai server anda dalam produksi, dan orang-orang mulai browsing halaman anda sedikit lebih lambat, karena beberapa file akan perlu untuk secara otomatis diambil. Ya, itu's lebih lambat bagi mereka awal beberapa permintaan, sementara server "menghangat hingga", tapi itu's tidak seburuk itu. Kecuali, yang's bukan akhir dari cerita.
Jika anda berjalan pada ruby 1.9.x (jika saya ingat dengan benar), maka otomatis membutuhkan file-file seperti itu tidak thread safe. Jadi jika anda menggunakan server seperti puma, anda akan mengalami masalah. Bahkan jika anda tidak't menggunakan multi-threaded server, anda masih mungkin lebih baik setelah anda mendapatkan aplikasi yang dibutuhkan "proaktif", pada startup. Ini berarti bahwa dalam produksi, anda ingin setiap model, setiap controller, dll semua sepenuhnya diperlukan saat anda memulai aplikasi anda, dan anda don't pikiran semakin lama waktu startup. Ini disebut eager loading. Semua ruby file mendapatkan bersemangat dimuat, mendapatkan itu? Tapi bagaimana anda bisa melakukan itu, jika anda rails app doesn't memiliki satu memerlukan
pernyataan? Yang's di mana eager_load_paths
datang. Apa pun yang anda menaruh di dalamnya, semua file di semua folder di bawah jalur-jalur tersebut akan diperlukan pada saat startup di produksi. Semoga ini bisa membersihkan itu.
It's penting untuk dicatat bahwa eager_load_paths
tidak aktif dalam pembangunan lingkungan, sehingga apa pun yang anda menaruh di dalamnya tidak akan bersemangat dibutuhkan segera dalam pembangunan, hanya di produksi.
It's juga penting untuk dicatat bahwa hanya menempatkan sesuatu ke autoload_paths
tidak akan membuatnya bersemangat dimuat dalam produksi. Sayangnya. Anda harus secara eksplisit memasukkannya ke dalam eager_load_paths
juga.
Lain yang menarik kekhasan adalah bahwa dalam setiap rails app, semua direktori di bawah aplikasi/
secara otomatis di kedua autoload_paths
dan eager_load_paths
, yang berarti bahwa menambahkan sebuah direktori yang ada tidak memerlukan tindakan lebih lanjut.
Pada dasarnya, autoload_paths
adalah jalan Rel yang akan digunakan untuk mencoba memuat kelas-kelas secara otomatis. E. g. ketika anda menelepon Buku
, jika kelas itu isn't dimuat belum, itu akan pergi melalui autoload_paths
dan mencarinya di jalur-jalur tersebut.
Dalam produksi, mungkin akan lebih baik untuk memuat orang-orang dimuka untuk menghindari autoload bersamaan masalah. Untuk itu, ia menyediakan eager_load_paths
. Jalan dalam daftar itu akan diminta dimuka ketika aplikasi dimulai.