2014-07-04 38 views
14

我能夠在我的Play Framework 2.3.1應用程序中加載sbt-uglify 1.0.3插件。加載非縮小的javascript非常簡單,但加載縮小版本似乎是不可能的。如何在Play 2.3.1模板中啓用縮小的JavaScript文件?

在我的模板我用類似這樣<script>標籤:

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

在開發者模式,非精縮JavaScript版本被加載,這是罰款。在產品模式下(使用activator start),我看到sbt-uglify將縮小版本生成到target/web/uglify/build文件夾,但由於我沒有更改我的模板中的上述<script>標記行,因此未加縮小版本的javascripts文件被加載。

有沒有一種方法來執行此類路線的prod-only映射來加載縮小版本?

回答

20

在Play 2.3.1中修復了問題Reverse Router should use minified assets in production automatically,該問題完全符合您的要求。

根據Play 2.3.1 Changelog

資產的行爲反向路由器發生了變化,如果精縮 版本資產的存在,現在返回那些代替URL。若要 禁用此行爲,請在 application.conf中設置assets.checkForMinified=true

注應該更喜歡閱讀設置assets.checkForMinified=false,但無論如何...

接下來的作品中生產模式只有這麼開始activator startrun應用程序或使用生成的啓動腳本(後stage)。

使用資產的精縮版在生產的行爲應該是默認在遊戲的版本@routes.Assets.versioned(不routes.Assets.at)啓用。

它要求在conf/routes合適的路線聲明:

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

我發現有點不清楚,當初是pipelineStages元素的順序以及要求包括sbt-rjs在它。我寫關於我的部分「RequireJS」在Play 2.3 Migration Guide發現的順序一句

而且剛過:

階段的次序是顯著。您首先要優化 文件,生成它們的摘要,然後生成所有 合成資產的gzip版本。

我在Play 2.3 Migration Guide在部分 「關閉編譯器」 還發現:

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-scalaapp/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資源。

+0

我也試圖使用uglify。但是,我不知道如何從Play開始。如果你有一個例子,你能分享一下嗎? – JMC

+2

我像你所描述的那樣添加了uglify,digest,gzip到project + pipelineStages。我還在視圖中更改了'@ routes.Assets.at' - >'@ routes.Assets.versioned'。使用'activator start'啓動我的應用程序會產生縮小的javascript,但瀏覽器仍會加載原始的未縮小版本。 – nyuwec

+0

嗨@賈塞克我遵循你提到的所有步驟。但是,當執行'activator start'命令時,我正在跟蹤錯誤。 '[info]完成包裝。 java.util.regex.PatternSyntaxException:不匹配的close')'索引47 ['「]?([^'s'」] *)['「]?\ s *:\ s * [\ []? 。* ['「]。*/lib \(。*)['']' –

相關問題