65

Rails Asset Pipelineのプリコンパイルプロセスを高速化する方法は何ですか?

4

3 に答える 3

81

1.Capistrano展開の高速化

(1)capistrano組み込みタスク「deploy/assets」を使用してデプロイします。

Capistranoには、独自の組み込みタスク「deploy/assets」があります。それはあなたのために自動的にタスクを実行します。

独自のハンドクラフトタスクの違いは、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

もしも

  • アプリ/アセット
  • lib /assets
  • ベンダー/資産
  • Gemfile.lock
  • confir / routers.rb

変更されると、アセットが再コンパイルされます。それ以外の場合は、pecompileプロセスをスキップし、多くの時間を節約します。

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.理由もなく.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/

それぞれをコンパイルするのに約250msかかります。空のアセットが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.csscustom.css.scss

純粋なCSSと純粋なJSのコンパイルは高速です(コストはほぼ0ミリ秒)。ただし、.scssと.coffeeのコンパイルにはまだ時間がかかります。

要約する

  1. deploy.rbアセットタスクを置き換えます。
  2. logs/production.logを確認してください

    • 遅い資産を見つける
    • @import"compass"を削除します。代替ソリューションを使用してください。
    • 代わりにrequire@importを使用してください。(本当に必要な場合は@importを使用してください)
    • require_treeを削除し、アセットを個別にマウントします
    • 空の.scssと.coffeescriptを削除します
    • アセットが純粋なCSSの場合は、.cssを使用します。
于 2012-07-09T07:08:38.273 に答える
20

Rails内でこの問題を解決するために、turbo-sprockets-rails3と呼ばれるgemを作成しました。assets:precompile変更されたファイルを再コンパイルするだけで、すべてのアセットを生成するために1回だけコンパイルすることで、速度が向上します。

このパッチをRails4.0.0、場合によってはRails 3.2.9にマージしようとしていることに注意してください(https://github.com/rails/sprockets-rails/pull/21を参照)。しかし、今のところ、turbo-sprockets-rails3 gemのテストを手伝ってくれて、問題があれば教えていただければ素晴らしいと思います。

于 2012-10-03T00:20:40.720 に答える
2

(2)パーシャルの使用を避ける

SCSSでは、アセットを整理するためにパーシャルを使用するのが好きです

最新のrailsconfには、libsassが導入されました。

おそらく物事はCで変更されて書き直されるでしょう、scssパーシャルはより速くなることを約束します

于 2012-07-13T18:29:38.110 に答える