Node.js 如何在scala.js(和扩展类)中提供和使用require.js模块

Node.js 如何在scala.js(和扩展类)中提供和使用require.js模块,node.js,requirejs,atom-editor,scala.js,Node.js,Requirejs,Atom Editor,Scala.js,我正在为Atom.io编写这个Ensime包,我一直在考虑使用scala.js而不是编写Coffeescript的可能性 Atom是一个基于web的编辑器,使用js编写脚本,并且基于node.js。一个插件/包通过指出一个javascript对象和一些特定的属性来定义它的主要入口点 我想我应该从简单开始,尝试使用scala.js替换我拥有的最简单的coffeescript文件: {View}=需要“atom空间笔视图” #查看下面的小状态消息,其中可以显示来自Ensime服务器的消息 模块.出口

我正在为Atom.io编写这个Ensime包,我一直在考虑使用scala.js而不是编写Coffeescript的可能性

Atom是一个基于web的编辑器,使用js编写脚本,并且基于node.js。一个插件/包通过指出一个javascript对象和一些特定的属性来定义它的主要入口点

我想我应该从简单开始,尝试使用scala.js替换我拥有的最简单的coffeescript文件:

{View}=需要“atom空间笔视图”
#查看下面的小状态消息,其中可以显示来自Ensime服务器的消息
模块.出口=
类StatusbarView扩展了视图
@内容:->
@div类:“ensime状态内联块”
初始化:->
序列化:->
初始化:->
@附()
附加:=>
statusbar=document.querySelector('status-bar')
statusbar?.addLeftTile{item:this}
setText:(文本)=>
@text(“Ensime:#{text}”).show()
销毁:->
@分离()
如您所见,它导出了require.js模块,并且是一个扩展了使用require获取的类的类

苏欧

我想我应该使用Dynamic作为require dep,正如我在上所看到的:

import js.Dynamic.{global=>g}
导入js.dynamicmplicits_
私有[视图]对象SpacePen{
private val spacepenview=require(“原子空间笔视图”)
val view=spacepenview.view
}
但是如果我想输入超级类,我能做一个facade特征并做一个instanceof吗

其次,我想知道如何将类导出为节点模块。我发现:

这条路对吗?我需要做沙箱吗?难道我不能从全局导入
module
并写入
module.exports=\u一些\u scala\u对象吗

我还想知道如何扩展现有的js类。这个问题和这里问的一样,但我不太明白答案:

private[views]对象空格笔{
private val spacepenview=js.Dynamic.global.require(“atom空间笔视图”)
类型视图=spacePenViews.View
}
类StatusBarView扩展了SpacePen.View{
覆盖def内容=
super.div()
}
给我无法扩展的编译错误。当然


非常感谢任何指点

我不是节点本身的专家,但要回答您的第一个问题,是的——如果您有一个指向JS对象的指针,并且您知道其类型的详细信息,那么您几乎总是可以定义一个facade特性和一个instanceof来使用它。这应该行得通

至于最后一点,您基本上无法在Scala.JS中扩展JS类——这根本不起作用。我们大多数人解决这个问题的方法是定义隐式类,或者使用隐式定义,以获得扩展的外观,而不实际这样做

例如,给定JS类Foo,我可以编写

隐式类RichFoo(foo:foo){
def method1()={…}
}
这实际上是一个围绕Foo的包装器,但是调用代码可以简单地调用Foo.method1(),而不必担心这个细节


您可以在中看到这种方法的实际应用,特别是在(纯外观)(JQuery上的一些经过调整的方法使其在Scala中工作得更好)和(围绕JQuery构建的一些更高级别的函数)之间的关系中。使用
package.scala
中的隐式def将它们连接在一起。就调用代码而言,所有这些看起来都像是JQuery上的方法。

嗨,维克托,听起来你有两个不同的问题,对吗?我认为如果你把他们分成几个帖子,你得到回复的机会会更好。自从我昨天回答了这个问题,事情有了一些新的进展:有。请记住,这只是现阶段的一个建议,但现在它特别需要评论。因此,虽然目前无法做到这一点,但将来可能会做到。
My code so far: