Rails под капотом. Базовые компоненты. ч. 1
Следующие несколько статей будут посвящены описанию гемов, которые устанавливаются как зависимости rails. Перечисление будет по порядку, как они идут в списке bundler. Поехали!!!
Rake - что это такое и зачем он нужен?
Очень простыми словами: Rake это вспомогательный инструмент для ruby проектов. Он предоставляет DSL для написания задач на ruby, которые можно запускать из командной строки
Сложнее: Rake это Ruby Make, отдельная утилита которая заменяет UNIX утилиту ‘make’. Он использует Rakefile и файлы с расширением .rake. Rails используют rake для административных задач. Если ввести в консоли rake --tasks то мы получим набор команд для работы с ассетами, кешем, базой данных и т.д. Также мы можем создавать свои задачи. Программисты обычно используют их либо для оптимизации своих действий, либо для изменения и какой-то обработки данных на сервере.
i18n - мультиязычность и интернационализация
Этот гем позволяет легко разрабатывать ваш интерфейс сразу на нескольких языках. Именно он добавляет хелпер t() который позволяет через псевдоним получить фразу на искомом языке. Сами же псевдонимы и фразы удобно оргиназуются с помощью YAML файлов.
json - упаковка данных в JSON и обратно
Гем используется для преобразования данных в json и обратно. Если я не ошибаюсь, он написан на ruby и используется в большинстве случаях. Но, если преобразование в json является вашей проблемой в производительности - можно использовать более быстрый gem oj. Опять же, если я не ошибаюсь, он написан на C и работает очень быстро.
minitest - стандартный компонент rails для тестирования.
Представляет собой DSL для написания тестов. Но, для тестов все же лучше использовать какой-нибудь более мощный инструмент, например RSpec, который с 3ей версии стал намного лучше.
thread_safe - потока-безопасная реализация нескольких ruby объектов.
Гем предоставляет потока-безопасную реализацию массива и хеша.
require 'thread_safe'
sa = ThreadSafe::Array.new # supports standard Array.new forms
sh = ThreadSafe::Hash.new # supports standard Hash.new forms
cache = ThreadSafe::Cache.new
Cache - более быстрая реализация ThreadSafe::Hash однако не полностью совместимая с ruby Hash
tzinfo - работа с датами в нескольких временных зонах и преобразование их к одной
activesupport - расширяем руби
Руби создавался чтобы быть удобным в первую очередь программисту. И эти самые программисты постоянно работают над тем, чтобы расширить базовые классы руби. Собственно именно это и делает gem activesupport - расширяет ruby, чтобы сделать его еще более удобным. Concerns
как более прокаченные модули, HashWithIndifferentAccess
, метода строки такие как pluralize
, humanize
и т.д. Очень огромное количество методов, которые добавляются сразу в несколько классов, например
{c: 3, b: 2, a: 1}.to_query # => "a=1&b=2&c=3"
И это очень круто, настолько круто, что самые популярные из них потом переходят в руби, как часть языка. Но, есть и неприятные моменты, например, когда пишешь на чистом руби, понимаешь, что нет многих вещей, к которым очень сильно привык.Советвую всем почитать оригинальную документацию
builder - генерация XML erubis - быстрая имплементация eRuby
Если честно, я так и не понял до конца, что это и зачем оно в рельсах, но судя по всему это какой-то шаблонный движок для вьюх, например как erb
mini_portile - портирование библиотек для отладки
Эта утилита нужна для мейнтейнеров rails. Разработчик не может себе позволить заявить “Это все работает у меня, а что там у вас разбирайтесь сами” mini_portile поможет легко, и главное временно, установить другие версии библиотек
require "mini_portile"
recipe = MiniPortile.new("libiconv", "1.13.1")
recipe.files = ["http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.1.tar.gz"]
recipe.cook
recipe.activate
Это пример из официальной документации, тут идет установка библиотеки libiconv версии 1.13.1
nokogiri - гем для скрейпинга веб страниц
Отличны инструмент, если вам нужно вытащить информацию из чужих веб страниц. Он разбирает структуру и позволяет искать элементы используя jQuery синтаксис. Короткий пример:
require 'nokogiri'
require 'open-uri'
doc = Nokogiri::HTML(open('http://www.nokogiri.org/tutorials/installing_nokogiri.html'))
doc.css('nav ul.menu li a').each do |link|
puts link.content
end
rails-deprecated_sanitizer - в rails 4.2 была переписана санитизация. Этот гем для совместимости и будет удален в rails 5
rails-dom-testing - тестирование дом структуры
При интеграионном тестировании нам часто нужно проверить, есть ли какой-то определенный элемент на странице
loofah - санитизация HTML/XML кода
rails-html-sanitizer - думаю название говорит само за себя. Это та самая новая санитизация в rails 4.2
actionview - реализация буквы V из паттерна MVC
Отвечает за логику представлений в рейлс. Позволяет использовать разные шаблонные движки, позволяет разбивать код на паршиалы, подгружает хелперы и т.д.Также он включает базовые хелперы rails: работа с формами, подключение стилей и скриптов и т.д.
rack - Что такое rack простыми словами
Что такое rack очень важная тема и достойна отдельной статьи, но я попытаюсь объяснить зачем он нужен и какое место он занимает в rails
Rack - прослойка между сервером и приложением. Когда запускается один из rails серверов (unicorn, puma, thin или любой другой) - на машине на которой он запущен становится доступен какой-то порт. Веб браузер на этот порт отправляет запрос, который выглядит примерно так
GET /users HTTP/1.1
Host: localhost
Connection: close
И он ожидает ответ, который выглядит примерно так
HTTP/1.1 200 OK
Content-Length: 25
Content-Type: text/html
...
Так вот, rack переводит входящий ответ в формат, описанный в его спецификации и передает управление в приложение. Соответственно, само приложение должно быть rack совместимым.
Еще раз - Сервер отвечает за то, чтобы принять запрос. Он решает задачи оптимизации этого процесса, много-поточности, взаимодействия с NGINX и т.д. Они используют rack чтобы передать управление в rack-совместимые приложения. Приложение обработает данные полученные из rack, и вернет ответ в формате,также описанном в rack спецификации. Сервер передает этот ответ браузеру. Думаю, что это довольно интересная тема и я напишу отдельную статью.
rack-test - тестовый фреймоврк для rack приложенией
Эта библиотека позволяет писать интеграционные тесты для тех случаев, когда нам не нужна поддержка javascript в тесте. Она позволяет сформировать запрос и передать его приложению, и это никак не будет отличаться от реального запроса из браузера
Комментарии