§公開アセットを扱う
この節は JavaScript, CSS と画像などのアプリケーションの静的リソースの提供をカバーします。
Play 2.0 での public リソースを提供することは、他の HTTP リクエストにサービスを提供することとほぼ同じです。通常のリソースと同じルーティングを使用します: クライアントに CSS, JavaScript や画像ファイルを配布するためのコントローラ/アクションのパスを使用します。
§public/ フォルダ
規約により public の資産は、アプリケーションの public
フォルダに格納されています。このフォルダは次のように構成されています:
public
└ javascripts
└ stylesheets
└ images
このフォルダ構成に従っていれば、開始するのは簡単ですが、動作の仕組みを理解していれば、変更してもかまいません。
§どのように public アセットは公開されますか?
ビルドプロセス中に、public
フォルダの内容が処理され、アプリケーションのクラスパスに追加します。アプリケーションをパッケージ化するときに、(public/
パス下にある) これらのファイルはアプリケーションのJARファイルにパッケージ化されます。
§アセットコントローラ
Play 2.0 には、公開アセットを提供する組み込みのコントローラが付属しています。デフォルトでは、このコントローラは、キャッシュ機能、ETag、gzip圧縮、JavaScript minify のサポートが提供されます。
コントローラは controllers.Assets
などのデフォルトの Play JAR で利用可能であり、2 つのパラメータを持つ at
アクションで定義します。
Assets.at(folder: String, file: String)
folder
のパラメータは固定されており、アクションによって管理されるディレクトリを定義する必要があります。 file
パラメータは、通常、動的にリクエストパスから抽出されます。
conf/routes
での Assets
コントローラの典型的な設定を以下でお見せします:
GET /assets/*file Assets.at("public", file)
正規表現 .*
にマッチする動的な部分 *file
を定義したことに注意してください。このため、例えば次のようなリクエストをサーバに送信した場合:
GET /assets/javascripts/jquery.js
ルータは次のパラメータを使用して Assets.at
アクションを起動します:
controllers.Assets.at("public", "javascripts/jquery.js")
このアクションは、ファイルを探し、存在する場合は提供します。
“public” の外部にリソース設定を定義したい場合、そのことを sbt に教えなければならないことに注意してください。例えば以下のように定義したい場合:
GET /assets/*file Assets.at("public", file)
GET /liabilities/*file Assets.at("foo", file)
Build.scalaに以下を追加してください。
playAssetsDirectories <+= baseDirectory / "foo"
§公開リソースのリバースルーティング
routes ファイルにマッピングされた任意のコントローラと同様に、リバースコントローラが controllers.routes.Assets
に作成されます。公開リソースを取得するために必要な URL をリバースする際に使用します。テンプレートでの例は以下のようになります:
<script src="@routes.Assets.at("javascripts/jquery.js")"></script>
以下の結果を生成します。
<script src="/assets/javascripts/jquery.js"></script>
リバースルートするときに、 folder
パラメータを指定しないことに注意してください。これはルートファイルが folder
のパラメータが固定されている Assets.at
アクションに対して1つのマッピングを定義しているためです。そのため、明示的に指定する必要はありません。
しかしながら、 Assets.at
アクションに2つのマッピングを定義している場合、このようにしてください:
GET /javascripts/*file Assets.at("public/javascripts", file)
GET /images/*file Assets.at("public/images", file)
リバースルータを使用する場合は、両方のパラメータを指定する必要があります。
<script src="@routes.Assets.at("public/javascripts", "jquery.js")"></script>
<image src="@routes.Assets.at("public/images", "logo.png")">
§Etag サポート
Assets
コントローラーは自動的に ETag の HTTP ヘッダーを管理します。ETag の値は、リソース名とファイルの最終更新日時から生成されます。(リソースファイルがファイル内に埋め込まれているならば、JAR ファイルの最終更新日が使われます。)
Web ブラウザがこの **ETag** を指定してリクエストを行うと、サーバは 304 NotModified で応答することができます。
§Gzip サポート
同じ名前を持つリソースで .gz
という拡張子を使っているものが見つかった場合、 Assets
のコントローラは、適切な HTTP ヘッダを追加することによって提供します。
Content-Encoding: gzip
§Cache-Control
命令の追加
通常、ETag を使用すると、適切なキャッシュを持つことができます。特定のリソース用のカスタム Cache-Control
ヘッダを指定したい場合は、あなたの application.conf
ファイルに指定することができます。例えば:
# Assets configuration
# ~~~~~
"assets.cache./public/stylesheets/bootstrap.min.css"="max-age=3600"
§管理アセット
play は、デフォルトでは app/assets
フォルダに保存された全てのアセットをコンパイルします。このコンパイルプロセスは、すべての管理アセットを、その変更に関わらず、クリーンして再コンパイルします。フロントエンド技術に掛かる依存性の追跡はとても厄介なので、これがもっとも安全な戦略です。
大量の管理アセットを扱う場合、この戦略は非常に遅くなり得ることに注意してください。この理由から、変更されたファイル、および依存すると想定されるファイルのみを再コンパイルする方法があります。以下を設定に追加することで、この実験的な機能を有効にすることができます:
incrementalAssetsCompilation := true
続く数ページで管理アセットについて更に学びます。