Почему Rails предварительно загружает все свои зависимости (гемы) во время загрузки? - PullRequest
6 голосов
/ 03 октября 2011

Когда запускается Rails, он предварительно загружает все свои зависимости (гемы), что приводит к очень медленному времени запуска. В проекте среднего размера, над которым я работаю, время запуска Rails составляет 10-15 секунд, в зависимости от машины.

Хотя это не проблема в производстве, это огромная боль в развитии. Особенно при работе TDD / BDD. Существуют решения для ускорения испытаний (например, spork), но они создают свои собственные проблемы.

Мой вопрос: почему бы не требовать необходимых зависимостей в каждом из файлов кода, вместо предварительной загрузки всего во время запуска?

Каковы недостатки руководства требует? Дополнительные строки кода?

1 Ответ

3 голосов
/ 03 октября 2011

Rails - это не PHP. Некоторые ресурсы загружаются автоматически, но все те, которые вам могут понадобиться, загружаются при загрузке / инициализации, потому что это лучше сделать до того, как запросы будут сделаны, чтобы приложение было готово, чем лениво загружать их по запросу, замедляя первый запрос. Многое из этого определения на лету в последнюю минуту методов и загрузки классов все еще происходит, сокращая время загрузки до всего 10-15 секунд , но если вы отрежете 5-10 секунд от это время загрузки, оно будет просто прикреплено к первому запросу. Ничего хорошего, верно?

Большая часть времени, которое вы испытываете, находится в гемах / плагинах / библиотеках, которые вы добавляете в свой проект. Многие из значительных размеров предлагают способы загрузки только тех частей, которые вам нужны, и многие другие могут использовать эту оптимизацию. Например, если у вас есть Rails-проект, который не требует Active Record, вы можете заменить:

require 'rails/all'

... с

require "action_controller/railtie"
require "action_mailer/railtie"
require "active_resource/railtie"
require "rails/test_unit/railtie"

… в вашем application.rb, чтобы сократить загрузку (и избежать ошибок, связанных с несуществующей базой данных).

...