Каковы способы ускорения процесса предварительной компиляции Rails Asset Pipeline?
Как вы можете ускорить процесс предварительной компиляции Rails Asset Pipeline?
Ответ 1
1. Ускорение развертывания Capistrano
(1) использовать встроенную задачу capistrano для развертывания/активов.
Capistrano имеет собственную встроенную задачу "развертывание/активы". Это автоматически сделает для вас задачу.
Разница между вашей собственной задачей handcraft заключается в том, что она загружает только группу assets
для прекомпиляции активов, а не для всей среды.
cd /home/apps/APP_NAME/releases/20120708184757 && bundle exec rake RAILS_ENV=production RAILS_GROUPS=assets assets:precompile
(2) пропустить процесс прекомпиляции, когда активы не изменены.
https://gist.github.com/3072362
Если
- приложение/активы
- Библиотека/активы
- поставщика/активы
- Gemfile.lock
- confir/routes.rb
они будут перекомпилировать активы. В противном случае он пропустит процесс передачи, сэкономит много времени.
2. Используйте @import тщательно.
(1) избегать прямого использования @import "compass";
.
Он будет работать, когда вы
@import "compass";
или @import "compass/typography/links/link-colors";
в SCSS.
Но @import "compass/typography/links/link-colors";
в 9 раз быстрее, чем @import "compass";
при компиляции активов.
Это потому, что когда @import "compass";
, он компилирует все активы компаса. не только часть link-colors
.
(2) избегать использования частичных
В SCSS нам нравится использовать partial
для организации наших активов.
Но только если вам нужно обмениваться переменными или есть необходимые зависимости, в противном случае
//= require "reset"
//= require "base"
//= require "product"
быстрее, чем
@import "reset";
@import "base";
@import "product";
3. dont требуют .scss и. coffee без причины
(1) избегать использования require_tree
Когда мы используем генератор Rails для генерации контроллеров. Rails также генерирует активы, подобные этому
- product.css.scss
- product.js.coffee
и монтируйте ресурсы в application.js, используя следующие методы:
//= require_tree
Но пустые активы (ничего не выводят), которые содержат только эти строки:
# Place all the behaviors and hooks related to the matching controller here.
# All this logic will automatically be available in application.js.
# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/
Это будет стоить вам около 250 мс для компиляции каждого из них. Если у вас 10 пустых активов, это будет 2,5 секунды.
Удалите их из своего проекта или установите их отдельно в application.js следующим образом:
//= require prodcuts
//= require users
//= require albums
(2) Не используйте css.scss
или js.coffee
, если это не нужно.
- Скомпилированный jquery-ui-1.8.16.custom.css(0ms) (pid 19108)
- Скомпилированный jquery.ui.1.8.16.ie.css(0ms) (pid 19108)
- Скомпилированный jquery.js(5ms) (pid 19108)
- Скомпилированный jquery_ujs.js(0ms) (pid 19108)
- Скомпилированный custom.css(14ms) (pid 19108)
custom.css
custom.css.scss
Скомпилируйте чистый CSS и чистый JS быстро (стоимость почти 0 мс). Но компилировать .scss и .coffee все равно стоит некоторое время.
Обобщить
- заменить задачу deploy.rb assets.
-
проверить журналы /production.log
- найти медленные активы
- удалить @import "компас"; используйте альтернативное решение.
- используйте вместо @import; (используйте @import, когда это действительно необходимо)
- удалить require_tree, самостоятельно установить ресурсы.
- удалить пустые .scss и .coffeescript
- используйте .css, когда активы являются чистыми CSS.
Ответ 2
Я только что написал камень для решения этой проблемы внутри Rails, называемый turbo-sprockets-rails3. Он ускоряет ваш assets:precompile
путем перекомпиляции измененных файлов и только компиляции один раз для создания всех активов.
Обратите внимание, что я также пытаюсь объединить этот патч в Rails 4.0.0 и, возможно, Rails 3.2.9 (см. https://github.com/rails/sprockets-rails/pull/21). Но на данный момент было бы замечательно, если бы вы могли помочь мне протестировать камень turbo-sprockets-rails3 и сообщить мне, есть ли у вас какие-либо проблемы.
Ответ 3
(2) избегать использования частичных
В SCSS мы предпочитаем частично использовать наши ресурсы
В последнем railsconf был введен libsass.
Вероятно, все будет изменено и переписано в C, частичные части scss обещают быть быстрее