Процес ініціалізації Rails є структурованою послідовністю, яка готує середовище програми та завантажує всі необхідні залежності. Ось огляд того, як Rails обробляє старт і завантаження залежностей:
Процес ініціалізації Rails
- Запуск
- Коли ви запускаєте команду Rails, наприклад
rails server
, виконується скриптbin/rails
. - Цей скрипт завантажує файл
config/boot.rb
, який ініціалізує залежності з Gemfile через Bundler.
2. Завантаження програми
- Наступним завантажується файл
config/application.rb
. Цей файл ініціалізує додаток Rails і завантажує класRails::Application
. - Тут визначаються власні ініціалізатори та конфігурації програми.
3. Завантаження фреймворку
- Rails завантажує основні компоненти фреймворку (
ActiveRecord
,ActionController
,ActionView
тощо) на основіrequire
інструкцій у файліrails/all
або тих, що явно вказані в програмі.
4.
Завантаження ініціалізаторів
- Rails виконує ініціалізатори з
config/initializers
, щоб налаштувати проміжне програмне забезпечення (middleware), конфігурувати залежності та ініціалізувати будь-яку власну логіку. Ці файли завантажуються в алфавітному порядку.
5. Налаштування шляхів автозавантаження
- Rails налаштовує автозавантаження за допомогою бібліотеки Zeitwerk. Він додає каталоги, такі як
app/models
,app/controllers
та інші, вказані в конфігурації програми, до шляхів автозавантаження. - Це дозволяє Rails автоматично завантажувати класи та модулі, коли вони використовуються, без явного виклику
require
.
6. Завантаження середовища
- Завантажується специфічний файл конфігурації середовища (наприклад,
config/environments/development.rb
). - Застосовуються налаштування для конкретного середовища, такі як рівні логування, конфігурації бази даних та проміжне програмне забезпечення (middleware).
7. Eager Loading (в продукції)
- В продукційному середовищі Rails виконує eager loading для всіх класів програми та залежностей, щоб оптимізувати продуктивність під час виконання.
Це включає завантаження всіх файлів з каталогуapp/
та інших вказаних шляхів. - У розробці Rails використовує lazy loading, завантажуючи файли тільки коли вони доступні.
8. Стек проміжного програмного забезпечення (Middleware Stack)
- Rails ініціалізує стек проміжного програмного забезпечення, вказаний у файлі
config/application.rb
та інших конфігураціях. Проміжне програмне забезпечення обробляє запити та відповіді між веб-сервером та додатком Rails.
9. Встановлення з'єднання з базою даних
- Rails встановлює з'єднання з базою даних, використовуючи налаштування, визначені у файлі
config/database.yml
.
10. Остаточні підготовки
- Перед тим, як додаток буде готовий до обробки запитів, завантажується файл
config/routes.rb
, щоб визначити маршрутизацію додатку. - Виконуються хуки
to_prepare
та будь-які інші налаштування, зазначені вapplication.rb
.
Завантаження залежностей
Rails використовує поєднання Bundler і автозавантажувача Zeitwerk для управління залежностями:
- Bundler
- Файли
config/boot.rb
таconfig/application.rb
завантажують Gemfile за допомогою Bundler.
Це гарантує, що всі необхідні gems доступні для додатку.
2. Автозавантажувач Zeitwerk
- Rails налаштовує Zeitwerk для автоматичного завантаження та перезавантаження класів і модулів. Zeitwerk відображає каталоги на простори імен, що дозволяє Rails завантажувати файли, коли константа вперше згадується.
3. Спеціальні require
- Якщо додаток або gem вимагає певних файлів, які Rails не може автоматично завантажити, розробники можуть явно підключити їх в ініціалізаторі або в
config/application.rb
.
4. Eager Loading
- У продакшн-режимі Rails завантажує всі залежності заздалегідь, щоб мінімізувати затримки під час виконання.
Це гарантує, що всі необхідні класи та модулі будуть завантажені в пам'ять до обробки запитів.
Ключові концепції керування залежностями
- Ліниве завантаження в розробці
Rails завантажує файли лише тоді, коли вони вперше використовуються, що забезпечує швидший запуск та покращує досвід розробника. - Eager Loading у продакшн-режимі
Rails сканує та завантажує всі файли в вказаних шляхах для eager load (наприклад,app/
), щоб гарантувати, що все завантажено і уникнути помилок із відсутніми константами в багатозадачних середовищах. - Завантаження Middleware
Залежності Middleware завантажуються та ініціалізуються відповідно до їх конфігурації вconfig/application.rb
.
Цей структурований процес ініціалізації дозволяє Rails ефективно керувати залежностями та готувати додаток до обробки запитів.
Перекладено з: Understanding the Rails Initialization Process