【发布时间】:2015-09-15 22:48:44
【问题描述】:
我正在为 Atom.io https://github.com/ensime/ensime-atom 做这个 Ensime 包,我一直在考虑使用 scala.js 而不是编写 Coffeescript 的可能性。
Atom 是一个基于 web 的编辑器,它使用 js 编写脚本并且基于 node.js。插件/包通过指出一个带有一些特定内容的 javascript 对象来定义它的主要入口点。
我想我应该从简单开始,尝试使用 scala.js 替换我拥有的最简单的咖啡脚本文件:
{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 用于 require dep,正如我在 SO How to invoke nodejs modules from 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
这是正确的方法吗?我需要做沙盒吗?我不能从全局获取moduleimported 并写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。当然。
高度赞赏的任何指针!
【问题讨论】:
-
嗨维克多,听起来你有两个不同的问题,对吧?我认为如果你将它们分成 SO 帖子,你得到答案的机会会更好。
标签: node.js requirejs atom-editor scala.js