0

Play が GZipped JS と CSS をブラウザに送信するようにします。Build.scala で、追加しました

 val gzipAssets = TaskKey[Seq[File]]("gzip-assets", "GZIP all assets")
 lazy val gzipAssetsSetting = gzipAssets <<= gzipAssetsTask
 lazy val gzipAssetsTask = (gzippableAssets, streams) map {
  case (finder: PathFinder, s: TaskStreams) => {
    finder.get.map { file =>
      val gzTarget = new File(file.getAbsolutePath + ".gz")
      IO.gzip(file, gzTarget)
      s.log.info("Compressed " + file.getAbsolutePath + " " + file.length / 1000 + " k     => " + gzTarget.getName + " " + gzTarget.length / 1000 + " k")
      gzTarget
    }
  }
}

val main = PlayProject(appName, appVersion, appDependencies, mainLang = JAVA).settings(
    // Twitter Bootstrap v2.0.1 compilation (https://plus.google.com/u/0/108788785914419775677/posts/QgyUF9cXPkv)
    lessEntryPoints <<= (sourceDirectory in Compile)(base => ((base / "assets" / "stylesheets" / "twitterbootstrap" / "styles.less"))),

    // set up gzip of assets
    gzippableAssets <<= (resourceManaged in (ThisProject))(dir => ((dir ** "*.js") +++ (dir ** "*.css"))),
    gzipAssetsSetting,
    playPackageEverything <<= playPackageEverything dependsOn gzipAssets


).settings( ...

dist すると、ターゲットにファイルが生成されます。

[情報] 圧縮 /Users/wimha/Documents/**/target/scala-2.9.1/resource_managed/main/public/stylesheets/twitterbootstrap/styles.min.css 183 k => styles.min.css.gz 27 k

しかし、製品では、ファイルは利用できません:

リソースの読み込みに失敗しました: サーバーは 404 (見つかりません) のステータスで応答しまし たhttp://ec2-54-228-70-193.eu-west-1.compute.amazonaws.com/assets/stylesheets/twitterbootstrap/styles .min.css.gz

2 つの質問があります。

  • ファイルが利用できないのはなぜですか?
  • より良い解決策はありますか?多分モジュールで?GreenScript 以外に興味深いものは見つかりませんでしたが、これは Play 1.x のみのものです。アセットも 1 つのファイルにマージしたいと考えています。

ありがとうジュリアン

4

1 に答える 1

1

同じ問題の解決策を探すのに何時間も費やしました。

これを試してください: http://play.lighthouseapp.com/projects/82401/tickets/841-gzip-assets。を.gz実行してplay distも、play stage.

Play は、対応する .gz ファイルが存在する場合に gzip 圧縮されたアセットを提供するのに十分スマートであることを考えると、'stage' または 'dist' を実行するときに gzip アセットを使用することは理にかなっています。一部のリバース プロキシはリソースを gzip できますが、これは (リクエストごとに行うと) 効率が低下するか、より複雑になります (リソースがキャッシュされ、最終的に古くなる可能性がある場合)。

Build.scala を使用した中途半端なソリューションを次に示します。

val gzippableAssets = SettingKey[PathFinder]("gzippable-assets", "Defines the files to gzip")
val gzipAssets = TaskKey[Seq[File]]("gzip-assets", "gzip all assets")
lazy val gzipAssetsSetting = gzipAssets <<= gzipAssetsTask dependsOn (copyResources in Compile)
lazy val gzipAssetsTask = (gzippableAssets, streams) map {
  case (finder: PathFinder, s: TaskStreams) => {
    var count = 0
    var files = finder.get.map { file =>
      val gzTarget = new File(file.getAbsolutePath + ".gz")
      IO.gzip(file, gzTarget)
      count += 1;
      gzTarget
    }
    s.log.info("Compressed " + count + " asset(s)")
    files
  }
}

val main = PlayProject(appName, appVersion, appDependencies, mainLang = JAVA).settings(
    ...
    gzippableAssets <<= (classDirectory in Compile)(dir => (dir ** ("*.js" || "*.css" || "*.html"))),
    gzipAssetsSetting,
    playPackageEverything <<= playPackageEverything dependsOn gzipAssets
)
于 2013-08-08T15:50:04.980 に答える