Свой первый проект на рельсах я начинал, когда 3.1 только-только вышла и ассеты выгодно отличали их от 3.0. Тогда же coffee показался лакониченее js а sass структоризовал css без ублюдочного дублирования. Короче мне было хорошо. Наверное, было хорошо всем рельсовикам. Но не одними рельсами…

В 4х рельсах ассеты вынесли в отдельный гем, что я посмотрю стало просто одним из закулисных лозунгов релиза. На память приходят гемонизированные с рождения strong_parameters, cache_digests, turbolinks, routing_concerns. Теперь sprockets-rails

Sprokets

В общем, помимо очевидного удовлетворения требования loose coupling это дает мейтейнерам рвануть вперед. (Обратная ситуация, например, складывается в django, где тулзу south для автосоздания миграций по изменениям в описании модели хотят таки запихать в мейнстрим). В общем sprockets-rails для интергации, а сам гем sprockets внезапно рванул к версии 2.7 c 2.1, как я однажды заметил в выводе bundle outdated.

Совместимые версии гема и бриджа будут иметь одну мажорную версию. Sprokets 3.х обещает ввести фичу source maps. Будет соответствующая 3.х версия бриджа, все это обещает появиться на свет к релизу 4.1

Сборка ассетов

Обещают умопорачительное улучшение от Josh Peek. Встроенная поддержка прекомпиляции и генерации манифеста. Исчезнет StaticCompiler, его заменят методы класса Manifest. Уберут двойную компиляцию, когда одновременно собираются версия в уникальным хешом и без него (ужас, да?) - управлять процессом будет все тот же config.assets.digest. Понятно, что дело должно ускориться. Версии без хеша просят оставлять в живых, видимо для пропуска сборки того, что не менялось. Не знаю, как комьюнити, но я убедился, что vendor и application js&css надо держать порознь.

Опции сборки

  • config.assets.enabled - устарело. Просто не грузите sprockets-rails если не надо в railties.
### Disabling frameworks in Rails 3+###

# Replace in your config/application.rb
require "rails/all"

# with:
require "rails"

# Pick the frameworks you want:
require "active_record/railtie"
require "action_controller/railtie"
require "sprockets/rails/railtie"
require "action_mailer/railtie"
require "rails/test_unit/railtie"

# For example to disable sprockets-rails you can comment
# `require "sprockets/rails/railtie"`

# This is done automatically for new apps when you use some of `--skip-*` flags,
# for example you can start a new app with sprockets railtie turned off
# with `rails new foo --skip-sprockets`
  • config.assets.manifest - удалено. Люди не поняли, зачем эта ручка :) Теперь манифест сохраняется вместе с ассетами, но не исключено, что может переехать, короче, мейнтейнерам виднее :)

  • config.assets.cache - пока что по умолчанию временная директория ассетов tmp/cache/assets не шарится между окружениями в 3.х - это нетихо напрягает тем, что для тестов в браузере вперемешку с интеграционными тестами это перетирает все. В 4.х это разделено по разным местам

  • config.assets.logger - удалено. Теперь sprockets плюются в лог реже, используя уровень :debug. Вернуть старое поведение можно через Rails.application.assets.logger =

Хелперы для ассетов

Josh Peek отрефакторил код хелперов: теперь хелперы отвязаны от ActionView хелперов. Мейнтейнерам проще мейнтейнить, разработчикам - отделять зерна от плевен в отладочных ошибках ассетов.

Производительность

Текущая меня убивает. На несложном проекте с тотал ~1Mb негзипованных ассетов компиляция идет около минуты. Признаться честно, я и не думал, что оно компилит две версии - с digest и без - отдельно. Короче обещают “пару секунд” вместо “от нескольких секунд до минут”. Ну и Nathan Broadbent разбирается с идеей на поверхности (только поди реализуй :) - трекингом того, что поменялось. Помочь можно и нужно тут.

Главное - можно опробовать это прямо сейчас с гемом turbo-sprockets-rails3

По мотивам этой статьи