0

所以我阅读了 2012 年 1 月 12 日关于如何将现有 javascript 包作为插件包含在 Opa 中的文章:http: //blog.opalang.org/2012/01/reusing-javascript-libraries-jquery-ui.html

然而,在OPA 1.1.0 的公告中,它在 2013 年 2 月 12 日声明

“使用 Opa 1.1.0,您现在可以比以往更轻松地包含 JavaScript 代码和 Node.js 包!我们很快就会写到它。”

所以我想包括一些 Node.js 包(一个 SDK),请问新的简单方法是什么?

4

2 回答 2

0

在您必须准备带有导出到 Opa 的 JS 值的特殊文件之前,该文件带有特殊注释,例如:

##register value_name : type_of_arg1, type_of_arg2 -> void
##args(arg1, arg2)
{
  run_someJS_code();
}

该文件必须使用特殊工具编译到包中,然后在 Opa 中使用%%Filename.value_name%%(x,y).

现在用 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});
}

我的地图.opa:

type leaflet_map = external
leaflet_map map = %%BslLeaflet.leafletMap%%("my_map_id", lat, lon, 14, true, true)

尽管现在做简单的事情非常容易和快速,但要学习以下内容:

  • 继续运行 JS 函数,
  • 在 JS 中使用 Opa 类型(你可以使用自定义 Opa 记录吗?),
  • 使用列表类型的参数(从 Opa{hd,tl} or {nil}到 JS 列表的转换是否像 Opabool={true} or {false}到 JS一样自动执行boolean?),
  • 运行作为参数传递给 JS 函数的 Opa 函数,

需要一些实验。如果你能理解其中的一些,写一些关于它的东西,因为我也会很高兴学习它:)

于 2013-08-16T15:34:15.170 回答
0

我花了一些时间来找出Marcins 的 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 布尔值一样自动执行?)

不,列表没有翻译(可能是因为性能?)。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);
}
于 2015-08-07T09:00:26.753 回答