Играть! Рамки: Лучшая практика для использования URL в отдельных файлах JavaScript?
-
25-09-2019 - |
Вопрос
Я в настоящее время реорганизую игру! Проект, где в файлах шаблонов HTML есть много кода JS. Этот код должен быть перемещен на внешние файлы JS для лучшей читаемости и более быстрое время загрузки страницы. Однако, когда я просто создаю файл JS в общедоступной папке, все замены ссылки @ {Controller.method} больше не работают. Я думал о вызове некоторой функции инициализации из шаблонов HTML, которые просто поставляют необходимые URL, такие как
initialize({ "Application.doThis" : "@{Application.doThis}"})
Однако это становится очень громоздким и подверженным ошибкам с любым добавленным URL-адресом. Другое дело, что I18N также больше не работает. Итак, какова лучшая практика для таких сценариев, как они, где у вас есть код JS в отдельном файле, но все же хочу использовать создание URL и I18N в ваших js?
Решение
В основном шаблоне генерируйте «маршрутизатор JavaScript», что-то вроде:
<script>
var routes = {
doThis: #{jsAction @Application.doThis(user, ':param1', ':param2') /},
doThat: #{jsAction @doThat() /}
}
</script>
А затем в любом «статическом» файле JavaScript используйте этот маршрутизатор:
$.get(routes.doThis({param1: x, param2: 'yop'}))
Другие советы
Хитрость состоит в том, чтобы получить рамки для анализа вашего JavaScript или ваших CSS или что-либо еще в статических каталогах. Вот простое решение.
Добавить controllers.StaticParser
Контроллер:
package controllers;
import play.mvc.Controller;
public class StaticParser extends Controller {
public static void parse(String route) {
render("/" + route);
}
}
На ваш conf/routes
Файл Добавить:
GET /parse/{<.*>route} StaticParser.parse
Regexp в этом маршруте очень важно, в противном случае вы не можете добавить путь к запросу. Чтобы запросить анализируемый статический ресурс, такой как скрипт JS, использование:
<script src="/parse/public/javascripts/test.js"
language="javascript" type="text/javascript" ></script>
К сожалению, вы не можете использовать #{script 'test.js' /}
Формат, потому что тег скрипта ищет статический файл. Чтобы исправить, что Irksome-Ness, вот бесстыдный взлом тега скрипта: #{parsescript 'test.js'/}
ярлык. Это должно идти в /views/tags/parsescript.tag
:
{
* insert a parsescript tag in the template.
* by convention, referred script must be put under /public/javascripts
* src (required) : script filename, without the leading path "/public/javascripts"
* id (opt.) : sets script id attribute
* charset (opt.) : sets source encoding - defaults to current response encoding
*
* #{parsescript id:'datepicker' , src:'ui/ui.datepicker.js', charset:'${_response_encoding}' /}
}*
%{
(_arg ) && (_src = _arg);
if (!_src) {
throw new play.exceptions.TagInternalException("src attribute cannot be empty for script tag");
}
_src = "/public/javascripts/" + _src
try {
_abs = play.mvc.Router.reverseWithCheck(_src, play.Play.getVirtualFile(_src), false);
} catch (Exception ex) {
throw new play.exceptions.TagInternalException("File not found: " + _src);
}
}%
<script type="text/javascript" language="javascript"#{if _id} id="${_id}"#{/if}#{if _charset} charset="${_charset}"#{/if} src="/parse${_abs}"></script>
Это работает точно так же #{script /}
Тег, но разбирается файл, прежде чем возвращать его: #{parsescript 'test.js' /}
Можно одинаково бесстыдно взломать #{stylesheet /}
Тег, но я думаю, что я уже взял достаточно места.