Как включить нетипизированный JavaScript из соседнего файла в привязки ReasonML? - PullRequest
0 голосов
/ 15 января 2019

При попытке начать работу с Reason в одном проекте JavaScript у меня есть чрезвычайно легкий файл, который пытается быть интерфейсом типа Reason для существующей, тяжелой библиотеки:

/* TheLibrary.re */
type engine

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

Однако, когда я пытаюсь использовать эту библиотеку в проекте ReasonReact (добавив @org/the-library к bsconfig.json bs-dependencies),

/* 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 :

./src/components/main-menu/AComponent.re
Module not found: Can't resolve '../' in '/Users/ec/Work/reason-reacty/src/components/main-menu'

Я также попытался вместо ../ в TheLibrary.re external объявлении:

  1. @bs.module "./index.js" (прямая точка входа ES6 для нетипизированной части JavaScript рассматриваемого пакета)
  2. @bs.module "@org/the-library", полное название указанной библиотеки (хотя я набираю внутри этой библиотеки ???)

Пожалуйста, помогите! Мне бы очень хотелось иметь возможность в дальнейшем использовать ML, но мне труднее всего сосредоточиться на разрешении зависимостей ReasonReact!


Дополнительный контекст:

Итак, мы пытаемся создать наш первый проект ReasonReact, и мы успешно добавили baby-first-opaque-types в одну из наших внутренних библиотек и добавили его на страницу ReasonReact с помощью чего-то вроде следующего - который работает , кстати:

/* 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, чтобы все проекты-потребители могли начать использовать Reason.

1 Ответ

0 голосов
/ 15 января 2019

t звучит так, как будто вы немного озадачены различными инструментами, составляющими вашу цепочку инструментов, поэтому давайте сначала пройдемся по ним один за другим, чтобы поставить их на место:

  • ReasonReact - это библиотека упрямых, «толстых» привязок к response.js, которая, несмотря на название, на самом деле не совсем специфична для Reason, за исключением ее интеграции с синтаксисом JSX Reason. , Было бы точнее назвать это библиотекой BuckleScript.

  • Причина - это в основном только тот синтаксис, который вы используете, но он также часто используется более широко для обозначения экосистемы вокруг него и, как правило, также подразумевает, что используется BuckleScript.

  • OCaml является базовым языком. «Семантика» Разума, если хотите.

  • BuckleScript - это компилятор OCaml-to-JavaScript. Он компилирует ОДИН исходный файл, который считается модулем, в ОДИН модуль JavaScript, но также требует ввода информации о типе других модулей OCaml.

Теперь, я подозреваю, что вы уже знаете большую часть этого, но то, что вы, кажется, не знаете, это то, что НИКОГДА из них на самом деле не ЛЮБОЕ разрешение проблем. Следующие части вашей цепочки инструментов вот что:

  • Система сборки BuckleScript , или bsb , - это то, что находит все модули в вашем локальном проекте в соответствии с тем, что вы указали в src, и любым BuckleScript. библиотеки, которые вы перечислили в bs-dependecies в bsconfig.json. Он выяснит порядок всех этих зависимостей и передаст их компилятору в правильном порядке, чтобы создать один модуль JavaScript для каждого модуля OCaml (вместе с некоторыми другими артефактами, содержащими информацию о типе и тому подобное). Но это не разрешит никаких зависимостей JavaScript.

  • Наконец, webpack или какой-либо другой JavaScript bundler - это то, что вы, вероятно, используете для объединения всех модулей JavaScript в один файл, и поэтому его необходимо решить любые зависимости JavaScript. И это, вероятно, откуда приходит сообщение об ошибке.

Использование [@bs.module "some-module"] заставит компилятор BuckleScript выдавать var ... = require('some-module') (или import ... from 'some-module', если используется es6), но сам BuckleScript больше с ним ничего не сделает. Строка, которую вы передаете @bs.module - это та же строка, которую вы передаете require, если бы это был обычный модуль CommonJS (или любой другой формат модуля, который вы настроили).

Также обратите внимание, что импорт создается не там, где определен external, а в том месте, где он используется. Вы можете обойти или «заземлить» его в модуле, реэкспортируя его как обычное определение, т.е. let addEngine = addEngine.

Чтобы точно ответить на ваш вопрос, мне нужно знать, какой пакет вы используете, где вы сконфигурировали BuckleScript для вывода его артефактов JavaScript, где используются внешние, а не только определенные, и где расположен внешний модуль JavaScript , Но я надеюсь, что все эти базовые знания помогут вам и будущим читателям определить и решить проблему самостоятельно. Если вы все еще не уверены, посмотрите на скомпилированные артефакты JavaScript и просто рассматривайте их как обычные модули JavaScript. На данный момент это действительно все, что они есть.

...