首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在ReasonML绑定中包含来自相邻文件的非类型化-JavaScript?

如何在ReasonML绑定中包含来自相邻文件的非类型化-JavaScript?
EN

Stack Overflow用户
提问于 2019-01-14 22:57:39
回答 1查看 410关注 0票数 0

在一个JavaScript项目中,当我试图从理性开始的时候,我得到了一个非常轻的文件,它试图成为现有的、繁重的库的一个原因类型的接口:

代码语言:javascript
复制
/* TheLibrary.re */
type engine

external addEngine : string -> engine -> unit = "" [@@bs.val] [@@bs.module "../"]

但是,当我尝试在ReasonReact项目中使用该库时(已经将@org/the-library添加到bsconfig.json bs-dependencies中),

代码语言:javascript
复制
/* AComponent.re */
[@bs.val] [@bs.module "@org/game-engine/dist/game-engine.js"]
   external gameEngine : TheLibrary.engine = "default";

/* Further down, a React lifecycle method, */
TheLibrary.addEngine("Game", gameEngine);

我发现没有找到../的错误,相对于React组件

代码语言:javascript
复制
./src/components/main-menu/AComponent.re
Module not found: Can't resolve '../' in '/Users/ec/Work/reason-reacty/src/components/main-menu'

我也尝试过,而不是在TheLibrary.reexternal声明中使用external

  1. @bs.module "./index.js" (有关包的非类型化-JavaScript端的直接ES6入口点)
  2. @bs.module "@org/the-library",所述库的全名(即使我在该库中键入??)

请帮帮我!我希望能够进一步采用ML,但我正面临着最困难的时刻,那就是ReasonReact的依赖解决方案!

其他背景:

因此,我们正在尝试构建我们的第一个ReasonReact项目,我们已经成功地将婴儿的第一个不透明的类型添加到了我们的内部库中,并将其包含在ReasonReact页面中,包括以下内容--顺便说一句,这是可行的:

代码语言:javascript
复制
/* Imports.re */
type engine;

[@bs.val] [@bs.module "@org/game-engine/dist/game-engine.js"]
   external gameEngine : engine = "default";
[@bs.val] [@bs.module "@org/the-library"] [@bs.scope "default"]
   external addEngine : (string, engine) => unit = "";

当我们使用Imports.(addEngine("Game", gameEngine))时,这会产生我们需要的全局设置行:TheLibrary.addEngine("Game", GameEngine)。我正处于第一阶段,尝试向父项目上游输入信息,并将代码发布到npm,以便所有消费项目都能开始使用理性。

EN

回答 1

Stack Overflow用户

发布于 2019-01-14 23:52:05

听起来你可能对构成你的工具链的不同工具感到有点困惑,所以让我们先逐一看一遍,把它们放在它们的位置上:

  • ReasonReact是一个固执己见、“厚厚的”绑定到react.js的库,尽管它的名称实际上并不是所有特定的原因,但它与理性的JSX语法的集成除外。将其称为BuckleScript库将更为准确。
  • 理由主要是您使用的语法,但也经常用于更广泛地引用其周围的生态系统,并且通常也意味着正在使用BuckleScript。
  • OCaml是底层语言。理性的“语义”,如果你愿意的话。
  • BuckleScript是OCaml到JavaScript编译器.它将一个被认为是模块的源文件编译成一个JavaScript模块,但也需要其他OCaml模块的类型信息作为输入。

现在,我怀疑您已经知道了其中的大部分内容,但是您似乎不知道的是,这些都没有真正解决依赖关系的问题。您的工具链的下面这些部分是这样做的:

  • BuckleScript Build System,又称bsb,是根据您在src中指定的内容以及在bs-dependecies in bsconfig.json中列出的任何BuckleScript库在本地项目中查找所有模块的内容。它将计算出所有这些模块的依赖顺序,并按照正确的顺序将它们提供给编译器,以便为每个OCaml模块生成一个OCaml模块(以及包含类型信息等的其他伪)。但它不会解决任何JavaScript依赖关系。
  • 最后,webpack或其他一些JavaScript bundler可能用于将所有JavaScript模块组合到一个文件中,因此需要解决任何JavaScript依赖关系。这很可能是错误信息的来源。

使用[@bs.module "some-module"]将使BuckleScript编译器发出var ... = require('some-module') (如果使用es6,则会发出import ... from 'some-module' ),但是BuckleScript本身不会对它做任何事情。传递给@bs.module的字符串与传递给require的字符串相同,如果它是一个普通的CommonJS模块(或您配置的其他模块格式)。

还请注意,导入不是在定义external的地方发出的,而是在使用它的地方发出的。您可以通过将它作为一个普通定义再导出,或者在模块中“接地”它。let addEngine = addEngine

为了准确地回答您的问题,我需要知道您使用哪个绑定器,在哪里配置了BuckleScript以输出其JavaScript伪制品,在哪里使用了外部元素,而不仅仅是定义了外部包,以及外部JavaScript模块位于何处。但我希望所有这些潜在的知识将使您和未来的读者更容易识别和解决问题。如果您仍然有些不确定,请查看已编译的JavaScript人工制品,并将它们作为普通的JavaScript模块来处理。在这一点上,这就是他们真正的全部。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54190447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档