试着大致了解这里发生了什么。将ReasonApolloTypes.gql解释为使用Externals的示例是否有意义。
这是bs.module代码
[@bs.module] external gql : ReasonApolloTypes.gql = "graphql-tag";
bs.module告诉buckelscript我们想要使用FFI。
external
告诉bs
我们想要使用的FII的名称,我们将其值设置为ReasonApolloTypes.gql,这是我们在bsconfig中添加reason-apollo时安装的全局可用Reason模块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类型并将值赋给querystring,因此type querystring
的类型为string。然后设置ReasonApolloTypes.gql以使用“graphql-tag”节点库来解析ReasonApolloTypes.gql。
我在这里错过了一个概念吗?这表达正确吗?在这一点上,Bucklescript / Reason文档在我的头上是外部的。感谢。
答案 0 :(得分:3)
这个问题在SO上真的不太合适(见what's on-topic here),也许应该在Discord上提出。但这就是它的含义:
external
告诉编译器我们正在定义一些东西"外部",即。我们想要使用FFI。
[@bs.module]
告诉BuckleScript我们引用的是一个模块,并且在使用它时需要发出require
个电话。
gql
是我们在原因方面用来引用它的名称。
:
表示我们正在指定外部的类型。 ReasonApolloTypes.gql
是ReasonApolloTypes
模块中定义的类型。
= "graphql-tag"
告诉编译器我们引用的内容在JavaScript端名为graphql-tag
。
此外,type gql = [@bs] (string => queryString);
指定它是从string
到queryString
的函数,而[@bs]
表示在调用此函数时它应该使用未经调用的调用约定。
因此,在ML方面,gql
是一个函数,它接受string
并返回queryString
。被叫时:
let qs = [@bs] gql("some string"); /* [@bs] because it's uncurried */
BuckleScript将生成如下内容:
var qs = require("graphql-tag")("some string");
PS:总的来说,我建议你从简单的事情开始,尝试理解FFI系统。试图立即理解一切会导致学习曲线非常陡峭,并且会大大增加小误解的成本,因为它们往往会积累。