Несколько недель назад я писал об интеграции Scalate с Play .
Следующим шагом в моем приключении Play Scala будет попытка заставить работать модуль CoffeeScript . Я также надеюсь интегрировать HTML5 Boilerplate с макетами Jade и Scalate .
Со времени моего последнего написания команда Scalate создала новую ветку для Scala 2.8.x (которая совместима с Play) и выпустила 1.5.2 . Чтобы обновить приложение Play для использования этой версии, я изменил свой файл dependencies.yml, чтобы он имел следующее:
- org.fusesource.scalate -> scalate-core 1.5.2-scala_2.8.1: transitive: false - org.fusesource.scalate -> scalate-util 1.5.2-scala_2.8.1: transitive: false
К сожалению, этот выпуск нарушает поддержку CoffeeScript в Scalate, потому что он оборачивает код незаконными комментариями . Это было исправлено в последнем снимке, но новый выпуск не был вырезан. Однако, даже если это сработало, это не совсем то, что я ищу. Релиз 1.5.2 позволяет компилировать встроенный CoffeeScript на лету, но я бы предпочел хранить мои файлы .coffee вне страницы.
Чтобы попытаться выяснить, как это сделать, я отправил в Scalate Google Group сообщение с вопросом, позволяет ли Scalate ссылаться (и компилировать) файлы CoffeeScript, такие как плагин для Play? Моя электронная почта побудила команду Scalate сделать некоторые модификации, которые, казалось, делали именно то, что я искал.
FWIW Я только что проверил несколько примеров coffeescript. Чтобы запустить его, захватите код и выполните локальную сборку …
http://scalate.fusesource.org/source.html
http://scalate.fusesource.org/building.html, а
затем запустите этот …
cd samples/scalate-example mvn jetty:run
затем откройте
http: // localhost: 8080 / coffee / index,
есть 2 примера файлов jade, в которых используется встроенный кофе или отдельный файл кофе (с использованием расширения .js в атрибуте <script src>
https://github.com/scalate / scalate / tree / master / samples / scalate-exampl …
например, здесь файл jade ссылается на отдельный файл .js для сценария кофе, который на сервере преобразуется в формат .js …
https://github.com/ scalate / scalate / BLOB / Master / образцы / scalate-exampl …
Чтобы опробовать улучшенную поддержку CoffeeScript, я проверил источник и немного покопался в ветвях Git, прежде чем получил последнюю версию Scalate для сборки. К сожалению, это не сработало, потому что Play не знает, как обрабатывать файлы .js и .css.
@67o8fflce Application.foo.js action not found Action not found Action Application.foo.js could not be found. Error raised is Controller controllers.Application.foo not found play.exceptions.ActionNotFoundException: Action Application.foo.js not found at play.mvc.ActionInvoker.getActionMethod(ActionInvoker.java: 588) at play.mvc.ActionInvoker.resolve(ActionInvoker.java:85) at Invocation.HTTP Request(Play!) Caused by: java.lang.Exception: Controller controllers.Application.foo not found ... 3 more 08:20:21,133 ERROR ~
Основываясь на этой ошибке, я предположил, что мне нужен контроллер, чтобы получать запросы .js и .css и компилировать их соответственно с помощью Scalate. Я изменил свой шаблон Jade, чтобы иметь следующее:
script(src="/assets/foo.js" type="text/javascript")
Затем я добавил новый маршрут в свое приложение Play:
GET / Application.index GET /assets/{template} ScalateResource.process
Мой класс ScalateResource.scala выглядит следующим образом:
package controllers import play.mvc._ object ScalateResource extends Controller { def process(args: (Symbol, Any)*) = { var template = params.get("template") // replace .js with .coffee template = template.replace(".js", ".coffee") // replace .css with .scss template = template.replace(".css", ".scss") ScalateTemplate(template).render(); } }
К сожалению, когда я попытался получить доступ к http: // localhost: 9000 / assets / foo.js, я получил следующую ошибку:
Произошло исключение TemplateException: не расширение файла шаблона (md | markdown | ssp | scaml | mustache | jade), вы запросили: coffee
На данный момент я до сих пор не понял, как решить эту проблему . Я могу только предположить, что причина, по которой это работает в примере приложения, заключается в том, что он использует TemplateEngineFilter, который сопоставлен с / *.
На мой взгляд, у меня есть несколько вариантов, если я хочу продолжить использовать CoffeeScript и Scalate в своем приложении:
- Вернитесь к более старой версии Scalate, в которой используется встроенный в браузер компилятор CoffeeScript.
- Попытайтесь получить новую версию, которая исправляет ошибку комментария, и используйте встроенный CoffeeScript.
- Продолжайте пытаться выяснить, как получить внешние файлы, скомпилированные Scalate.
Очевидно, я хотел бы сделать № 3 больше всего, но с отсутствием ответов от группы Scalate, это кажется самым сложным. Поскольку # 1 является самым простым (и я могу выполнить без чьей-либо помощи), я сейчас пойду по этому пути. Если повезет, второе и третье решения появятся как варианты перед моим выступлением в ноябре.
Обновление 4 октября 2011: я смог заставить работать внешние файлы CoffeeScript! Это было довольно просто на самом деле. Я просто снова попробовал модуль Play CoffeeScript , используя помощник Scalate {uri («/ path»)}. Например, в шаблоне Jade:
script(type="text/javascript" src={uri("/public/javascripts/script.coffee")})
Это компилирует файл CoffeeScript на сервере и возвращает JavaScript. Милая!
С http://raibledesigns.com/rd/entry/tring_to_make_coffeescript_work