私は自分のサイトで 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のサイトをご覧ください。