Как включить мини файлы JavaScript в шаблонах Play 2.3.1?

Мне удалось загрузить плагин sbt-uglify 1.0.3 в приложении Play Framework 2.3.1. Загрузка неминифицированных javascripts довольно проста, но загрузка мини-версий кажется невозможной.

В моем шаблоне я использую теги <script>, похожие на это:

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

В режиме dev загружена версия без мини-javascript, и это нормально. В режиме prod (используя activator start) я вижу, что sbt-uglify генерирует миниатюрные версии в папку target/web/uglify/build, но поскольку я не изменял указанную выше строку тега <script> в моих шаблонах, непределенные версии Файлы javascripts загружаются.

Есть ли способ сделать только такое преобразование таких маршрутов для загрузки мини-версий?

Ответы

Ответ 1

Проблема Reverse Router должна автоматически использовать мини-активы в производстве, была зафиксирована в Play 2.3.1, которая точно соответствует вашему требованию.

Согласно Play 2.3.1 Changelog:

Поведение реверсивного маршрутизатора активов изменилось, если оно было изменено версии активов существуют, теперь он возвращает URL-адрес для них. к отключите это поведение, установите assets.checkForMinified=true в application.conf.

ПРИМЕЧАНИЕ. Следует скорее прочитать set assets.checkForMinified=false, но в любом случае...

Что следует за работой в режиме производства, так что запустите приложение с помощью activator start not run или используйте сгенерированные стартовые скрипты (после stage).

Поведение использования сокращенных версий активов в production должно быть включено по умолчанию в версии Play с помощью @routes.Assets.versioned (not 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 в разделе "Closure Compiler":

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 выполнил свою работу.

В качестве теста я создал приложение 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>

Выполнение 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.