了解 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);
指定它是一个从string
到queryString
的函数,而[@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 系统。试图一次理解所有内容会导致学习曲线非常陡峭,并且会大大增加小误解的成本,因为它们往往会累积。
只是想大致了解这里发生的事情。将 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);
指定它是一个从string
到queryString
的函数,而[@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 系统。试图一次理解所有内容会导致学习曲线非常陡峭,并且会大大增加小误解的成本,因为它们往往会累积。