2017-04-18 19 views
0

如果我想將某些ScalaJS方法導出爲CommonJS模塊,應該怎麼做?我有以下的,但它似乎並沒有工作:無法在ScalaJS中編寫CommonJS模塊,該模塊在Atom編輯器中作爲插件獲取「導入」

@ScalaJSDefined 
@JSExportTopLevel("default") 
object SourceFetch extends js.Object { 
    def activate(state: js.Dynamic): Unit = { 
    global.console.log("activate") 
    } 
    def deactivate(): Unit = { 
    global.console.log("deactivate") 
    } 
} 

是的,scalaJSModuleKind:= ModuleKind.CommonJSModule在build.sbt。

我想作爲輸出是一個commonjs模塊,看起來像這樣;

export default { 
    activate(state) { 
    console.log("activate"); 
    }. 
    deactivate() { 
    console.log("deactivate"); 
    } 
}; 

我最終什麼事做的是使用已棄用SBT鍵「scalaJSOutputWrapper」並追加「module.exports =出口[‘默認’];」在輸出JS文件的末尾。

我確實嘗試過「scalaJSUseMainModuleInitializer」,但我只能得到「module.exports」而非「exports」的值,而「module.exports」的值未定義。

回答

1

上面的代碼段確實對應於您編寫的ECMAScript 2015代碼片段。但是,這不會將方法導出爲模塊的直接成員,而是作爲default對象的成員。不,default導出與模塊本身不一樣(儘管很多人都這麼認爲)。

的職能導出爲模塊的直接會員,你應該寫:

object SourceFetch { 
    @JSExportTopLevel("activate") 
    def activate(state: js.Dynamic): Unit = { 
    global.console.log("activate") 
    } 
    @JSExportTopLevel("deactivate") 
    def deactivate(): Unit = { 
    global.console.log("deactivate") 
    } 
} 
+0

漂亮,就像一個魅力!這可能需要記錄在某個地方。 –