Конвейер ресурсов Rails 3.1 — отсутствующие файлы из общедоступных/активов — почему это не по умолчанию?

После того, как сегодня днем ​​я развернул свое обновленное приложение Rails 2.3.x -> 3.1 (rc4) в нашей тестовой среде, все наши таблицы стилей и файлы JavaScript возвращали 404 ошибки. Мы добавили задачу rake assets:precompile в наш сценарий после развертывания, и потребовалось некоторое время, чтобы определить, почему в папке с ресурсами нет предварительно скомпилированных файлов, которые мы ожидали.

В конце концов, файлы не компилировались, потому что, по-видимому, по умолчанию обрабатываются только application.css и application.js (+ не JS/CSS-файлы).

Нам нужно было изменить следующее значение конфигурации следующим образом:

config.assets.precompile += %w( *.js *.css )

Вопрос: почему это не по умолчанию?

Я ожидал, что все, что не нужно обрабатывать как файл манифеста, будет просто скопировано в public/assets. Многое из того, что я читал о конвейере ресурсов, по сути состоит в том, чтобы «вставить свои ресурсы в приложение/активы, настроить файлы манифеста, и все должно работать». Поскольку задача assets:precompile не выдавала никакой информации о том, что она делала, потребовалось некоторое время, чтобы определить, что она просто просматривала не те файлы, которые, как мы думали, должна была.

Есть ли причина, по которой это не было бы хорошим значением для конфигурации прекомпиляции?

Спасибо!


person shedd    schedule 20.06.2011    source источник


Ответы (2)


Идея состоит в том, чтобы все ваши JavaScript и CSS всегда загружались за один раз, а не загружались по кусочкам по мере продвижения. Таким образом, у вас всегда будет загружен «мир» и готов к работе, вместо того, чтобы включать целую кучу отдельных файлов здесь и там.

Это немного большая нагрузка «вперед», но тогда браузер должен продолжать загружать весь javascript из кеша. Таким образом, воспринимаемая скорость сайта должна увеличиться из-за того, что все кэшировано и готово к работе после первого запроса.

Это было спорным решением о включении Rails, но то же самое относится и к включению CoffeeScript по умолчанию. Таким образом, Rails всегда был самоуверенным фреймворком.

person Christopher WJ Rueber    schedule 20.06.2011
comment
Спасибо, Крис, за ответ. Я понимаю, что имеет смысл сократить HTTP-запросы для повышения эффективности, но я думаю, что в большинстве приложений их CSS сегментирован как минимум на внутренние/внешние таблицы стилей и модульные файлы JavaScript. Просто кажется, что это настоящий сдвиг по сравнению с тем, как остальная часть фреймворка Rails работает с вещами, но, основываясь на значениях по умолчанию, определенно кажется, что это должно было быть размышлением. - person shedd; 21.06.2011
comment
Ну, определенно хотелось бы разрезать свои файлы на модульные. Идея состоит в том, что application.js и application.css включают в себя все конкретные javascript и css в этих каталогах (если вы посмотрите в эти файлы, вы найдете директиву «require_tree .», которая извлекает все в этот каталог и все его дочерние элементы). - person Christopher WJ Rueber; 21.06.2011
comment
В большинстве приложений Rails на самом деле нет сегментации CSS на разные таблицы стилей — по крайней мере, в том виде, в котором они доставляются клиенту. Отдельные исходные файлы CSS (и JS) компилируются в один совокупный файл application.css (или .js) конвейером ресурсов. Тем не менее, я склонен согласиться с вами в отношении того, какими должны быть значения по умолчанию для Rails — если бы (*.js *.css) было значением по умолчанию, оно все равно работало бы нормально или «предлагаемый» способ сделать это, но также просто работало бы для что вы пытались сделать. Я думаю, что более ранние версии Rails действительно работали так, как вы предполагаете, но они изменили его совсем недавно, возможно, по уважительным причинам, о которых мы не думаем. - person jrochkind; 07.06.2014

новый конвейер на основе sprockets компилирует все файлы в /asssets/stylesheets и /assets/javascripts по умолчанию компилируется в application.css и application.js соответственно.

В ваших представлениях вам нужно только связать файлы приложения, sprockets обрабатывает все остальное.

Обновление: ну, вам не нужно превращать все это в один файл... У вас могут быть общие.js, secure.js и public.js, и каждый из них будет включать в себя необходимые части...

Думайте о них не как о файлах javascript, а о файлах манифеста, которые устанавливают группы файлов javascript, которые затем можно включить в группу с помощью одного javascript_include_tag. Хотя по умолчанию все содержимое папки включается в один файл, вы всегда можете выбирать, что включать, а что нет.

Задача «предварительной компиляции» просто запускает эти файлы манифеста и компилирует несколько файлов в один, одновременно выполняя предварительную обработку и сценарий sass или coffee.

person colinross    schedule 20.06.2011
comment
Спасибо, Колин. Да, я понял это, но вопрос был немного глубже этого. - person shedd; 21.06.2011