如何在Play 2.3.1模板中启用缩小的JavaScript文件?
我能够在我的Play Framework 2.3.1应用程序中加载sbt uglify 1.0.3插件。加载非精简的Java脚本非常简单,但加载精简的版本似乎是不可能的 在我的模板中,我使用类似以下内容的如何在Play 2.3.1模板中启用缩小的JavaScript文件?,javascript,playframework,sbt,minify,uglifyjs,Javascript,Playframework,Sbt,Minify,Uglifyjs,我能够在我的Play Framework 2.3.1应用程序中加载sbt uglify 1.0.3插件。加载非精简的Java脚本非常简单,但加载精简的版本似乎是不可能的 在我的模板中,我使用类似以下内容的标记: <script src="@routes.Assets.at("javascripts/app.js")"></script> 在开发模式下,加载非精简的javascript版本,这很好。在prod模式下(使用activator start),我看到sbt
标记:
<script src="@routes.Assets.at("javascripts/app.js")"></script>
在开发模式下,加载非精简的javascript版本,这很好。在prod模式下(使用activator start
),我看到sbt uglify将缩小版本生成到target/web/uglify/build
文件夹中,但由于我没有更改模板中的上述
标记行,因此会加载javascripts文件的非缩小版本
是否有一种方法可以对这些路线进行仅产品的映射以加载缩小版本?该问题已在第2.3.1版中修复,完全符合您的要求
根据:
如果缩小,资产反向路由器的行为已经改变
存在资产的版本,它现在会返回这些版本的URL。到
禁用此行为,在中设置资产。checkForMinified=true
application.conf
注意,它应该读setassets.checkForMinified=false
,但无论如何
以下内容在生产模式下工作,只有这样才能使用activator start
启动应用程序,而不是run
或使用生成的启动脚本(在stage
之后)
默认情况下,应在Play with@routes.assets.versioned
(而不是routes.assets.at
)版本中启用在生产中使用精简版资产的行为
它确实要求conf/routes
中的适当路由声明为:
GET /assets/*file controllers.Assets.versioned(path="/public", file: Asset)
起初,我发现有点不清楚的是pipelineStages中元素的顺序以及包含在其中的要求
就在我写了关于我在“RequireJS”一节中找到的顺序的句子之后:
阶段的顺序很重要。您首先要优化
文件,生成它们的摘要,然后生成所有文件的gzip版本
结果资产
我还在“闭包编译器”一节中找到:
UglifyJS 2目前通过RequireJS插件提供(如下所述)
下一步)。未来的目的是提供一个独立的UglifyJS 2
插件也适用于不使用RequireJS的情况
这一切都是从答案开始的
因此,下面的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
):
请注意
4302136334616ae0605dd47a1932ee262 hello.min.js
和已消化的非JavaScript资源。我还尝试使用uglify。然而,我不知道如何开始玩。如果你有一个例子,你能分享一下吗?我添加了uglify,digest,gzip到project+pipelineStages中,正如你所描述的。我还更改了视图中的'@routes.Assets.at'->'@routes.Assets.versioned'。使用“activator start”启动我的应用程序会生成缩小的Java脚本,但浏览器仍会加载原始的、非缩小的版本。但是当执行activator start
命令时,我得到以下错误<代码>[info]已完成打包。java.util.regex.PatternSyntaxException:Unmatched closing')靠近索引47['”?([^\s']*)['”]?\s*:\s*[\[\[]?.['”].*/lib\(.*)['”]这一切都有效(非常感谢!),但有一个小问题。Play default提供缩小版(这很好)但是原始源代码也可以在:/assets/javascripts/private javascript file.js.src.js
中公开获取。有没有办法删除这些文件并只保留缩小的和.map
文件?我只是不知道,建议作为后续问题问这个问题。我认为这是一个值得考虑的问题。去吧为了它!
@(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>
➜ 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>