Play2でWebJarsのURLをCDNに変更する

昨日の続きですが、webjars-playを使ってWebJarsを使っている場合にどうやってCDNに切り替えるのがいいのかなぁと思って調べていたらJames Wardさんのブログで以下の記事を見つけました。

WebJars Now on the jsDelivr CDN | James Ward

まずはこんなコントローラを用意しておきます。

package controllers

import play.api.mvc.Controller
import play.api.Play
import play.api.Play.current

object StaticWebJarAssets extends Controller {

  def at(file: String) = Assets.at("/META-INF/resources/webjars", file)

  def getUrl(file: String) = {
    val maybeContentUrl = Play.configuration.getString("contentUrl")

    maybeContentUrl.map { contentUrl =>
      contentUrl + controllers.routes.StaticWebJarAssets.at(file).url
    } getOrElse controllers.routes.StaticWebJarAssets.at(file).url
  }

}

conf/routesのWebJarsのルーティングをこのコントローラを使うように修正します。

GET        /webjars/*file                    controllers.StaticWebJarAssets.at(file)

続いてconf/application.confに以下の設定を追加します。

contentUrl="//cdn.jsdelivr.net"

あとはテンプレートで読み込むCSSファイルやJavaScriptファイルのパスを指定する際に以下のようにすればOKです。

<script type='text/javascript' src='@StaticWebJarAssets.getUrl(WebJarAssets.locate("jquery.min.js"))'>

WebJars標準でCDNに切り替えてくれる機能をサポートしてくれてもいい気がしますねー。