web-dev-qa-db-fra.com

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

De quelles manières pouvez-vous accélérer le processus de précompilation Rails Asset Pipeline?

62
xdite

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

(1) utiliser la tâche intégrée capistrano 'deploy/assets' pour déployer.

Capistrano a sa propre tâche intégrée "déploiement/actifs". Il fera automatiquement le travail pour vous.

La différence entre votre propre tâche artisanale est qu'elle charge uniquement le groupe 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) ignorer le processus de précompilation lorsque les actifs ne sont pas modifiés.

https://Gist.github.com/3072362

Si

  • application/actifs
  • lib/assets
  • fournisseur/actifs
  • Gemfile.lock
  • confir/routes.rb

sont modifiés, il recompilera les actifs. Sinon, cela sautera le processus de compilation, économisera beaucoup de temps.

2. Utilisez @import avec précaution.

(1) évitez d'utiliser @import "compass"; directement.

Cela fonctionnera à la fois lorsque vous

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

Mais @import "compass/typography/links/link-colors"; est 9 fois plus rapide que @import "compass"; lorsque vous compilez des éléments.

En effet, lorsque @import "compass";, il compile l'ensemble des ressources de la boussole. pas seulement link-colors partie.

(2) éviter d'utiliser des partiels

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

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 nécessitent pas .scss & .coffee sans raison

(1) éviter d'utiliser require_tree

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

  • product.css.scss
  • product.js.coffee

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

//= require_tree

Mais les actifs vides (rien de sortie) 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 compiler chacun d'eux. Si vous avez 10 actifs 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 inutile.

  • Compilé jquery-ui-1.8.16.custom.css (0ms) (pid 19108)
  • Compilé jquery.ui.1.8.16.ie.css (0ms) (pid 19108)
  • Compilé jquery.js (5ms) (pid 19108)
  • Compilé jquery_ujs.js (0ms) (pid 19108)
  • Compilé custom.css (14ms) (pid 19108)

custom.css est custom.css.scss

Compiler du CSS pur et du JS pur est rapide (coûte près de 0 ms). Mais compiler .scss et .coffee coûte encore un certain temps.

Résumer

  1. remplacer la tâche des actifs deploy.rb.
  2. vérifier les journaux/production.log

    • trouver des ressources lentes
    • supprimer @import "boussole"; utiliser une solution alternative.
    • utilisez require à la place @import; (utilisez @import quand c'est vraiment nécessaire)
    • supprimer require_tree, monter les actifs individuellement
    • supprimer les .scss et .coffeescript vides
    • utilisez .css lorsque les actifs sont du pur CSS.
79
xdite

Je viens d'écrire un joyau pour résoudre ce problème dans Rails, appelé turbo-sprockets-Rails . 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 tous les actifs.

Notez que j'essaie également de 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 turbo-sprockets-Rails gem, et faites-moi savoir si vous avez des problèmes.

20
ndbroadbent

(2) éviter d'utiliser des partiels

Dans SCSS, nous aimons utiliser partiel pour organiser nos actifs

Le dernier railsconf a été introduit libsass.

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

2
Vlad Bokov