如何在Play 2.3.1模板中启用缩小的JavaScript文件?

时间:2014-07-04 23:19:26

标签: javascript playframework sbt minify uglifyjs

我能够在我的Play Framework 2.3.1应用程序中加载sbt-uglify 1.0.3插件。加载非缩小的javascripts非常简单,但加载缩小版本似乎是不可能的。

在我的模板中,我使用与此类似的<script>标记:

<script src="@routes.Assets.at("javascripts/app.js")"></script>

在开发模式下,加载了非缩小的javascript版本,这很好。在prod模式下(使用activator start),我看到sbt-uglify为target/web/uglify/build文件夹生成缩小版本,但由于我没有更改模板中的上述<script>标记行,加载了非缩小版本的javascripts文件。

有没有办法对这些路线进行仅prod映射以加载缩小版本?

1 个答案:

答案 0 :(得分:22)

问题Reverse Router should use minified assets in production automatically已在Play 2.3.1中修复,完全符合您的要求。

根据Play 2.3.1 Changelog

  

如果缩小,则Assets反向路由器的行为已更改   存在资产的版本,它现在返回一个URL。至   禁用此行为,设置assets.checkForMinified=true   application.conf

注意它应该读取 set assets.checkForMinified=false ,但无论如何......

以下内容仅适用于生产模式,因此请使用activator start而非run启动应用程序,或使用生成的启动脚本(stage之后)。

默认情况下,应在@routes.Assets.versioned(不是routes.Assets.at)的播放版本中启用在制作中使用缩小版资产的行为。

确实要求conf/routes中的适当路线声明为:

GET  /assets/*file  controllers.Assets.versioned(path="/public", file: Asset)

我最初发现有点不清楚的是pipelineStages中元素的顺序以及在其中包含sbt-rjs的要求。

在我写完关于Play 2.3 Migration Guide中“RequireJS”部分中找到的顺序的句子之后:

  

阶段的顺序很重要。你首先要优化   文件,生成它们的摘要,然后生成所有的gzip版本   结果资产。

我也在“封闭编译器”一节的Play 2.3 Migration Guide中找到了:

  

UglifyJS 2目前通过RequireJS插件提供(描述   下一个)。未来的目的是提供一个独立的UglifyJS 2   插件也适用于未使用RequireJS的情况。

这一切都始于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):< / p>

@(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资源。