如何在ReasonML中使用npm包?

20

我在ReactJS方面有相当丰富的经验,现在正在尝试学习ReasonML。但我一直难以理解的一个问题是如何在React/Reason中导入npm包。

网站上的说明对我来说有些不清楚 (https://reasonml.github.io/guide/javascript/interop/)。

那么,如果我有一个React/Reason项目,并想使用一个npm包,我该怎么做呢?如何使用Reason语言进行导入呢?

1个回答

26

首先,感谢反馈!我会确保改进这个问题。

现在,要使用在npm上发布的javascript库,您需要找到或创建一些绑定,作为Reason/BuckleScript和JavaScript之间的桥梁。理想情况下,您所需的绑定已经被编写(或生成)并发布到npm,但如果没有,您将不得不自己编写它们。

大多数可用的绑定都列在redex(包索引)中,并且将包括如何使用它的说明。但是,如果没有这样的说明,您只需要像往常一样运行npm install --save <package-name>,然后将包名称添加到bsconfig.json中的bs-dependencies数组中(请参见BuckleScript manual)。确保运行bsb -make-world以构建新的依赖项,然后您就可以直接使用绑定导出的模块了。

如果没有绑定,而你想自己创建绑定,那么你只需要像平常一样使用npm install --save <pacakge-name>添加javascript包,然后开始编写externals。如何操作在BuckleScript手册中有描述。您也可以找到我的FFI备忘单有用。
最后,欢迎加入我们的Discord社区,那里有很多友好的人愿意帮助!

1
需要在将包添加到“bs-dependencies”和使用“bsb -make-world”之间再添加一个明确的步骤。 - Yawar
FFI是我只在提到ReasonML时听说过的术语。它可能也是OCaml的东西,但我从未在Java、C#、JavaScript、Haskell或LISP中听说过它。那么为什么我一遍又一遍地看到Reason开发人员把FFI当作每个人都知道它的意思呢?你可以在https://reasonml.github.io/docs/en/external#docsNav上搜索它,但我认为如果我们使用更通用的术语,至少在SO答案中会更清晰。 - icc97
2
@icc97 你会建议哪些术语呢?我认为FFI是关于这个概念的最通用的术语。 "本地绑定"或"JavaScript互操作"可能更直观,但实际上这些术语更具体而不是更通用。 - glennsl
尽可能地保持通用/抽象并不是问题,我认为问题在于使用常见的术语。根据c2.com上的解释:这个术语来自CommonLisp,但适用于任何类似的接口。其他语言社区并不经常使用FFI这个术语。我建议“interop”是一个更常见的术语,例如这篇Reason博客标题中就有“interop”,然后在谈到FFI时使用完整的“Foreign Function Interface”。 - icc97
我想我从未听说过它的主要原因是我从未不得不从另一种语言调用任何C/C++代码,这似乎是最常见的FFI。即使在我看到例子时,例如在从C#调用C函数的问题中,问题或答案中也没有提到FFI。 - icc97
我记得的唯一一件事就是使用 extern 关键字。"从 Bucklescript 调用外部例程" 似乎是一个相对易懂的描述,希望不会失去太多的特定性。 - icc97

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接