在您必须准备特殊文件之前,将 JS 值导出到 Opa 并标记特殊注释,例如:
##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 文件并理解 cmets 中的注释。和以前一样,您以完全相同的方式链接客户端 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)
虽然现在做简单的事情非常容易和快速,但要学习以下内容:
- 运行带有延续的 JS 函数,
- 在 JS 中使用 Opa 类型(可以使用自定义 Opa 记录吗?),
- 使用列表类型的参数(从 Opa 的
{hd,tl} or {nil} 到 JS 列表的转换是否像 Opa bool={true} or {false} 到 JS boolean 一样自动执行?),
- 运行 Opa 函数作为参数传递给 JS 函数,
需要一些试验。如果你能理解其中的一部分,写一些关于它的东西,因为我也会很高兴学习它:)