了解 ReasonML/Bucklescript 外部因素

Understanding ReasonML/Bucklescript Externals

只是想大致了解这里发生的事情。将 ReasonApolloTypes.gql 作为使用外部变量的示例进行解释是否有意义。

这是bs.module代码

[@bs.module] external gql : ReasonApolloTypes.gql = "graphql-tag";

bs.module 告诉 buckelscript 我们要使用 FFI。

external 告诉 bs 我们要使用的 FII 的名称,我们将其值设置为 ReasonApolloTypes.gql 这是我们在添加 reason 时安装的全局可用的 Reason 模块-apollo 在 bsconfig 的 bs-dependencies 数组中,并添加到 package.json。如果您打开 node_modules/reason-apollo/src,您将看到已定义的 Reason 模块,这些模块与其他模块一样在全球范围内可用。

ReasonApolloTypes.re 列在那里并包含一个名为 gql 的已定义类型。所以 ReasonApolloType.gql 是我们使用 external gql 访问的命名模块。在 ReasonApolloType.gql 中有一个定义的类型,type gql = [@bs] (string => queryString);。这告诉 bucklescript 给gql类型赋值string,给querystring赋值,所以type querystring是string类型。然后设置ReasonApolloTypes.gql使用"graphql-tag"节点库解析ReasonApolloTypes.gql。

我是不是漏掉了一个概念?这表达正确吗? Bucklescript/Reason 文档此时超出了我对外部的理解。谢谢。

这个问题在 SO 上确实不太合适(参见 what's on-topic here),也许应该在 Discord 上提问。但这就是它的意思:

  • external 告诉编译器我们正在定义 "external" 的东西,即。我们想使用 FFI。

  • [@bs.module] 告诉 BuckleScript 我们引用的是一个模块,它需要在使用时发出 require 调用。

  • gql 是我们将在 Reason 方面用来引用它的名称。

  • : 表示我们正在指定外部的类型。 ReasonApolloTypes.gql 是在 ReasonApolloTypes 模块中定义的类型。

  • = "graphql-tag" 告诉编译器我们引用的内容在 JavaScript 一侧被命名为 graphql-tag

另外,type gql = [@bs] (string => queryString);指定它是一个从stringqueryString的函数,而[@bs]表示调用这个函数时应该使用非柯里化调用约定。

因此,在 ML 方面,gql 是一个接受 string 和 returns 和 queryString 的函数。调用时:

let qs = [@bs] gql("some string"); /* [@bs] because it's uncurried */

BuckleScript 将生成如下内容:

var qs = require("graphql-tag")("some string");

PS:一般来说,我建议您从更简单的东西开始尝试理解 FFI 系统。试图一次理解所有内容会导致学习曲线非常陡峭,并且会大大增加小误解的成本,因为它们往往会累积。