Статьи

Попытка заставить CoffeeScript работать с Scalate and Play

Несколько недель назад я писал об интеграции 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 в своем приложении:

  1. Вернитесь к более старой версии Scalate, в которой используется встроенный в браузер компилятор CoffeeScript.
  2. Попытайтесь получить новую версию, которая исправляет ошибку комментария, и используйте встроенный CoffeeScript.
  3. Продолжайте пытаться выяснить, как получить внешние файлы, скомпилированные 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