4

私は自分のサイトで Play Framework 2.1.3 を使用しています。組み込みの Web サーバー (Netty) が Gzip されたアセットを提供していないことに気付きました。パブリック フォルダーには .gz プレフィックスが存在します。

アセットを手動で Gzip 圧縮しようとしましたが (例: bootstrap.min.js -> bootstrap.min.js.gz)、フレームワークは Assets コントローラーを介してファイルの .gz バージョンを提供しません。また、Build.scala で次の (ハックっぽい) コードを使用して自動 Gzip を実装しようとしましたが、まだまったく機能していないようです (また、ログがアセットは実際には Gzip で圧縮されていたと述べています):

     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 = play.Project(appName, appVersion, appDependencies).settings(
    // Add your own project settings here
    resolvers += Resolver.url("sitemapper repository", url("http://blabluble.github.com/modules/releases/"))(Resolver.ivyStylePatterns),
    gzippableAssets <<= (classDirectory in Compile)(dir => (dir ** ("*.js" || "*.css" || "*.html" || "*.jpg" || "*.png" || "*.jpeg" || "*.gif" || "*.eot" || "*.svg" || "*.ttf" || "*.woff"))),
    gzipAssetsSetting,
    playPackageEverything <<= playPackageEverything dependsOn gzipAssets

  )

なぜ Play は他のすべての主要な Web フレームワークのようにネイティブに GZIP サポートを含めることができないのですか? 現時点では、フロントエンド Web サーバーを使用してそれを行うことはできません。これを行うための提案や簡単な方法は大歓迎です。Play のドキュメントは、このようなことについてはかなりまばらです。

GZip アセットが提供されていないことを確認したい場合は、 http://Netizen.usのサイトをご覧ください。

4

1 に答える 1

4

prod モードではなく dev モードで gzip 配信をテストしたのではないかと思います。開発モードでは、多くの最適化がオフになっています。

Play 2.2 では gzip のサポートが改善されます: https://github.com/playframework/playframework/pull/1515


テスト プロジェクト ( https://github.com/schleichardt/stackoverflow-answers/tree/so18604777 ) を作成しましたが、本番モードで再現できません

sbt dist && cd dist && unzip so18604777-1.0-SNAPSHOT.zip && cd so18604777-1.0-SNAPSHOT && bash start 

main.css の main.css.gz を手動で作成し、Chromium 28 で次の応答ヘッダーを取得しました。

HTTP/1.1 200 OK
Vary: Accept-Encoding
Last-Modified: Wed, 04 Sep 2013 06:13:32 GMT
Etag: "67253bcb7bacb5bbfe3d445f35ae177b60429d5e"
Content-Encoding: gzip
Content-Length: 49
Cache-Control: max-age=3600
Content-Type: text/css; charset=utf-8
Date: Wed, 04 Sep 2013 06:18:00 GMT

49 バイトは gzip されたファイルのサイズ (元のファイル: 20 バイト) とまったく同じであり、表示されたコンテンツは正しいものでした。

gzip で圧縮された同等のファイルがない、別の同じ内容のファイルの場合:

HTTP/1.1 200 OK
Last-Modified: Wed, 04 Sep 2013 06:13:32 GMT
Etag: "48ccae14d846b77d1a33a1db18f52e0841f0a830"
Content-Length: 20
Cache-Control: max-age=3600
Content-Type: text/css; charset=utf-8
Date: Wed, 04 Sep 2013 06:18:25 GMT
于 2013-09-04T06:31:09.283 に答える