Quels sont les moyens d'accélérer le processus de précompilation de Rails Asset Pipeline ?
Réponses
Trop de publicités?1. Accélération du déploiement de Capistrano
(1) utiliser la tâche intégrée de capistrano 'deploy/assets' pour déployer.
Capistrano a sa propre tâche intégrée 'deploy/assets'. Il fera automatiquement cette tâche pour vous.
La différence entre votre propre tâche artisanale est qu'elle ne fait que charger assets
pour précompiler les actifs, pas l'environnement entier.
cd /home/apps/APP_NAME/releases/20120708184757 && bundle exec rake RAILS_ENV=production RAILS_GROUPS=assets assets:precompile
(2) sauter le processus de précompilation lorsque les actifs ne sont pas modifiés.
https://gist.github.com/3072362
Si
- app/assets
- lib/assets
- vendeur/actifs
- Gemfile.lock
- confir/routes.rb
sont modifiés, il recompilera les actifs. Sinon, il ignore le processus de recompilation, ce qui permet de gagner beaucoup de temps.
2. Utilisez @import avec précaution.
(1) éviter d'utiliser @import "compass";
directement.
Il fonctionnera à la fois lorsque vous
@import "compass";
o @import "compass/typography/links/link-colors";
dans le SCSS.
Mais @import "compass/typography/links/link-colors";
est 9 fois plus rapide que @import "compass";
lorsque vous compilez des actifs.
C'est parce que lorsque @import "compass";
il compile tous les actifs de Compass. pas seulement link-colors
partie.
(2) éviter d'utiliser des partiels
En SCSS, nous aimons utiliser partial
pour organiser nos actifs.
Mais seulement si vous avez besoin de partager des variables, ou s'il y a des dépendances nécessaires, sinon
//= require "reset"
//= require "base"
//= require "product"
est plus rapide que
@import "reset";
@import "base";
@import "product";
3. ne pas exiger .scss & .coffee sans raison
(1) éviter d'utiliser require_tree
Lorsque nous utilisons le générateur Rails pour générer des contrôleurs. Rails va également générer des actifs comme ceci
- produit.css.scss
- product.js.coffee
et monter les actifs dans application.js en utilisant cette technique :
//= require_tree
Mais les actifs vides (ne produisant rien) qui ne contiennent que ces lignes :
# 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/
La compilation de chacun d'entre eux vous coûtera environ 250 ms. Si vous avez 10 ressources vides, cela prendra 2,5 secondes.
Retirez-les de votre projet, ou montez-les individuellement dans application.js comme ceci :
//= require prodcuts
//= require users
//= require albums
(2) Ne pas utiliser css.scss
o js.coffee
si cela n'est pas nécessaire.
- Compilation de jquery-ui-1.8.16.custom.css (0ms) (pid 19108)
- Compilation de jquery.ui.1.8.16.ie.css (0ms) (pid 19108)
- Compilation de jquery.js (5ms) (pid 19108)
- Compilation de jquery_ujs.js (0ms) (pid 19108)
- Compilation de custom.css (14ms) (pid 19108)
custom.css
es custom.css.scss
La compilation de CSS et JS purs est rapide (coût presque nul). Mais la compilation de .scss et .coffee prend encore du temps.
Résumez
- remplacer la tâche deploy.rb assets.
-
vérifier les logs/production.log
- trouver des actifs lents
- supprimer @import "compass" ; utiliser une solution alternative.
- utiliser require à la place @import ; ( utiliser @import quand c'est vraiment nécessaire )
- supprimer require_tree, monter les actifs individuellement
- supprimer les .scss et .coffeescript vides
- utiliser .css lorsque les ressources sont purement CSS.
Je viens d'écrire une gemme pour résoudre ce problème dans Rails, appelée pignons de turbine-rails3 . Il accélère votre assets:precompile
en ne recompilant que les fichiers modifiés, et en ne compilant qu'une seule fois pour générer toutes les ressources.
Notez que j'essaie également de faire en sorte que ce patch soit intégré à Rails 4.0.0, et éventuellement à Rails 3.2.9 (cf. https://github.com/rails/sprockets-rails/pull/21 ). Mais pour l'instant, ce serait génial si vous pouviez m'aider à tester l'application pignons de turbine-rails3 gem, et faites-moi savoir si vous avez des problèmes.