所以我读了2012年1月12日关于如何将现有的javascript包作为插件包含在Opa中的文章:http://blog.opalang.org/2012/01/reusing-javascript-libraries-jquery-ui.html
然而,在OPA 1.1.0 it states on feb 12 2013的公告中:
“使用Opa 1.1.0,您现在可以包含JavaScript代码和Node.js 包装比以往更容易!我们很快就会写下来。“
所以我想包含一些Node.js软件包(一个SDK),质疑这个新的简单方法是什么?
答案 0 :(得分:0)
在您必须准备特殊文件之前,将JS值导出到Opa,并使用特殊注释标记:
##register value_name : type_of_arg1, type_of_arg2 -> void
##args(arg1, arg2)
{
run_someJS_code();
}
必须使用特殊工具将文件编译到包中,然后在%%Filename.value_name%%(x,y)
的Opa中使用。
现在使用Opa类型标记JS值并将其标记为导出到Opa是注释语法/** */
中的JS源文件。这些文件仍然是有效的JS文件,因此您可以就地更新现有的JS文件。它们也不需要特殊的工具来编译它们。标准Opa编译器接受JS文件作为任何其他Opa文件并理解注释中的注释。和以前一样,您以完全相同的方式链接客户端JS和服务器Node.js代码。
不幸的是,由于大多数高级Opa功能都没有很好的文档记录,您必须阅读标准库源才能学习它。像这样的基本功能:
bslLeaflet.js:
// These are the native JS "types" that will be available in Opa
/** @externType leaflet_map */
/**
* @register {string, float, float, int, bool, bool -> leaflet_map}
*/
function leafletMap(id, center_lat, center_lon, zoom, zoomControl, attributionControl) {
return L.map(id, {center:[center_lat, center_lon], zoom:zoom, zoomControl:zoomControl, attributionControl:attributionControl});
}
myMap.opa:
type leaflet_map = external
leaflet_map map = %%BslLeaflet.leafletMap%%("my_map_id", lat, lon, 14, true, true)
尽管现在非常简单快捷地完成简单的事情,但要学习以下内容:
{hd,tl} or {nil}
到自动执行的JS列表的翻译,如Opa bool={true} or {false}
到JS boolean
?),需要一些实验。如果你能理解其中的一些内容,请写一些关于它的内容,因为我也很乐意学习它:)
答案 1 :(得分:0)
花了一些时间来弄清楚Marcins questions中3个的答案,所以我将在这里分享:
在JS中使用Opa类型(你可以使用自定义Opa记录吗?)
/**
* @opaType Model.graph
*/
/**
* @register {Model.graph -> void}
*/
function render(g) { ... }
使用列表类型的参数(从Opa的{hd,tl}或{nil}转换到JS列表自动执行,如Opa bool = {true}或{false}到JS boolean?)
不,列表没有翻译(可能是因为性能?)。 opa列表的javascript表示:
{hd: {a: "1"}, tl: {hd: {a: "2"}, tl: {nil: {}}}}
运行Opa函数作为JS函数的参数传递
再次可能:
/**
* @register {string, (string -> void) -> void}
*/
function call_me_back(number, callback) {
callback(number);
}