【问题标题】:OPA how to reuse Javascript and Node.js packagesOPA 如何重用 Javascript 和 Node.js 包
【发布时间】:2015-08-07 17:00:26
【问题描述】:

所以我阅读了 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),请问有什么新的简单方法可以做到这一点?

【问题讨论】:

    标签: node.js opa


    【解决方案1】:

    在您必须准备特殊文件之前,将 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 函数,

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

    【讨论】:

    • 谢谢。可能还有很多问题,在我回答之前。已经创建了一个博客wouterzanen.tumblr.com。分享我的经验。
    【解决方案2】:

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

    不,列表没有翻译(可能是因为性能?)。 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);
    }
    

    【讨论】:

    • 第二点(在 JS 中使用 Opa 列表),Opa 提供了一些在 Opa 列表和 JS 数组之间转换的小实用函数:list2js、js2list 以及类似的用于在 option('a) 和JS 可空值:option2js 和 js2option.
    猜你喜欢
    • 2012-06-11
    • 2012-05-06
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    • 2016-12-15
    • 1970-01-01
    相关资源
    最近更新 更多