ガイドのその部分を書きました。
本番環境でライブコンパイルしたくないのは間違いありません。
コンパイルすると、次のようになります。
/ assets内のファイルに対するすべてのリクエストは、Sprocketsに渡されます。すべてのアセットの最初のリクエストで、Railsがキャッシュ(通常はファイルシステム)に使用しているものにコンパイルされ、キャッシュされます。
後続のリクエストでSprocketsはリクエストを受け取り、フィンガープリントされたファイル名を検索する必要があります。アセットを構成するファイル(画像)またはファイル(cssおよびjs)が変更されていないことを確認し、キャッシュされたバージョンがある場合はそれを提供します。
つまり、すべてのフォルダ資産およびプラグインによって使用された特定のベンダー/資産フォルダインチ
正直なところ、コードは速度に合わせて最適化されていないため、これはかなりのオーバーヘッドになります。
これは、アセットがクライアントに送信される速度に影響を与え、サイトのページ読み込み時間に悪影響を及ぼします。
デフォルトと比較してください:
アセットがプリコンパイルされ、コンパイルがオフの場合、アセットはコンパイルされ、にフィンガープリントされますpublic/assets
。Sprocketsはプレーンからフィンガープリントされたファイル名のマッピングテーブルをRailsに返し、Railsはこれをファイルシステムに書き込みます。マニフェストファイル(Rails 3のYMLまたはRails 4のランダムな名前のJSON)は、起動時にRailsによってMemoryにロードされ、アセットヘルパーメソッドで使用するためにキャッシュされます。
これにより、正しいフィンガープリントアセットを含むページの生成が非常に高速になり、ファイル自体の提供は、ファイルシステムからのWebサーバーサーバーの高速になります。どちらも、ライブコンパイルよりも劇的に高速です。
パイプラインとフィンガープリントの利点を最大限に活用するには、Webサーバーに遠い将来のヘッダーを設定し、jsファイルとcssファイルのgzip圧縮を有効にする必要があります。Sprocketsは、サーバーが使用するように設定できるgzip圧縮されたバージョンのアセットを書き込み、リクエストごとにそうする必要をなくします。
これにより、可能な限り迅速かつ最小のサイズでアセットがクライアントに送信され、クライアント側のページの表示が高速化され、リクエストが(将来のヘッダーで)削減されます。
したがって、ライブコンパイルの場合は次のようになります。
- 非常に遅い
- 圧縮不足
- ページのレンダリング時間に影響します
対
- できるだけ早く
- 圧縮
- サーバーから圧縮オーバーヒアを削除します(オプション)。
- ページのレンダリング時間を最小限に抑えます。
編集:(フォローアップコメントへの回答)
パイプラインは最初のリクエストでプリコンパイルするように変更できますが、そうすることにはいくつかの主要な障害があります。1つ目は、フィンガープリントされた名前のルックアップテーブルが必要であるか、ヘルパーメソッドが遅すぎることです。コンパイルオンデマンドのシナリオでは、新しいアセットがコンパイルまたは要求されるたびにルックアップテーブルに追加する方法が必要になります。
また、誰かがすべてのアセットがコンパイルされて配置されるまでの未知の期間、遅いアセットデリバリーの代償を払わなければならないでしょう。
すべてをコンパイルする代金が一度にオフラインで支払われるデフォルトは、一般の訪問者に影響を与えず、すべてが実際に稼働する前に機能します。
契約違反は、本番システムに多くの複雑さを追加するということです。
[編集、2015年6月]デプロイ中の遅いコンパイル時間の解決策を探しているためにこれを読んでいる場合は、アセットをローカルでプリコンパイルすることを検討してください。これに関する情報は、アセットパイプラインガイドにあります。これにより、変更があった場合にのみローカルでプリコンパイルし、それをコミットして、プリコンパイル段階のない高速展開を行うことができます。