Как включить минимизированные файлы 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>

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

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


person nyuwec    schedule 04.07.2014    source источник


Ответы (1)


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

Согласно журналу изменений Play 2.3.1:

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

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

Дальнейшее работает только в рабочем режиме, поэтому запустите приложение с activator start, а не run, или используйте сгенерированные сценарии запуска (после stage).

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

UglifyJS 2 в настоящее время предоставляется через подключаемый модуль RequireJS (описан ниже). В будущем планируется предоставить отдельный плагин UglifyJS 2 также для ситуаций, когда RequireJS не используется.

Все началось с ответа на минификацию Javascript плагина sbt-web для Play 2.3.

Итак, приведенный ниже 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.

person Jacek Laskowski    schedule 08.07.2014
comment
Я также пытаюсь использовать uglify. Однако я не знаю, как начать с Play. Если у вас есть пример, не могли бы вы поделиться? - person JMC; 17.07.2014
comment
Я добавил uglify, дайджест, gzip в проект + pipeStages, как вы описали. Я также изменил '@routes.Assets.at' на '@routes.Assets.versioned' в представлениях. Запуск моего приложения с помощью «запуска активатора» создает минимизированные javascripts, но браузер по-прежнему загружает исходные, не минимизированные версии. - person nyuwec; 22.07.2014
comment
Привет @Jacek, я следую всем вышеперечисленным шагам, которые вы упомянули. Но при выполнении команды activator start я получаю следующую ошибку. [info] Done packaging. java.util.regex.PatternSyntaxException: Unmatched closing ')' near index 47 ['"]?([^\s'"]*)['"]?\s*:\s*[\[]?.*['"].*/lib\(.*)['"] - person Harmeet Singh Taara; 26.04.2016
comment
Все работает (большое спасибо!), но есть небольшая проблема. Play по умолчанию использует уменьшенную версию (что хорошо), но исходный код также общедоступен в: /assets/javascripts/private-javascript-file.js.src.js. Есть ли способ удалить эти файлы и оставить только мини-файлы и файлы .map? - person icl7126; 19.02.2017
comment
Я просто не знаю и рекомендовал бы задать этот вопрос в качестве продолжения этого. Я думаю, что стоит задать вопрос о SO. Действуй! - person Jacek Laskowski; 19.02.2017
comment
Так что мне удалось удалить оригинальные неминифицированные .js исходные файлы из окончательной сборки, отключив генерацию исходных карт с использованием RjsKeys.generateSourceMaps := false в build.sbt. - person icl7126; 14.03.2017