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

nyu*_*wec 14 javascript minify sbt playframework uglifyjs

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

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

<script src="@routes.Assets.at("javascripts/app.js")"></script>
Run Code Online (Sandbox Code Playgroud)

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

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

Jac*_*ski 22

反向路由器应该在生产中自动使用缩小资产的问题在Play 2.3.1中得到修复,完全符合您的要求.

根据Play 2.3.1更改日志:

Assets反向路由器的行为已经改变,如果存在缩小版本的资产,它现在返回一个URL.要禁用此行为,设置assets.checkForMinified=trueapplication.conf.

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

接下来在作品生产模式只所以用启动的应用程序activator start不会run或使用生成的启动脚本(后stage).

默认情况下,应在Play with (非)版本中启用在生产中使用缩小版资产的行为.@routes.Assets.versionedroutes.Assets.at

它确实需要适当的路由声明conf/routes:

GET  /assets/*file  controllers.Assets.versioned(path="/public", file: Asset)
Run Code Online (Sandbox Code Playgroud)

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

就在我写了关于我在Play 2.3迁移指南的 "RequireJS"部分中找到的顺序的句子之后:

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

我也在"关闭编译器"部分的Play 2.3迁移指南中找到了:

目前通过RequireJS插件(下面描述)提供UglifyJS 2.未来的目的是为不使用RequireJS的情况提供独立的UglifyJS 2插件.

这一切都始于Play 2.3 sbt-web插件Javascript缩小的答案.

所以,下面pipelineStages是工作的 - 记住顺序和rjs:

pipelineStages := Seq(rjs, uglify, digest, gzip)
Run Code Online (Sandbox Code Playgroud)

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")
Run Code Online (Sandbox Code Playgroud)

不要忘记创建一个空app/assets/javascripts/main.js文件来让它sbt-rjs完成它的工作.

作为测试,我创建了一个Play应用程序,activator new playApp play-scala并在构建中应用了上述更改以及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>
Run Code Online (Sandbox Code Playgroud)

执行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>
Run Code Online (Sandbox Code Playgroud)

注意4302136334616ae0605d47a1932ee262-hello.min.js和消化的非JavaScript资源.

  • 我按照你的描述将uglify,digest,gzip添加到project + pipelineStages.我还在视图中更改了'@ routes.Assets.at' - >'@ routes.Assets.versioned'.使用'activator start'启动我的应用程序会生成缩小的javascripts,但浏览器仍会加载原始的非缩小版本. (2认同)