在Play 2.3.1中修复了Reverse Router should use minified assets in production automatically的问题,这正好符合您的要求。
根据Play 2.3.1更新日志:
Assets反向路由的行为已经改变,如果存在文件的minified版本,它现在会返回一个URL。要禁用此行为,请在application.conf
中设置assets.checkForMinified=true
。
注意,应该是set assets.checkForMinified=false
,但无论如何...
以下内容仅在生产模式下工作,请使用activator start
而不是run
启动应用程序,或者使用生成的启动脚本(在stage
之后)。
在具有@routes.Assets.versioned
(而不是routes.Assets.at
)的Play版本中,默认情况下应启用使用minified版本的资源文件的行为。
要求在conf/routes
中正确声明路由:
GET /assets/*file controllers.Assets.versioned(path="/public", file: Asset)
起初我有些不明确的是
pipelineStages
中元素的
顺序以及包括
sbt-rjs的要求。
之后我在
Play 2.3 迁移指南中的“RequireJS”部分中找到了关于顺序的说明:
“阶段的顺序很重要。您首先需要优化文件,生成它们的摘要,然后生成所有结果资产的gzip版本。”
我还在
Play 2.3 迁移指南的“Closure Compiler”部分中发现了以下内容:
“UglifyJS 2目前通过RequireJS插件(下面描述)提供。未来的意图是为那些不使用RequireJS的情况也提供独立的UglifyJS 2插件。”
这一切始于对
Play 2.3 sbt-web plugin Javascript minification的回答。
因此,下面的
pipelineStages
是有效的-注意顺序和
rjs
:
pipelineStages := Seq(rjs, uglify, digest, gzip)
project/plugins.sbt
文件的使用如下:
resolvers += "Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/"
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.3.5")
addSbtPlugin("com.typesafe.sbt" % "sbt-digest" % "1.0.0")
addSbtPlugin("com.typesafe.sbt" % "sbt-uglify" % "1.0.3")
addSbtPlugin("com.typesafe.sbt" % "sbt-gzip" % "1.0.0")
addSbtPlugin("com.typesafe.sbt" % "sbt-rjs" % "1.0.6")
不要忘记创建一个空的app/assets/javascripts/main.js
文件,让sbt-rjs
发挥作用。
作为测试,我使用activator new playApp play-scala
创建了一个Play应用程序,并在构建和app/views/main.scala.html
中应用了上述更改,最终如下所示(请注意@routes.Assets.versioned
):
@(title: String)(content: Html)
<!DOCTYPE html>
<html>
<head>
<title>@title</title>
<link rel="stylesheet" media="screen" href="@routes.Assets.versioned("stylesheets/main.css")">
<link rel="shortcut icon" type="image/png" href="@routes.Assets.versioned("images/favicon.png")">
<script src="@routes.Assets.versioned("javascripts/hello.js")" type="text/javascript"></script>
</head>
<body>
@content
</body>
</html>
执行activator start
并调用curl http://localhost:9000
会得到以下结果(为了易读性,格式由我稍作修改):
➜ play-uglify curl http://localhost:9000
<!DOCTYPE html>
<html>
<head>
<title>Welcome to Play</title>
<link rel="stylesheet" media="screen" href="/assets/stylesheets/d41d8cd98f00b204e9800998ecf8427e-main.css">
<link rel="shortcut icon" type="image/png" href="/assets/images/84a01dc6c53f0d2a58a2f7ff9e17a294-favicon.png">
<script src="/assets/javascripts/4302136334616ae0605d47a1932ee262-hello.min.js" type="text/javascript"></script>
</head>
<body>
<h1>Your new application is ready.</h1>
</body>
</html>
请注意4302136334616ae0605d47a1932ee262-hello.min.js
和非JavaScript资源的摘要。
activator start
命令时,我遇到了以下错误。[info] Done packaging. java.util.regex.PatternSyntaxException: Unmatched closing ')' near index 47 ['"]?([^\s'"]*)['"]?\s*:\s*[\[]?.*['"].*/lib\(.*)['"]
- Harmeet Singh Taara/assets/javascripts/private-javascript-file.js.src.js
。有没有办法删除这些文件,只保留缩小和.map
文件? - icl7126build.sbt
中禁用源映射生成,使用RjsKeys.generateSourceMaps := false
成功地从最终构建中删除了原始未压缩的.js
源文件。 - icl7126