2014-07-04 12 views
14

Sono stato in grado di caricare il plugin sbt-uglify 1.0.3 nella mia app Play Framework 2.3.1. Il caricamento dei javascript non miniati è piuttosto semplice, ma il caricamento delle versioni miniate sembra impossibile.Come abilitare i file JavaScript minificati nei modelli di gioco 2.3.1?

Nel mio modello Io uso <script> tag simili a questo:

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

In modalità dev, il non-minified javascript versione viene caricata, che va bene. Nella modalità prod (usando activator start) vedo sbt-uglify che genera le versioni minificate nella cartella target/web/uglify/build, ma poiché non ho modificato la riga di tag <script> sopra nei miei modelli, vengono caricate le versioni non minified dei file javascripts.

Esiste un modo per eseguire una mappatura di soli prodotti di tali percorsi per caricare le versioni minificate?

risposta

20

Il problema Reverse Router should use minified assets in production automatically è stato corretto in Play 2.3.1 che corrisponde esattamente alle vostre esigenze.

Secondo Play 2.3.1 Changelog:

Il comportamento dei Beni router inverso è cambiato, se minified versioni di beni esistere, ora ritorna un URL per chi invece. Per disabilitare questo comportamento, impostare assets.checkForMinified=true in application.conf.

NOTA Dovrebbe piuttosto leggere impostato assets.checkForMinified=false, ma comunque ...

Quello che segue opere in modalità di produzione solo in modo da iniziare l'applicazione con activator start non run o utilizzare le avviare script generati (dopo stage).

Il comportamento di utilizzare versioni minified di attività in produzione deve essere attivata di default nella versione di gioco con @routes.Assets.versioned (non routes.Assets.at).

Si richiede che la dichiarazione via appropriata in conf/routes è:

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

Quello che ho trovato un po 'poco chiaro in un primo momento era l'ordine di elementi in pipelineStages, nonché l'obbligo di includere sbt-rjs in esso .

E solo dopo che avevo scritto la frase circa l'ordine che ho trovato nella sezione "RequireJS" in Play 2.3 Migration Guide:

L'ordine degli stadi è significativo. Innanzitutto, si desidera ottimizzare i file , produrre loro digesti e quindi produrre versioni gzip di tutte le risorse risultanti .

ho trovato anche in Play 2.3 Migration Guide nella sezione "Closure Compiler":

UglifyJS 2 è attualmente fornito tramite il plugin RequireJS (descritto successivo). L'intento futuro è quello di fornire un plug-in UglifyJS 2 autonomo anche in situazioni in cui RequireJS non viene utilizzato.

Tutto è iniziato con la risposta a Play 2.3 sbt-web plugin Javascript minification.

Così, il sotto pipelineStages è quello lavorativo - mente l'ordine e rjs:

pipelineStages := Seq(rjs, uglify, digest, gzip) 

project/plugins.sbt utilizzata è stata la seguente:

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") 

Non dimenticare di creare un file vuoto app/assets/javascripts/main.js lasciare fare allo sbt-rjs il suo lavoro.

Come prova, ho creato un'applicazione Gioca con activator new playApp play-scala e applicate le modifiche di cui sopra nella costruzione così come in app/views/main.scala.html che alla fine sembrava come segue (nota @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> 

Esecuzione activator start e chiamando curl http://localhost:9000 dà (miniera di formattazione del per il bene di leggibilità):

➜ 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> 

Nota 4302136334616ae0605d47a1932ee262-hello.min.js e le risorse non JavaScript digerite .

+0

Sto anche cercando di usare uglify. Tuttavia, non so come iniziare con Play. Se hai un esempio, puoi condividere per favore? – JMC

+2

Ho aggiunto uglify, digest, gzip per project + pipelineStages come hai descritto. Ho anche modificato le viste "@ routes.Assets.at" -> "@ routes.Assets.versioned". L'avvio della mia app utilizzando 'activator start' produce i javascript miniati, ma il browser carica ancora le versioni originali non minimate. – nyuwec

+0

Salve @Jacek seguo tutti i passi su di lei che hai menzionato. Ma quando eseguo il comando 'activator start' sto ricevendo un errore successivo. '[info] Fine confezione. java.util.regex.PatternSyntaxException: chiusura incompleta ')' vicino all'indice 47 ['"]? ([^ \ S'"] *) ['"]? \ S *: \ s * [\ []? . * ['"]. */lib \ (. *) ['"] ' –