Comment pouvez-vous accélérer le processus de précompilation Rails Asset Pipeline?

Comment pouvez-vous accélérer le processus de précompilation du pipeline Rails Asset?

1. Accélération du déploiement de Capistrano

(1) Utiliser la tâche intégrée ‘deploy / assets’ de capistrano pour déployer.

Capistrano a sa propre tâche intégrée «déployer / actifs». Il va automatiquement faire la tâche pour vous.

La différence entre votre propre tâche d’artisanat est qu’il ne charge que le groupe d’ assets pour pré-comstackr les ressources, et non l’environnement entier.

cd /home/apps/APP_NAME/releases/20120708184757 && bundle exec rake RAILS_ENV=production RAILS_GROUPS=assets assets:precomstack

(2) ignorer le processus de précompilation lorsque les ressources ne sont pas modifiées.

https://gist.github.com/3072362

Si

  • app / actifs
  • lib / assets
  • vendeur / actif
  • Gemfile.lock
  • confir / routes.rb

sont modifiés, il va recomstackr les actifs. Sinon, il va ignorer le processus de compilation, gagner beaucoup de temps.

2. Utilisez soigneusement @import.

(1) éviter d’utiliser @import "compass"; directement.

Il travaillera tous les deux quand vous

@import "compass"; ou @import "compass/typography/links/link-colors"; en SCSS.

Mais @import "compass/typography/links/link-colors"; est 9 fois plus rapide que @import "compass"; lorsque vous comstackz des actifs.

C’est parce que quand @import "compass"; , il comstack des ressources de compas entières. non seulement les link-colors .

(2) éviter d’utiliser des partiels

Dans SCSS, nous aimons utiliser partial pour organiser nos actifs.

Mais seulement si vous avez besoin de partager des variables, ou s’il existe des dépendances nécessaires, sinon

 //= require "reset" //= require "base" //= require "product" 

est plus rapide que

 @import "reset"; @import "base"; @import "product"; 

3. ne nécessite pas .scss & .coffee pour aucune raison

(1) éviter d’utiliser require_tree

Lorsque nous utilisons le générateur Rails pour générer des contrôleurs. Rails générera également des actifs comme celui-ci

  • product.css.scss
  • produit.js.café

et monter des ressources dans application.js en utilisant ces techniques:

 //= require_tree 

Mais les actifs vides (sortie 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/ 

Il vous en coûtera environ 250 ms pour les comstackr. Si vous avez 10 ressources vides, ce sera 2,5 secondes.

Supprimez-les de votre projet ou montez-les individuellement dans application.js comme ceci:

 //= require prodcuts //= require users //= require albums 

(2) N’utilisez pas css.scss ou js.coffee si nécessaire.

  • Jquery-ui-1.8.16.custom.css compilé (0ms) (pid 19108)
  • Jquery.ui.1.8.16.ie.css compilé (0 ms) (pid 19108)
  • Jquery.js compilé (5ms) (pid 19108)
  • Jquery_ujs.js compilé (0ms) (pid 19108)
  • Custom.css compilé (14ms) (pid 19108)

custom.css est custom.css.scss

Comstackr des fichiers CSS pur et JS pur est rapide (coût presque 0 ms). Mais comstackr .scss et .coffee coûte encore du temps.

Résumer

  1. remplacez la tâche assets.rb.
  2. vérifier les logs / production.log

    • trouver des actifs lents
    • supprimer @import “boussole”; utiliser une solution alternative.
    • use requirejs à la place @import; (utilisez @import quand c’est vraiment nécessaire)
    • supprimer require_tree, monter les ressources individuellement
    • supprimer les .scss et .coffeescript vides
    • utilisez .css lorsque les actifs sont de simples CSS.

Je viens d’écrire un bijou pour résoudre ce problème à l’intérieur de Rails, appelé turbo-sprockets-rails3 . Il accélère vos assets:precomstack en recompilant uniquement les fichiers modifiés, et en compilant une seule fois pour générer tous les actifs.

Notez que j’essaie également de faire fusionner ce correctif dans Rails 4.0.0 et éventuellement Rails 3.2.9 (voir https://github.com/rails/sprockets-rails/pull/21 ). Mais pour l’instant, ce serait génial si vous pouviez m’aider à tester le joyau turbo-sprockets-rails3 , et dites- moi si vous avez des problèmes.

(2) éviter d’utiliser des partiels

En SCSS, nous aimons utiliser partiellement pour organiser nos actifs

Sur les derniers railsconf, on a introduit libsass.

Les choses vont probablement changer et réécrire en C, les partiels scss promettent d’être plus rapides