Я делаю этот пакет Ensime для Atom.io https://github.com/ensime/ensime-atom и я думал о возможности использовать scala.js вместо написания Coffeescript.
Atom — это веб-редактор, написанный с помощью js и основанный на node.js. Плагин/пакет определяет свою основную точку входа, указывая объект javascript с несколькими специфическими параметрами.
Я решил, что должен начать с простого и попробовать использовать scala.js, заменив самый простой файл coffeescript, который у меня есть:
{View} = require 'atom-space-pen-views'
# View for the little status messages down there where messages from Ensime server can be shown
module.exports =
class StatusbarView extends View
@content: ->
@div class: 'ensime-status inline-block'
initialize: ->
serialize: ->
init: ->
@attach()
attach: =>
statusbar = document.querySelector('status-bar')
statusbar?.addLeftTile {item: this}
setText: (text) =>
@text("Ensime: #{text}").show()
destroy: ->
@detach()
Как видите, это экспортирует модуль require.js и является классом, расширяющим класс, полученный с помощью require.
Тааак.
Я думаю, что просто использовал бы Dynamic для требуемой зависимости, как я видел на SO Как вызывать модули nodejs из scala.js?:
import js.Dynamic.{global => g}
import js.DynamicImplicits._
private[views] object SpacePen {
private val spacePenViews = require("atom-space-pen-views")
val view = spacePenViews.view
}
Но если бы я хотел ввести суперкласс, мог бы я просто создать фасадную черту и сделать asInstanceOf?
Во-вторых, мне интересно, как я могу экспортировать свой класс как модуль узла. Я нашел это:
https://github.com/rockymadden/scala-node/blob/master/main/src/main/coffeescript/example.coffee
Это правильный путь? Нужно ли делать песочницу? Нельзя ли просто получить module
imported из глобального и написать module.exports = _some_scala_object_
?
Мне также интересно, как я могу расширить существующие классы js. Та же проблема, что и здесь, но я не очень понимаю ответ:
https://groups.google.com/forum/#!topic/scala-js/l0gSOSiqubs
My code so far:
private[views] object SpacePen {
private val spacePenViews = js.Dynamic.global.require("atom-space-pen-views")
type View = spacePenViews.view
}
class StatusBarView extends SpacePen.View {
override def content =
super.div()
}
дает мне ошибки компиляции, из-за которых я не могу расширить запечатанную черту Dynamic. Конечно.
Любые указатели высоко ценятся!