[Перевод] Rails сквозь года: Ключевые изменения от версии 1 к версии 8
Ruby On Rails был краеугольным камнем в веб-разработке с момента своего основания, позволяя разработчикам создавать масштабируемые и поддерживаемые веб-приложения. С эволюцией Rails каждая версия вводила новые функции, улучшения производительности и безопасности. Поскольку Rails имеет открытый исходный код, разработчики постоянно решали существующие проблемы и добавляли улучшения, поддерживая фреймворк в соответствии с новыми трендами. Итак, давайте рассмотрим путь Rails как фреймворка от зарождения до последних достижений.
Рождение Rails (2004): Почему Rails был создан
В начале 2000-х годов создание веб-приложений часто было утомительным и требовало повторяющегося кода для обработки взаимодействий с базой данных и логики приложения. Дэвид Хайнемайер Ханссон (DHH), разрабатывая Basecamp, осознал необходимость в фреймворке, который акцентировал бы внимание на соглашениях, а не на конфигурации (convention over configuration), и на счастье разработчиков.
Основа философии Rails:
DRY (Don’t Repeat Yourself): Сократить повторение кода путем вынесения поторяющихся паттернов в абстракции;
Соглашение вместо конфигурации (Convention Over Configuration): предоставить разумные стандартные настройки, чтобы минимизировать количество конфигураций
Фулл-стек фреймворк: предложить инструменты для всего процесса разработки, от миграций базы данных до управления ассетами на фронт-энде
Rails был рожден для оптимизации веб-разработки путём уменьшения количества шаблонного кода и предложения структуризированного, но в то же время гибкого фреймворка.
Rails 1 (2005): Начало простоты
Rails 1 представил миру свежий и революционный путь постоения веб-приложений, фокусируясь на продуктивности разработчика и простоте использования.
Rails 1 стал хорошим началом. В 2006, он (фреймворк) выиграл награду «Язык года» от Tiobe. Однако затем команда разработки столкнулась с некоторыми проблемами. Среди них:
Ограниченная масштабируемость больших приложений;
Отсутствие RESTful маршрутизации привело к дезорганизации контроллеров;
Уязвимости безопасности, такие как риски массового присвоения (mass assignment), были распространены.
Это привело к новой версии — Rails 2.
Rails 2 (2007): Укрепление фундамента
Rails 2 укрепило фреймворк улучшением масштабируемости, представив RESTful дизайн и улучшив безопасность.
Примечательные методы/фичи:
named_scope =>
для создания цепочки методов запросов к базе данных;before_filter => (позже before_action)
для реализации DRY принципа в методах контроллеровrespond_to =>
для реализации множества форматов ответа сервера (HTML, JSON, XML).
Популярность Rails в этот момент начала расти. Некоторые из наиболее популярных приложений (Twitter, Hulu, Shopify) начали использовать его как основной фреймворк.
23 декабря 2008 был запущен Merb, еще один фреймворк для создания веб-приложений. Он был очень похож на Rails, что вызвало множество столкновений в сообществах обоих фреймворков. Однако, в это время команда Rails работала с Merb и Merb был объединен с Rails.
Однако у системы были свои недостатки. Плагинам и гемам недоставало стандартизации, проблемы производительности в сложных запросах становились болью, и ручная обработка состояний и сложной логики моделей вызывала трудности.
Rails 3 (2010): Консолидация и модуляризация
Rails 3 ознаменовал поворотный момент в истории Rails, объединив разрозненные компоненты в единую структуру. Эта версия положила основу в современный Rails, оптимизируя разработку и улучшая производительность.
Примечательные методы / фичи:
where
: метод ActiveRecord для упрощения сложных запросов;respond_to
: был улучшен для обработки нескольких форматов более элегантно.Добавлен asset pipeline (Rails 3.1), чтобы стандартизировать управление JavaScript, CSS, что решило проблему масштабирования фронт-энд ассетов.
В свою очередь, эти изменения стали причиной нового набора проблем. Asset pipeline добавил сложности в процессы разработки. Проблемы с производительностью начали проявляться в масштабных развертываниях приложения, а обработка фоновых задач была ограниченной.
Rails 4 (2013): Улучшения конвенций и производительности
Основываясь на фундаменте Rails 3, Rails 4 улучшил производительность, безопасность, ввёл конвенции, сделавшией приложения более надежными.
Примечательные методы / фичи:
belongs_to
ассоциации стали обязательными по умолчанию для предотвращения проблем с целостностью данныхenum
для ActiveRecord для управления состоянием с помощью целочисленных отображений, отвечающее потребности более простого управления состояниемhas_secure_password
включен в ActiveModel, чтобы упростить процесс аутентификации
В этой версии turbolinks внес несогласованность в сложные JavaScript приложения, производительность asset pipeline’ов замедлилась с ростом приложений. Зависимость обработчиков фоновых задач от Redis усложнила инфраструктуру. Это вызвало потребность в новой версии Rails, Rails 5.
Rails 5 (2016): API режим и Real-Time фичи
Rails 5 удоавлетворил растущую потребность в API и real-time фичах, подготовив сцену для интерактивных и масштабируемых приложений.
Примечательные методы / фичи:
Добавлены хуки
after_commit
иafter_rollback
для более точного контроля транзакций в базе данныхrails db: setup объединил первоначальную настройку базы данных со схемой и начальными данными в одну команду.
В то время, как Rails 5 привнёс режим API, множество приложений все еще сталкивалось с проблемами в разделении монолитных структур, что приводило к проблемам с производительностью в больших приложениях. Хотя ActionCable и был добавлен, WebSocket’ы приводили к сложностям с масштабируемостью и развертыванием. Также отсутствие единого способа управления очередями фоновых задач вело к несогласованности и зависимости от множества гемов. Иммено тогда был представлен Rails 6.
Rails 6 (2019): Продуктивность и масштабируемость
Rails 6 сфокусировался на улучшении продуктивности разработчика и масштабируемости, обеспечивая, чтобы Rails приложения могли соответствовать современным требованиям.
Примечательные методы / фичи:
Метод
has_rich_text
упрощает управление большими текстамиrails db:system:change
позволяет бесшовно сменить базу данныхУлучшена производительность ассоциаций
has_many :through
В Rails 6 Sprockets становился все более и более медленным для больших приложений, вызывая замедления в производительности. Webpacker улучшил управление ассетами, но его конфигурация была сложной и становилась причиной ошибок. Обновление до более новых версий стало проблемой из за ошибок Webpack. Также, несмотря на то, что была добавлена поддержка нескольких баз данных, кэширование и улучшение производительности все еще требовало значительного ручного вмешательства.
Rails 7 (2021): Фулл-стек разработка и простота
Rails 7 упростил фулл-стек разработку минимизировав JavaScript-зависимости и предлагая более сконцентрированный на Rails подход.
Примечательные методы / фичи:
config.load_defaults 7.0
упрощает обновление до новых значений по умолчаниюrails new app --css=tailwind
упростил интеграцию с Tailwind CSSДобавлено встроенное шифрование для конфиденциальных атрибутов ActiveRecord.
До нынешнего момента обработка фоновых задач сильно полагалась на Redis, увеличивая стоимость и сложность инфраструктуры. Отсутствие встроенной аутентификации привело к зависимости от Devise или кастомных имплементаций, ведущих к переусложнению проекта.
Rails 8 (2024): Эффективность, простота и новые инструменты развертывания
Rails 8 представляет набор функций, отдающих приоритет оперативности развертывания приложения, более компактным конфигурациям и бесшовной аутентификации.
Ключевые изменения:
Развертывание без усилий: интеграция с Kamal 2 и Thruster упрощает процессы развертывания;
SolidQueue для фоновых задач: заменяет Redis, позволяя ActiveJob обрабатывать фоновые задачи не полагаясь на внешние системы;
Propshaft Asset Pipeline: более легкая альтернатива Sprockets, упрощающая управление ассетами;
Встроенная аутентификация: аутентификация «из коробки», уменьшающая зависимость от внешних гемов вроде Devise;
Папка скриптов и генератор: новая
script
директория для организации кастомных скриптов и упрощенный генератор для создания шаблонного кода быстрее;
Примечательные методы / фичи:
Метод
authenticate
прямо в контроллерах для управления сессиейКоманда
deploy
для бесшовной интеграцииpropshaft.append_path
для кастомизации менеджмента ассетов
Заключение
Rails вырос от простого веб-фреймворка до мощного, масштабируемого решения для современных веб-приложений. Каждая версия отвечает эволюционирующим требованиям разработчиков. Не важно, поддерживаете ли вы Rails 3 приложение или создаете новое Rails 7, понимание пути помогает вам создавать приложения быстрее, лучше и более безопасно. Кроме того, будущее Rails указывает на разработку на основе ИИ и передовые технологии, такие как WebAssembly. Так что следите за последними обновлениями.