OPA如何重用Javascript和Node.js包

时间:2013-08-16 11:06:24

标签: node.js opa

所以我读了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),质疑这个新的简单方法是什么?

2 个答案:

答案 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)

尽管现在非常简单快捷地完成简单的事情,但要学习以下内容:

  • 使用continuation运行JS函数,
  • 在JS中使用Opa类型(你可以使用自定义Opa记录吗?),
  • 使用列表类型的参数(从Opa的{hd,tl} or {nil}到自动执行的JS列表的翻译,如Opa bool={true} or {false}到JS boolean?),
  • 运行Opa函数作为参数传递给JS函数,

需要一些实验。如果你能理解其中的一些内容,请写一些关于它的内容,因为我也很乐意学习它:)

答案 1 :(得分:0)

花了一些时间来弄清楚Marcins questions中3个的答案,所以我将在这里分享:

  •   

    在JS中使用Opa类型(你可以使用自定义Opa记录吗?)

是的,这是可能的。使用“@opaType”。假设您在某个opa文件中定义了 Model.graph

/**
 * @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);
}